问题描述
我创建了一个基本的 LAPP 堆栈,它使用 docker-compose
在本地主机上完美运行。当我尝试让它在生产服务器上与 Swarm 一起运行时(只有 1 个经理,没有工作人员),所有服务都会启动并被复制(1/1),但是 PHP-fpm 不断重启,没有明显错误。
docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
p0rdrdfmso6x traefik_reverse-proxy replicated 1/1 traefik:v2.4 *:80->80/tcp,*:443->443/tcp
e6vwlo9iw2ny my_stack_apache replicated 1/1 apache:latest *:8000->80/tcp
qy5yigbcjryr my_stack_ftp replicated 1/1 fauria/vsftpd:latest *:20-21->20-21/tcp,*:22100-22110->22100-22110/tcp
n5f9v6bd2854 my_stack_PHP replicated 0/1 PHP:latest
rcnbq4vnoz1j my_stack_postgres replicated 1/1 postgres:9.5.24
如果我们专注于 PHP-fpm
容器:
docker service ps my_stack_PHP
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
j6mp3ka40cyo my_stack_PHP.1 PHP:latest node.address Ready Ready 2 seconds ago
ezztpsjoglwy \_ my_stack_PHP.1 PHP:latest node.address Shutdown Complete 3 seconds ago
gnqjhwpi5y72 \_ my_stack_PHP.1 PHP:latest node.address Shutdown Complete 9 seconds ago
0agr3tw0bb9g \_ my_stack_PHP.1 PHP:latest node.address Shutdown Complete 15 seconds ago
9a6wsdp4tqqn \_ my_stack_PHP.1 PHP:latest node.address Shutdown Complete 21 seconds ago
如果我查看日志:
docker service logs my_stack_PHP
my_stack_PHP.1.igd8x7a6ysdi@node.address | Interactive shell
my_stack_PHP.1.57td5iuk1wwy@node.address | Interactive shell
my_stack_PHP.1.r03jn931l1uf@node.address | Interactive shell
my_stack_PHP.1.igd8x7a6ysdi@node.address |
my_stack_PHP.1.r03jn931l1uf@node.address |
my_stack_PHP.1.1huf2pdd0bq0@node.address | Interactive shell
my_stack_PHP.1.57td5iuk1wwy@node.address |
my_stack_PHP.1.1huf2pdd0bq0@node.address |
它的行为就像一个运行命令的容器,该命令将在几秒钟内以成功结束。 Swarm 然后启动一个新容器来保持重启合约。但是,我的 PHP-fpm Dockerfile 提供了应该保持进程运行的 -F
参数:
PHP Dockerfile
FROM centos:7.4
# ... all installs from Centos to add PHP 7.2 from Remi Collet repositories
RUN mkdir -p /run/PHP-fpm
RUN usermod -a -G ftp apache
workdir /var/www/html
EXPOSE 9000
# Run in foreground as root (in container POV)
CMD ["PHP-fpm","-R","-F"]
docker-compose.yaml
version: '3.9'
services:
postgres:
image: "postgres:9.5.24"
environment:
POSTGRES_DB: /run/secret/postgres_db
POSTGRES_USER: /run/secret/postgres_user
POSTGRES_PASSWORD: /run/secret/postgres_password
volumes:
- database:/var/lib/postgresql/data
secrets:
- postgres_db
- postgres_user
- postgres_password
deploy:
resources:
limits:
cpus: '0.15'
memory: 128m
networks:
- internal
apache:
env_file: .env
image: apache:latest
build:
context: ./docker/images/apache2.4
dockerfile: prod.Dockerfile
ports:
- 8000:80
environment:
FPM_HOST: PHP:9000
volumes:
- ./docker/logs/apache/:/var/log/httpd/
networks:
- traefik-public
- internal
deploy:
labels:
- "traefik.enable=true"
- "traefik.http.routers.my_stack.rule=Host(`my-host.com`)"
- "traefik.http.routers.my_stack.entrypoints=websecure"
- "traefik.http.routers.my_stack.tls.certresolver=letsencryptresolver"
- "traefik.http.services.my_stack.loadbalancer.server.port=80"
- "traefik.port=80"
resources:
limits:
cpus: '0.15'
memory: 128m
PHP:
env_file: .env
image: PHP:latest
# links:
# - ftp
# - apache
build:
context: ./docker/images/PHP
dockerfile: prod.Dockerfile
# args:
# TIMEZONE: 'Europe/Paris'
volumes:
- ftp_data:/var/www/ftp:rw
networks:
- internal
deploy:
resources:
limits:
cpus: '0.20'
memory: 512m
ftp:
env_file: .env
image: "fauria/vsftpd:latest"
ports:
- "20:20"
- "21:21"
- "22100-22110:22100-22110"
environment:
FTP_USER: apache
FTP_PASS: /run/secret/automation_client_password
PASV_ADDRESS: 127.0.0.1
PASV_MIN_PORT: 22100
PASV_MAX_PORT: 22110
volumes:
- ftp_data:/home/vsftpd/apache:rw
networks:
- traefik-public
- internal
deploy:
resources:
limits:
cpus: '0.15'
memory: 128m
volumes:
ftp_data:
database:
secrets:
postgres_db:
external: true
postgres_user:
external: true
postgres_password:
external: true
automation_client_password:
external: true
networks:
traefik-public:
external: true
internal:
external: false
有人知道这个吗?任何帮助/提示将不胜感激。
解决方法
我不喜欢这种回答,但副本在完全重启后全部上线。