使用Docker 打包部署Laravel 应用

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以提高性能。

<br></br>
php artisan route:cache && php artisan view:clear<br></br>```

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镜像!


Show Comments