Ein PHP-FPM-Container (7.2), Mitglied des klassischen LAPP-Stacks, stellt Port 9000 korrekt zur Verfügung, wenn er mitdocker-compose
aber nichts, wenn von Docker Swarm gestartet. Sollte ich erwähnen, dass der Container läuft (siehe Ausgabe unten) und ich einen TTY-Bash darauf starten kann?
docker-compose
Die Webanwendung ist also voll funktionsfähig, aber mit Swarm gibt Apache eine 503 Service Unavailable-Meldung aus. Zwischen den Tests mit verschiedenen Engines ändert sich nichts. Haben Sie eine Ahnung, was dieses Verhalten verursacht?
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
Mit Docker Swarm
Apache-Protokolle:
[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/
Liste der Swarm-Dienste:
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
Ich habe versucht, das PHP-Image zu ergänzen net-tools
, um die Verbindung manuell zu testen nc
. Dasselbe Ergebnis, php
die IP-Adresse der Containerinstanz wird korrekt aufgelöst, aber jede TCP-Verbindung zu Port 9000 wird abgelehnt.
Ich verwende viele Umgebungsvariablen und um fehlende Funktionen mit Swarm zu beheben, verwende ich die docker-compose config
Befehlsausgabe, um eine vollständige docker-compose.yml
Datei zu generieren.
Mitdocker-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
Antwort1
- Wie hast Du den Build gemacht?
Swarm ist anders als Docker-Compose: „ein Deployment ist ein Deployment" - UndKEIN Build! (Sie müssen die Bilder erstellen, bevor Sie sie bereitstellen – und die (wahrscheinlich verfügbaren) Compose-Bilder erfüllen möglicherweise nicht die Anforderungen …)
Mit:
docker stack deploy -c your-compose-style-code.yml <name-of-your-swarm>
Sie stellen ein vorhandenes Image im ausgewählten Swarm bereit (wahrscheinlich werden dabei die Images verwendet, die Sie zuvor über Docker-Compose erstellt haben ...)
... ein weiteres Thema in Swarm ist die Vernetzung: Sie müssen sich der Vernetzungsbereiche bewusst sein (Cluster- oder Swarm-weites Overlay – oder Bereich eines „internen“ Netzwerks, um ausgewählte Dienste eines „Namespace“ so zu verbinden, wie Sie es in Compose tun …)
... und dann müssen natürlich die Volumes für die zustandsbehafteten Teile (Datenbanken, Dateien, die die Benutzer möglicherweise hochladen) auf eine andere Art und Weise verwaltet werden (von NFS über GlusterFS und Galera bis hin zu Linbit/LINSTOR ... oder CockroachDB, um nur einige zu nennen ...), da die Container Ihrer zustandslosen Teile des Orchesters jetzt auf viele verschiedene Knoten verteilt sind.
- Manchmal ist es eine gute Idee, Ihrem Schwarm "portainer" hinzuzufügen https://www.portainer.io/solutions/docker...