PHP-FPM-Docker-Container verhält sich hinsichtlich der Engine unterschiedlich (Docker-Compose vs. Swarm)

PHP-FPM-Docker-Container verhält sich hinsichtlich der Engine unterschiedlich (Docker-Compose vs. Swarm)

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-composeDie 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, phpdie 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 configBefehlsausgabe, um eine vollständige docker-compose.ymlDatei 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

  1. 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.

  1. Manchmal ist es eine gute Idee, Ihrem Schwarm "portainer" hinzuzufügen https://www.portainer.io/solutions/docker...

verwandte Informationen