环境
代码语言:javascript
复制FROM phpswoole/swoole:php7.4-alpine
# 一个安装 PHP 扩展的脚本
COPY --from=mlocati/php-extension-installer /usr/bin/install-php-extensions /usr/local/bin/
RUN install-php-extensions pcntl redis pdo_mysql
WORKDIR /var/www
COPY . .
RUN chmod -R 0777 storage &&
chmod -R 0777 bootstrap/cache &&
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ &&
composer install --optimize-autoloader --no-dev &&
php artisan config:cache &&
php artisan route:cache &&
php artisan view:cache &&
php artisan laravels publish --no-interaction
CMD ["php", "bin/laravels", "start", "--env=product"]
部署
代码语言:javascript
复制## 构建镜像
docker build . -t demo-image
## 运行容器
docker run -d -p 80:5200 --name=demo-service demo-image
开发
运行挂载本地目录开发
代码语言:javascript
复制## 运行容器 (/mnt/d/laravels-demo 是我项目的目录, 以自己的为准)
docker run -d -it -p 80:5200 -v /mnt/d/laravels-demo:/var/dev --name=demo-service -w /var/dev demo-image /bin/sh
修改代码自动更新
代码语言:javascript
复制## 进入容器内部
docker exec -it demo-service /bin/sh
# 安装 inotify
install-php-extensions inotify
## 修改项目 .env
LARAVELS_INOTIFY_RELOAD=true
## 运行即可自动监听文件修改而重启
php bin/laravels start
模型注释, 代码跳转等等
代码语言:javascript
复制## 进入容器内部
docker exec -it demo-service /bin/sh
## 安装依赖
composer install barryvdh/laravel-ide-helper
## 自动生成模型字段
php artisan ide-helper:models --dir="app/Models" --write --reset
调试
dump
代码语言:javascript
复制## 进入容器内部
docker exec -it demo-service /bin/sh
## 安装依赖
composer install beyondcode/laravel-dump-server
## 监听 dump 函数输出
php artisan dump-server
Swoole Tracker3.1
- 安装教程https://wenda.swoole.com/detail/107688
- 直接下载
so
文件放入容器中,然后修改php.ini
开启扩展, 之后php -m
看到swoole-tracker
就代表安装成功了 - 然后按着官方使用, 先增加
trackerHookMalloc
函数, 然后打开另一个命令行执行php -r "trackerAnalyzeLeak();"
即可.
队列(使用supervisor
守护进程)
环境配置
代码语言:javascript
复制FROM phpswoole/swoole:php7.4-alpine
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && cat /etc/apk/repositories
# 快速安装 PHP 扩展
COPY --from=mlocati/php-extension-installer /usr/bin/install-php-extensions /usr/local/bin/
RUN install-php-extensions pcntl redis pdo_mysql zip
WORKDIR /var/www
COPY . .
RUN chmod -R 0777 storage &&
chmod -R 0777 bootstrap/cache &&
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ &&
composer install --optimize-autoloader --no-dev
## 安装 supervisor 守护进程
RUN apk add supervisor
## 修改配置文件
RUN mkdir /etc/supervisor.d/ && echo $'n
[program:laravel-worker] n
process_name=%(program_name)s_%(process_num)02d n
command=/usr/local/bin/php /var/www/artisan queue:work --sleep=3 --tries=3 n
numprocs=12 n
autostart=true n
autorestart=true n
## 重定向错误到 stdout n
redirect_stderr=true n
stdout_logfile_maxbytes=10MB n
stdout_logfile=/var/www/storage/logs/queue.log n'
> /etc/supervisor.d/laravel-worker.ini
## 启动队列服务: 必须增加 --nodaemon 参数
CMD ["/usr/bin/supervisord", "--nodaemon", "-c", "/etc/supervisord.conf"]
- 如需增加运行队列进程, 改动文件中的
numprocs
即可 - 构建队列镜像
docker build . -f queue.Dockerfile -t laravel-worker
- 运行队列容器
docker run -d --name=laravel-worker-service laravel-worker
队列常见说明
- 重启队列任务
- 错误做法
- 不可直接重启容器(会导致正在运行的任务终止)
- 不可通过
supervisord
重启队列进程(会导致正在运行的任务终止)
- 正确做法
- 进入容器:
docker exec -it laravel-worker-service /bin/sh
- 重启队列:
php /var/www/artisan queue:restart
- 重启队列逻辑
- 队列开始执行时, 队列获取当前缓存的时间戳
t1
- 执行好上面的重启任务之后
laravel
会把时间戳t2
写入缓存 - 每一个队列任务执行完成之后,从缓存中拿出时间戳,如果
t2
不等于t1
停止当前进程 - 由于
supervisord
设置了autostart
, 又会重启队列进程, 这样子就不会中断任务
- 更新代码方法1
- 每次更新代码, 写一个脚本
docker cp
代码到容器里面 - 容器再按照上面的命令重启队列, 即可加载最新代码
- 更新代码方法2
- 容器运行的时候增加参数
-v
映射本地目录 - 更新代码的时候是更新宿主机代码, 然后映射到容器中, 容器再按照上面的命令重启队列, 即可加载最新代码
- 更新代码方法3
代码语言:javascript
复制## 执行此命令后后查看队列进程无任务输出, 即可开始停止
php artisan down
supervisorctl stop all
## 此处启动新的容器运行即可
########################
## 容器启动好之后, 恢复服务运行
php artisan up
Tips
- 新增加的队列任务不需要重启也可以加载(因为
PHP
可以动态require
文件)
注意
- 记得把
config/laravels.php => listen_ip
配置成为0.0.0.0
- 如果包含静态资源需要把
config/laravels.php => handle_static
设置为true
- 注意
config/laravels.php => register_providers
的配置 - 注意
config/laravels.php => cleaners
的配置