docker-compose启动php-fpm报错问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker-compose启动php-fpm报错问题相关的知识,希望对你有一定的参考价值。

参考技术A

当你的机子关闭了ipv6启动php-fpm会出现:
address family not supported by protocol
鲁莽解决方法用命令 find / -name zz-docker.conf 找到配置文件位置
直接修改listen = [::]:9000 为 listen = 0.0.0.0:9000
官方DockerFIle:
https://github.com/docker-library/php/blob/b66c0fa0286d0abbb8a36653e26e6992bb71b858/7.0/fpm/alpine/Dockerfile
一般正确做法是修改建立新的dockerfile,
sed "s/[::]:/0.0.0.0:/g" zz-docker.conf

(/var/lib/docker/aufs/diff/864a8992572a0791d45316907d130acaff7f61fe878662b3937c49477496d85c/usr/local/etc/php-fpm.d/zz-docker.conf)

另外解决方法就是不用compose,而是建立Dockerfile文件,里面跑ubuntu,nginx等,然后顺便安装phpfpm,相当于一个镜像,这样和外部本机ipv6环境无关啦。

PHP-FPM docker 容器根据引擎(docker-compose 和 swarm)有不同的行为

【中文标题】PHP-FPM docker 容器根据引擎(docker-compose 和 swarm)有不同的行为【英文标题】:PHP-FPM docker container got different behavior depending engine (docker-compose and swarm) 【发布时间】:2021-10-14 22:58:05 【问题描述】:

一个 PHP-FPM 容器 (7.2),经典 LAPP 堆栈的成员,在使用 docker-compose 启动时正确公开端口 9000但在 Docker Swarm 启动时没有任何内容。我应该提到容器正在运行(见下面的输出),我可以在它上面启动一个 TTY bash。

因此,使用docker-compose,Web 应用程序可以正常运行,但使用 Swarm,Apache 会发出 503 Service Unavailable。使用不同引擎的测试之间没有任何变化。你对这种行为有任何线索吗?

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

使用 Docker Swarm

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/

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    

我尝试将net-tools 添加到PHP 图像中,以便手动测试与nc 的连接。同样的结果,php 容器实例 IP 被正确解析,但任何到 9000 端口的 TCP 连接都被拒绝。

我使用了很多环境变量,为了缓解 Swarm 缺失的功能,我使用docker-compose config 命令输出生成完整的docker-compose.yml 文件。

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

【问题讨论】:

【参考方案1】:

我会尝试以下几点:

    使用docker service inspect 查看配置是否符合您的预期。

    跳入 php 容器,查看它实际监听的端口。

您是否打算直接公开 apache 服务器?我想你会在前面使用 traefik,因为你已经在混合中了。

【讨论】:

以上是关于docker-compose启动php-fpm报错问题的主要内容,如果未能解决你的问题,请参考以下文章

centos6.8 启动php-fpm报错

mac 启动php-fpm报错 failed to open configuration file '/private/etc/php-fpm.conf': No such file

php-fpm启动报错:libgearman.so.8: No such file or directory in Unknown on line 0

CentOS7 docker-compose启动报错

如何使用 NGINX、PHP-FPM 在 docker-compose.yml 文件中加载 mysqli 扩展

php-fpm开启报错-ERROR: An another FPM instance seems..