Laravel是目前最流行的PHP框架,特点是开发速度快,当然部署也麻烦。
传统部署流程:
- Composer安装依赖
- 使用Apache/Nginx进行部署Laravel的Web接口
- 使用Supervisor作为Laravel队列服务的进程守护
- 设置crontab定期执行Laravel的定时任务
看起来,每次部署Laravel还是挺麻烦的,有了Docker后,我们可以使用Docker的特性来集成基本的部署操作,并且由于容器的特性,还可以使得应用跑的时候更加安全。
使用Apache打包基础镜像
这里我们使用的基础镜像为: php:7.1-apache
,之后可以使用docker-php-ext-install
安装我们需要的PHP扩展。
完整的Apache基础镜像Dockerfile参见Github.
使用Composer安装依赖
# 拷贝代码到html目录
COPY . /var/www/html
# 安装Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# 安装依赖
ONBUILD RUN cd /var/www/html && composer install --no-scripts
用Supervisor跑Queue,Crontab以及Web
与传统部署方式不同的是,Docker有入口点的概念,当入口点改为Supervisor后,作为Web的apache将不会启动,所以,这里我们也需要用Supervisor以及cronjob.
使用bash来模拟cronjob:
#!/usr/bin/env bash
# Run scheduler
while [ true ]
do
php /var/www/html/artisan schedule:run --verbose --no-interaction
sleep 60
done
完成的Supervisor配置参见Github.
在Docker里安装Supervisor:
# Install Supervisor.
RUN \
apt-get update && \
apt-get install -y supervisor git && \
rm -rf /var/lib/apt/lists/* && \
sed -i 's/^\(\[supervisord\]\)$/\1\nnodaemon=true/' /etc/supervisor/supervisord.conf
# Define working directory.
WORKDIR /etc/supervisor/conf.d
RUN mkdir -p /var/log/supervisor && mkdir -p /etc/supervisor
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
VOLUME /var/log/supervisor
入口点修改
首先, 打包的时候,进行Laravel的cache以提高性能。
php artisan route:cache && php artisan view:clear
Dockerfile里修改入口点:
ADD entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
Define default command.
CMD ["supervisord", "-c", "/etc/supervisor/supervisord.conf"]
完整的Dockerfile见[Github](https://github.com/orvice/laravel-docker).
## 在自己的Laravel项目中快速打包
使用Docker的ONBUILD特性,我做了个基础镜像,只需要在自己的Laravel项目的Dockerfile中改为:
FROM orvice/laravel-base
即可快速方便的构造Docker镜像!