You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自动配置Docker Compose中PHP连接MySQL的Servername?

问题

我正在搭建基于Docker Compose的LAMP栈,目前需要通过以下命令获取MySQL容器IP:

docker ps --format \
"table {{.ID}}\t{{.Status}}\t{{.Names}}"
docker inspect -f \
'{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'
<the container id>

随后手动修改PHP连接文件中的$servername为该容器IP:

$servername = "<the container ip>:3306";
$username = "user";
$password = "password";
$dbname = "db";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

请问在部署到服务器时,有没有办法自动完成这一配置,无需手动修改?

自动配置方案

1. 直接用Docker Compose服务名替代IP

Docker Compose默认会给同一自定义网络下的容器提供DNS解析,你完全可以用MySQL服务的名称直接作为数据库地址,不用管IP变化。

举个例子,如果你的docker-compose.yml里MySQL服务叫db:

version: '3.8'
services:
  web:
    # 你的PHP/nginx/apache相关配置
    depends_on:
      - db
    networks:
      - lamp-net
  db:
    image: mysql:8.0
    # 这里放MySQL的环境变量、数据卷等配置
    networks:
      - lamp-net
networks:
  lamp-net:

然后PHP代码里直接把$servername改成服务名:

$servername = "db:3306";
$username = "user";
$password = "password";
$dbname = "db";

$conn = new mysqli($servername, $username, $password, $dbname);

容器启动后,会自动把db解析到对应MySQL容器的IP,全程不用手动改配置。

2. 用环境变量传递数据库参数

把数据库的连接信息放到Docker Compose的环境变量里,PHP代码直接读取这些变量,彻底摆脱硬编码。

修改docker-compose.yml:

services:
  web:
    # 其他配置
    environment:
      - DB_HOST=db:3306
      - DB_USER=user
      - DB_PASSWORD=password
      - DB_NAME=db
    # 其他挂载、启动命令等配置...
  db:
    # MySQL的相关配置...

然后PHP代码改成读取环境变量:

$servername = getenv('DB_HOST');
$username = getenv('DB_USER');
$password = getenv('DB_PASSWORD');
$dbname = getenv('DB_NAME');

$conn = new mysqli($servername, $username, $password, $dbname);

后续要改数据库配置,直接调整docker-compose.yml里的环境变量就行,不用碰PHP代码。

3. 配置文件模板(适合复杂场景)

如果需要更灵活的配置,可以用envsubst这类工具,在容器启动时根据环境变量自动生成PHP配置文件。

步骤如下:

  1. 先写一个PHP配置模板文件db-config.tpl.php:
$servername = "${DB_HOST}:3306";
$username = "${DB_USER}";
$password = "${DB_PASSWORD}";
$dbname = "${DB_NAME}";

$conn = new mysqli($servername, $username, $password, $dbname);
  1. 在Docker Compose里配置PHP容器的启动命令,让它先替换模板变量再启动服务:
services:
  web:
    # 其他配置
    environment:
      - DB_HOST=db
      - DB_USER=user
      - DB_PASSWORD=password
      - DB_NAME=db
    command: sh -c "envsubst < /app/db-config.tpl.php > /app/db-config.php && apache2-foreground"
    # 这里的启动命令根据你的服务调整,比如用php-fpm的话就换成对应的启动命令
    volumes:
      - ./db-config.tpl.php:/app/db-config.tpl.php

这样容器启动时会自动生成最终的配置文件,完全不用手动干预。

内容的提问来源于stack exchange,提问作者Thibautdev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 04:35:21