需求:服务器系统自带Docker,没有包管理,传统的部署方式不太合适,遂选择Docker,此项目只需单机部署
解释:LaravelS是Laravel的加速方案,属于常驻内存应用
实现:
- 编写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"]
- 构建Docker镜像
docker build -t="danton/laravels" .
- 跑一下试试
docker run --name=laravels -p 9501:9501 b5be4f182d32
- 请求一下http://127.0.0.1:9501 ,没问题的话就可以push镜像到远程的镜像仓库了,比如阿里云或Docker Hub等等,服务器那边把镜像pull下来,类似步骤3跑起来就ok,当然run命令参数很多,根据需要自行设置
思考:
- 需要改进的地方
- 创建新的用户组和用户,指定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
- 一些自动化的部署方式,通常包括代码规范校验,CI,CD,举一下在职公司的例子
- PHP使用Jenkins,部署过程基本是执行Shell脚本,因为全面转Java所以未容器化
- Java使用阿里云云效,自定义发布流水线,选择集成代码分支、代码检查、构建镜像、镜像滚动升级,对开发来说只需运行即可