构建LaravelS运行环境的Docker镜像

23-02-26 23:54 字数 2808 阅读 1156 已编辑

需求:服务器系统自带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使用阿里云云效,自定义发布流水线,选择集成代码分支、代码检查、构建镜像、镜像滚动升级,对开发来说只需运行即可
1人点赞>
关注 收藏 改进 举报
0 条评论
排序方式 时间 投票
快来抢占一楼吧
请登录后发表评论