php - PHP-FPM docker 容器根据引擎(docker-compose 和 swarm)有不同的行为
问题描述
一个 PHP-FPM 容器 (7.2) 是经典 LAPP 堆栈的成员,在启动时正确暴露端口 9000,docker-compose
但在由 Docker Swarm 启动时没有。我应该提到容器正在运行(见下面的输出),我可以在它上面启动一个 TTY bash。
因此docker-compose
,使用 Swarm,Web 应用程序可以正常运行,但使用 Swarm,Apache 会发出 503 Service Unavailable。使用不同引擎的测试之间没有任何变化。你对这种行为有任何线索吗?
码头工人-compose.yml
version: '3.5'
services:
postgres:
env_file: ./.env
image: "postgres:9.5.24"
volumes:
- database:/var/lib/postgresql/data
networks:
- internal
adminer:
image: adminer
networks:
- internal
- traefik-public
deploy:
labels:
- "traefik.enable=true"
- "traefik.http.routers.adminer.rule=Host(`adminer.example.com`)"
- "traefik.http.routers.adminer.entrypoints=websecure"
- "traefik.http.routers.adminer.tls.certresolver=letsencryptresolver"
- "traefik.http.services.adminer.loadbalancer.server.port=8080"
- "traefik.port=80"
apache:
env_file: ./.env
image: visio_rdv_apache:latest
build:
context: docker/images/apache2.4
dockerfile: Dockerfile
args:
UID: ${HOST_UID}
ROOT_URL: ${ROOT_URL}
ports:
- 8000:80
environment:
FPM_HOST: php:9000
ROOT_URL: ${ROOT_URL}
volumes:
- ${LOGS_DIR}/apache/:/var/log/httpd/
- ${RELATIVE_APP_PATH}:/var/www/html
links:
- postgres
- php
networks:
- internal
- traefik-public
deploy:
labels:
- "traefik.enable=true"
- "traefik.http.routers.visio_rdv.rule=Host(`test.example.com`)"
- "traefik.http.routers.visio_rdv.entrypoints=websecure"
- "traefik.http.routers.visio_rdv.tls.certresolver=letsencryptresolver"
- "traefik.http.services.visio_rdv.loadbalancer.server.port=80"
- "traefik.port=80"
php:
env_file: .env
links:
- ftp
image: visio_rdv_php:latest
build:
context: docker/images/php
dockerfile: Dockerfile
args:
UID: ${HOST_UID}
TIMEZONE: ${TIMEZONE}
PROXY: ${http_proxy}
volumes:
- ftp_data:/var/www/ftp:rw
- ${RELATIVE_APP_PATH}:/var/www/html
networks:
- internal
ftp:
env_file: .env
image: "fauria/vsftpd:latest"
ports:
- "9520:20"
- "9521:21"
- "21100-21110:21100-21110"
environment:
FTP_USER: ${FTP_USER}
FTP_PASS: ${FTP_PASS}
PASV_MIN_PORT: 21100
PASV_MAX_PORT: 21100
volumes:
- ftp_data:/home/vsftpd/${AUTOMATION_CLIENT_NAME}:rw
networks:
- internal
volumes:
ftp_data:
database:
networks:
traefik-public:
external: true
internal:
external: false
使用 Docker Swarm
阿帕奇日志:
[Wed Aug 04 07:35:16.382246 2021] [proxy:error] [pid 11] (111)Connection refused: AH00957: FCGI: attempt to connect to 10.0.4.93:9000 (*) failed
[Wed Aug 04 07:35:16.382314 2021] [proxy_fcgi:error] [pid 11] [client 10.0.0.2:1035] AH01079: failed to make connection to backend: php, referer: http://test.example.com/
群服务列表:
docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
um2txtpz8534 traefik_reverse-proxy replicated 1/1 traefik:v2.4
ahf7uukapxbr my_stack_adminer replicated 1/1 adminer:latest
ue8qekmg0ff0 my_stack_apache replicated 1/1 my_stack_apache:latest my_stack*:8000->80/tcp
x9igaslhsx11 my_stack_ftp replicated 1/1 fauria/vsftpd:latest *:9520-9521->20-21/tcp, *:21100-21110->21100-21110/tcp
jpk4qzqs1tfx my_stack_php replicated 1/1 my_stack_php:latest
ih67rh82vp9e my_stack_postgres replicated 1/1 postgres:9.5.24
我尝试添加net-tools
到 PHP 图像,以便手动测试与nc
. 同样的结果,php
容器实例 IP 被正确解析,但任何到端口 9000 的 TCP 连接都被拒绝。
我使用了很多环境变量,为了减轻 Swarm 缺失的功能,我使用docker-compose config
命令输出来生成完整的docker-compose.yml
文件。
和docker-compose
Name Command State Ports
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
my_stack_adminer_1 entrypoint.sh docker-php-e ... Up 8080/tcp
my_stack_apache_1 /bin/sh -c apachectl -D FO ... Up 0.0.0.0:8000->80/tcp
my_stack_ftp_1 /usr/sbin/run-vsftpd.sh Up 0.0.0.0:9520->20/tcp, 0.0.0.0:9521->21/tcp, 0.0.0.0:21100->21100/tcp, 0.0.0.0:21101->21101/tcp, 0.0.0.0:21102->21102/tcp,
0.0.0.0:21103->21103/tcp, 0.0.0.0:21104->21104/tcp, 0.0.0.0:21105->21105/tcp, 0.0.0.0:21106->21106/tcp, 0.0.0.0:21107->21107/tcp,
0.0.0.0:21108->21108/tcp, 0.0.0.0:21109->21109/tcp, 0.0.0.0:21110->21110/tcp
my_stack_php_1 php-fpm -R -F Up 9000/tcp
my_stack_postgres_1 docker-entrypoint.sh postgres Up 5432/tcp
解决方案
以下是我会尝试的几件事:
用于
docker service inspect
查看配置是否符合您的预期。跳入 php 容器,看看它实际监听的是哪个端口。
您是否打算直接公开 apache 服务器?我想你会在前面使用 traefik ,因为你已经在混合中了。
推荐阅读
- python - 无法使用owlready python中的搜索方法从我的本体中获取我的个人
- python - keras不平衡数据训练权重调整
- reactjs - 实际上redux-saga如何在api请求中放置标头?
- c# - 如何记录屏幕绘画的时间
- java - 我的 ResultSet 只用 .next() 做一行,但我确实有 3 个
- reactjs - 如何使用线性渐变中倒在数组上的颜色十六进制代码?
- c++ - 在 Visual Studio 2019 中编译 ATL 项目时,propidlbase.idl 中的重新定义错误
- reactjs - 如何使用 react-bootstrap 组件和 react-select 菜单解决 z-index 问题?
- php - 注意:第 32 行 C:\xampp\webb\htdocs\smart logger\forms.php 中的数组到字符串转换
- reactjs - 反应原生