O contêiner PHP-FPM Docker se comporta de maneira diferente em relação ao mecanismo (docker-compose vs Swarm)

O contêiner PHP-FPM Docker se comporta de maneira diferente em relação ao mecanismo (docker-compose vs Swarm)

um contêiner PHP-FPM (7.2), membro da pilha LAPP clássica, expõe corretamente a porta 9000 quando iniciado comdocker-compose mas nada quando iniciado pelo Docker Swarm. Devo mencionar que o contêiner está em execução (veja a saída abaixo) e posso iniciar um TTY bash nele.

Assim docker-compose, com o aplicativo da web é totalmente funcional, mas com o Swarm, o Apache emite um 503 Serviço indisponível. Nada é alterado entre testes com motores diferentes. Você tem alguma pista sobre esse comportamento?

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

Com Docker Swarm

Registros do 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 serviços do Swarm:

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    

Tentei adicionar net-toolsà imagem PHP, para testar manualmente a conexão com o nc. Mesmo resultado, phpo IP da instância do contêiner foi resolvido corretamente, mas qualquer conexão TCP com a porta 9000 foi recusada.

Eu uso muitos vars de ambiente e, para amenizar recursos ausentes no Swarm, uso a docker-compose configsaída do comando para gerar docker-compose.ymlo arquivo completo.

Comdocker-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 

Responder1

  1. Como você fez a construção?

Swarm é diferente do docker-compose: "uma implantação é uma implantação" - eNÃO é uma construção! (você precisa construir as imagens antes de implantá-las - e as imagens compostas (provavelmente disponíveis) podem não atender aos requisitos ...)

Com:

docker stack deploy -c your-compose-style-code.yml <name-of-your-swarm>

você está implantando uma imagem existente no enxame selecionado (provavelmente usa aquelas que você construiu via docker-compose antes ...

... outro assunto no swarm é rede: você precisa estar ciente dos escopos de rede (cluster ou swarm wide overlay - ou escopo de uma rede "interna" para conectar serviços selecionados de um "namespace" da maneira que você faz no compose ...)

... e então, é claro, os volumes para as partes com estado (bancos de dados, arquivos que os usuários podem carregar) precisam ser gerenciados de uma maneira diferente (de NFS para glusterFS para Galera para linbit/LINSTOR ... ou cockroachDB apenas para citar alguns...), já que os contêineres de suas partes sem estado da orquestra agora estão distribuídos em muitos nós diferentes.

  1. Às vezes, adicionar "portiner" ao seu enxame é uma boa ideia https://www.portainer.io/solutions/docker...

informação relacionada