前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >laravel-s 在 Docker 中使用(包含队列的使用)

laravel-s 在 Docker 中使用(包含队列的使用)

作者头像
seth-shi
发布2023-12-18 15:23:37
2570
发布2023-12-18 15:23:37
举报
文章被收录于专栏:seth-shi的专栏

环境

代码语言: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守护进程)

环境配置
  • 在项目里新建queue.Dockerfile
代码语言: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的配置
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 环境
  • 部署
  • 开发
    • 运行挂载本地目录开发
      • 修改代码自动更新
        • 模型注释, 代码跳转等等
        • 调试
          • dump
            • Swoole Tracker3.1
            • 队列(使用supervisor守护进程)
              • 环境配置
                • 队列常见说明
                  • Tips
                  • 注意
                  相关产品与服务
                  容器镜像服务
                  容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档