构建LaravelS运行环境的Docker镜像

需求:服务器系统自带Docker,没有包管理,传统的部署方式不太合适,遂选择Docker,此项目只需单机部署

解释:LaravelS是Laravel的加速方案,属于常驻内存应用

实现:

  1. 编写Dockerfile
FROM php:7.2-cli
LABEL maintainer="Danton" version="1.0" license="MIT"

##
# ---------- env settings ----------
##
# --build-arg timezone=Asia/Shanghai
ARG timezone

ENV TIMEZONE=${timezone:-"Asia/Shanghai"} \
    COMPOSER_VERSION=1.8.6 \
    APP_ENV=prod

# install extension
RUN apt-get update \
    && docker-php-ext-install pcntl \
    && docker-php-ext-install bcmath \
    && apt-get install -y \
      libfreetype6-dev \
      libjpeg62-turbo-dev \
      libpng-dev \
    && docker-php-ext-install -j$(nproc) gd \
    && pecl install swoole-4.8.9 \
    && pecl install redis \
	&& docker-php-ext-enable swoole redis

# update
RUN set -ex \
    # install composer
    && cd /tmp \
    && curl -fsSL https://github.com/composer/composer/releases/download/${COMPOSER_VERSION}/composer.phar -o composer.phar \
    && chmod u+x composer.phar \
    && mv composer.phar /usr/local/bin/composer \
    # show php version and extensions
    && php -v \
    && php -m \
    # ---------- clear works ----------
    && rm -rf /tmp/* \
    && echo -e "\033[42;37m Build Completed :).\033[0m\n"

# install supervisor
RUN apt-get install -y supervisor
RUN mkdir -p /var/log/supervisor
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf

COPY . /opt/www

WORKDIR /opt/www

RUN composer install \
    && composer dump-autoload -o

EXPOSE 9501

CMD ["/usr/bin/supervisord"]

  1. 构建Docker镜像
docker build -t="danton/laravels" .
  1. 跑一下试试
docker run --name=laravels -p 9501:9501 b5be4f182d32
  1. 请求一下http://127.0.0.1:9501 ,没问题的话就可以push镜像到远程的镜像仓库了,比如阿里云或Docker Hub等等,服务器那边把镜像pull下来,类似步骤3跑起来就ok,当然run命令参数很多,根据需要自行设置

思考:

  1. 需要改进的地方
  • 创建新的用户组和用户,指定composer,supervisor等用户
  • supervisor可以构建单独的容器,放在应用容器内使镜像体积更大,这里贴一下上面的supervisord.conf
# supervisor配置
[supervisord]
nodaemon=true
[supervisorctl]
[inet_http_server]
port = 127.0.0.1:9001
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
# LaravelS应用启动
[program:laravel-s]
directory=/opt/www
command=php bin/laravels start -i
numprocs=1
autostart=true
autorestart=true
startretries=3
redirect_stderr=true
stdout_logfile=/var/log/supervisor/%(program_name)s.log
# Laravel redis队列启动
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
directory=/opt/www
command=php artisan queue:work sqs --sleep=3 --tries=3
autostart=true
autorestart=true
numprocs=2
redirect_stderr=true
stdout_logfile=/var/log/%(program_name)s.log
  1. 一些自动化的部署方式,通常包括代码规范校验,CI,CD,举一下在职公司的例子
  • PHP使用Jenkins,部署过程基本是执行Shell脚本,因为全面转Java所以未容器化
  • Java使用阿里云云效,自定义发布流水线,选择集成代码分支、代码检查、构建镜像、镜像滚动升级,对开发来说只需运行即可