Docker Compose部署WordPress无法关联外部PHP容器求助
我通过以下Docker Compose配置部署了Apache、PHP和WordPress容器,希望WordPress能依赖并使用外部的PHP容器,但实际WordPress仍在使用自身镜像内置的PHP。即使停止PHP容器,WordPress容器依然能正常运行。我尝试在WORDPRESS_CONFIG_EXTRA中添加了WP_PHP_CONTAINER等定义,但问题仍未解决,特此求助。
当前Docker Compose配置
version: '3' services: apache: image: httpd:2.4 container_name: apache ports: - "8080:80" volumes: - ./html:/usr/local/apache2/htdocs #- ./config/apache/httpd.conf:/usr/local/apache2/conf/httpd.conf - myapp:/usr/lib/apache2/modules/ networks: - mynetwork php: image: php:8.1-apache container_name: php volumes: - ./html:/var/www/html #- ./config/php:/usr/local/etc/php - myapp:/usr/lib/apache2/modules/ networks: - mynetwork wordpress: image: wordpress:latest ports: - "80:80" # 若80端口被占用可修改 environment: WORDPRESS_DB_HOST: percona-mysql WORDPRESS_DB_USER: root WORDPRESS_DB_PASSWORD: Passw0rd WORDPRESS_DB_NAME: sys WORDPRESS_CONFIG_EXTRA: | define('WP_HOME', 'http://192.168.100.15'); define('WP_SITEURL', 'http://192.168.100.15'); define('WP_PHP_CONTAINER', 'php'); # 调整为你的PHP容器名称 define('WP_APACHE_CONTAINER', 'apache'); # 调整为你的Apache容器名称 volumes: - ./wordpress:/var/www/html depends_on: - php networks: - mynetwork networks: mynetwork: external: true volumes: myapp:
已尝试的配置片段
WORDPRESS_CONFIG_EXTRA: | define('WP_HOME', 'http://192.168.100.15'); define('WP_SITEURL', 'http://192.168.100.15'); define('WP_PHP_CONTAINER', 'php'); # 调整为你的PHP容器名称
核心问题分析
WordPress官方镜像本身就是Apache+PHP的集成镜像,自带完整的PHP运行环境。你添加的WP_PHP_CONTAINER这类自定义常量对WordPress镜像的运行机制没有任何作用——WordPress根本不识别这些自定义配置,只会用自身内置的PHP处理请求。depends_on仅控制容器启动顺序,无法改变WordPress容器的运行逻辑。
正确架构调整方案
要让WordPress使用外部PHP容器,需拆分架构:用独立Apache作为反向代理/静态资源服务器,PHP-FPM容器处理PHP请求,WordPress代码挂载到PHP-FPM容器中,不再使用官方WordPress镜像。
调整后的Docker Compose配置示例:
version: '3' services: apache: image: httpd:2.4 container_name: apache ports: - "80:80" volumes: # 挂载Apache配置文件,配置反向代理到PHP-FPM - ./config/apache/httpd.conf:/usr/local/apache2/conf/httpd.conf - ./config/apache/extra/httpd-vhosts.conf:/usr/local/apache2/conf/extra/httpd-vhosts.conf # 挂载WordPress静态资源 - ./wordpress:/var/www/html networks: - mynetwork depends_on: - php-fpm php-fpm: image: php:8.1-fpm container_name: php-fpm volumes: # 挂载WordPress代码 - ./wordpress:/var/www/html # 可选:挂载自定义PHP配置 # - ./config/php/php.ini:/usr/local/etc/php/php.ini networks: - mynetwork depends_on: - percona-mysql # 数据库服务保持原有配置 percona-mysql: image: percona:latest container_name: percona-mysql environment: MYSQL_ROOT_PASSWORD: Passw0rd MYSQL_DATABASE: sys volumes: - mysql-data:/var/lib/mysql networks: - mynetwork networks: mynetwork: external: true volumes: mysql-data:
关键配置步骤
- Apache配置调整:在Apache的
httpd.conf中启用proxy、proxy_fcgi模块,并在虚拟主机配置中把PHP请求转发到PHP-FPM容器:
# httpd.conf中启用模块 LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so # 虚拟主机配置示例 <VirtualHost *:80> DocumentRoot /var/www/html ServerName 192.168.100.15 <Directory /var/www/html> AllowOverride All Require all granted </Directory> # 将.php请求转发到PHP-FPM容器的9000端口 ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php-fpm:9000/var/www/html/$1 </VirtualHost>
替换官方WordPress镜像:不再使用
wordpress:latest镜像,直接将WordPress代码下载到本地./wordpress目录,挂载到PHP-FPM和Apache容器中。数据库配置:确保PHP-FPM容器能连接到
percona-mysql服务,手动创建或通过WordPress安装向导生成wp-config.php,填写正确的数据库信息。
验证方法
启动所有容器后,停止php-fpm容器,此时Apache无法处理PHP请求,页面会显示502错误,说明WordPress已依赖外部PHP环境。
内容的提问来源于stack exchange,提问作者Amir Ali

