un contenedor PHP-FPM (7.2), miembro de la pila LAPP clásica, expone correctamente el puerto 9000 cuando se inicia condocker-compose
pero nada cuando lo inicia Docker Swarm. ¿Debo mencionar que el contenedor se está ejecutando (ver el resultado a continuación) y puedo iniciar un TTY bash en él?
Entonces, con docker-compose
, la aplicación web es completamente funcional, pero con Swarm, Apache emite un servicio 503 no disponible. No se cambia nada entre pruebas con diferentes motores. ¿Tiene alguna idea sobre este comportamiento?
docker-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
Con Docker Swarm
Registros de Apache:
[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/
Lista de servicios de enjambre:
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
Intenté agregar net-tools
a la imagen PHP para probar manualmente la conexión con nc
. Mismo resultado, php
la IP de la instancia del contenedor se resuelve correctamente, pero se rechaza cualquier conexión TCP al puerto 9000.
Utilizo muchas variables de entorno y, para paliar la característica faltante con Swarm, uso la docker-compose config
salida del comando para generar docker-compose.yml
el archivo completo.
Condocker-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
Respuesta1
- ¿Cómo hiciste la construcción?
Swarm es diferente a Docker-compose: "un despliegue es un despliegue" - yNO es una construcción! (debe crear las imágenes antes de implementarlas, y es posible que las de composición (probablemente disponibles) no cumplan con los requisitos...)
Con:
docker stack deploy -c your-compose-style-code.yml <name-of-your-swarm>
está implementando una imagen existente en el enjambre seleccionado (probablemente use las que creó mediante Docker-compose antes...
... otro tema en swarm es la creación de redes: debe conocer los alcances de la red (superposición de todo el clúster o swarm - o alcance de una red "interna" para conectar servicios seleccionados de un "espacio de nombres" de la forma en que lo hace en compose ...)
... y luego, por supuesto, los volúmenes para las partes con estado (bases de datos, archivos que los usuarios pueden cargar) deben administrarse de una manera diferente (desde NFS a glusterFS, Galera, linbit/LINSTOR... o cockroachDB simplemente por nombrar algunos...), ya que los contenedores de sus partes sin estado de la orquesta ahora están distribuidos en muchos nodos diferentes...
- A veces, agregar "portainer" a tu enjambre es una buena idea https://www.portainer.io/solutions/docker...