在docker环境中实现Laravel项目执行定时任务和消息队列流程步骤
Docker  /  管理员 发布于 9个月前   266
docker环境中实现以下执行需求
1、在正式服务器中使用 docker 容器来执行 php 代码
2、需要跑关于 php 的定时任务
3、其他服务比如 nginx,mysql 在哪里执行无关紧要,既可以放入其他 docker 容器,
也可以放入宿主机。
4、代码是放宿主机的,不在镜像内。也就是,使用数据卷的代码。
5、最好还能跑消息队列,另起一个容器。
实现方案
1、有一个镜像得包含 php
2、使用 docker-compose 编排容器。
3、同一个镜像提供一个 php-fpm 服务,且又提供一个 crond 服务,且又提供队列服务。
4、我为了省事,都用 centos 镜像打底,想轻便可以用专门的 php 官方镜像。
文件结构
/root/docker-image 文件夹
使用 tree 命令
.
|-- docker-compose.yml 自己写。
|-- logs
| `-- php82
| |-- fpm.slow.log 该文件是自动创建的,无视
| `-- php.error.log 该文件是自动创建的,无视
`-- services
`-- php82
|-- crontab 自己写。
|-- Dockerfile 自己写。
|-- php-fpm.conf 自己写。官网抄,改。
|-- myqueu.ini 自己写。官网抄,改。
`-- php.ini 自己写。官网抄
php 的 Dockerfile
FROM centos:7.9.2009
ENV TZ Asia/Shanghai
WORKDIR /www
RUN yum -y install epel-release
RUN yum makecache \
&& yum repolist \
&& yum install -y https://mirrors.aliyun.com/remi/enterprise/remi-release-7.rpm \
&& yum makecache \
&& yum repolist \
&& yum -y install yum-utils \
&& cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN yum-config-manager --enable remi-php82 \
&& yum install -y php82 php82-php-devel php82-php-fpm php82-php-mbstring php82-php-memcache php82-php-memcached php82-php-redis php82-php-mysqlnd php82-php-pdo php82-php-bcmath php82-php-xml php82-php-gd php82-php-gmp php82-php-igbinary php82-php-imagick php82-php-mcrypt php82-php-pdo_mysql php82-php-posix php82-php-simplexml php82-php-opcache php82-php-xsl php82-php-xmlwriter php82-php-xmlreader php82-php-swoole php82-php-zip php82-php-phalcon php82-php-yaml php82-php-yar php82-php-yaf php82-php-uuid php82-php-sodium \
&& systemctl enable php82-php-fpm \
&& yum install -y git wget vim redis zip unzip p7zip rsync crontabs supervisor net-tools python3 \
&& groupadd www -g 1000 \
&& useradd -u 1000 -g 1000 www
RUN ln -s /usr/bin/php82 /usr/bin/php
CMD "/usr/sbin/init"
这里说明一下 www 和 1000,需要和 宿主机的 nginx 的用户保持一致,
且 uid 和 nginx 的 uid 保持一致,比较重要。
docker-compose.yml 内容
version: "3"
services:
php82:
build:
context: ./services/php82
args:
TZ: Asia/Shanghai
container_name: php82
expose:
- 9082
ports:
- "9082:9082"
volumes:
- /www/wwwroot:/www/wwwroot:rw
- ./services/php82/php.ini:/etc/opt/remi/php82/php.ini:ro
- ./services/php82/php-fpm.conf:/etc/opt/remi/php82/php-fpm.conf:rw
- ./logs/php82:/var/log/php
restart: always
cap_add:
- ALL
command: ["/opt/remi/php82/root/usr/sbin/php-fpm", "--nodaemonize", "--allow-to-run-as-root" ]
networks:
- default
mycrond:
build:
context: ./services/php82
args:
TZ: Asia/Shanghai
container_name: mycrond
volumes:
- /www/wwwroot:/www/wwwroot:rw
- ./services/php82/php.ini:/etc/opt/remi/php82/php.ini:ro
- ./services/php82/php-fpm.conf:/etc/opt/remi/php82/php-fpm.conf:rw
- ./logs/php82:/var/log/php
- ./services/php82/crontab:/etc/crontab:rw
restart: always
command: ["/usr/sbin/crond", "-n" ]
networks:
- default
myqueue:
build:
context: ./services/php82
args:
TZ: Asia/Shanghai
container_name: myqueue
volumes:
- /www/wwwroot:/www/wwwroot:rw
- ./services/php82/php.ini:/etc/opt/remi/php82/php.ini:ro
- ./services/php82/php-fpm.conf:/etc/opt/remi/php82/php-fpm.conf:rw
- ./logs/php82:/var/log/php
- ./services/php82/myqueue.ini:/etc/supervisord.d/myqueue.ini:rw
restart: always
command: ["/usr/bin/supervisord", "-n" ]
networks:
- default
networks:
default:
driver: bridge
ipam:
driver: default
说明,mycrond 容器多了一个 crond 文件映射。
这样,就只有 mycrond 容器才可能有定时任务,其他容器一定没有,可靠又方便。
另外,只有 myqueue 容器有消息队列的配置,其余容器都没有。也非常安全。
crontab 内容
这其实是容器在执行的。不是宿主机执行。
注意 user www
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
* * * * * www cd /www/wwwroot/laravel项目文件夹 && php82 artisan schedule:run >> /dev/null 2>&1
myqueue.ini
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php82 /www/wwwroot/my_project_folder/artisan queue:work --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=www
numprocs=1 ## 这是只跑一个队列的意思。可以设多个,比如 8,那样就并发
redirect_stderr=true
stdout_logfile=/etc/supervisord.d/worker.log
stopwaitsecs=3600
注意上面的 user www。
当队列处理代码修改后,需要容器内执行重启队列命令:
supervisorctl restart all
因为这是守护进程,修改代码不影响正在执行的进程。
所以我们修改代码后,需要重启让代码生效。
总结
docker-compose 的启动命令 :
进入 docker-image 目录,docker-compose up -d
本文的内容是实际检测通过的,定时任务确实跑起来了。
myqueue 是消息队列,也跑起来了。
用 docker 可以在服务器,主要是多 php 版本的情况会用到。
以及通过 yum 安装失败,文件混乱的时候会用到。
123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..路人 在
php中使用hyperf框架调用讯飞星火大模型实现国内版chatgpt功能示例中评论 教程很详细,如果加个前端chatgpt对话页面就完美了..Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号