如何让独立Docker-Compose项目容器连接至Mariadb容器?
解决两个Docker Compose栈间数据库访问问题
你的推测完全正确——默认情况下,每个Docker Compose项目会创建自己的隔离虚拟网络,第二个栈的容器和第一个栈的MariaDB不在同一网络,自然无法通信。因为你不能修改第一个项目,咱们完全从第二个项目的配置入手解决:
步骤1:找到第一个栈的Docker网络名称
首先得确定第一个应用栈使用的网络,你可以通过两种方式查看:
- 运行命令
docker network ls,列出所有Docker网络,通常第一个栈的网络名称是它的项目名加上_default(比如第一个项目文件夹叫full-app-stack,网络名就是full-app-stack_default)。 - 或者直接查看MariaDB容器的网络信息:运行
docker inspect <你的MariaDB容器名称或ID>,在输出的Networks字段里找到对应的网络名称。
步骤2:修改第二个项目的docker-compose.yml
在第二个项目的docker-compose文件里,添加网络配置,让它的PHP/Nginx容器加入第一个栈的现有网络,这样两个栈的容器就处于同一个虚拟局域网了。
示例配置如下(把<第一个栈的实际网络名>替换成你刚才查到的名称):
version: '3.8' services: php: image: your-php-image # 替换成你的PHP镜像 # 保留你的其他现有配置(卷挂载、环境变量等) networks: - default # 保留第二个栈自己的默认网络(如果需要) - first_stack_shared_network # 加入第一个栈的网络 nginx: image: your-nginx-image # 替换成你的Nginx镜像 # 保留你的其他现有配置(端口映射、卷挂载等) networks: - default - first_stack_shared_network # 声明外部网络(第一个栈的网络) networks: first_stack_shared_network: external: true name: <第一个栈的实际网络名称>
步骤3:配置第二个应用的数据库连接
现在第二个栈的PHP容器可以直接通过第一个栈里MariaDB的服务名(或者容器名)作为数据库主机地址来连接。比如第一个栈docker-compose里MariaDB的服务名是mariadb,那你的数据库配置里的host就填mariadb,端口用容器内部的默认端口3306(不需要用主机映射的端口)。
举个PHP数据库配置的例子:
$dbHost = 'mariadb'; $dbPort = 3306; $dbName = 'your-db-name'; $dbUser = 'db-user'; $dbPass = 'db-password';
额外注意事项
- 确保第一个栈的MariaDB允许跨网络连接:Docker官方的MariaDB镜像默认
bind-address是0.0.0.0(允许所有IP访问),如果第一个栈的MariaDB有自定义配置限制了连接来源,可能需要手动调整(不过你提到不能修改第一个项目,默认情况下应该是没问题的)。 - 不需要在第一个栈的MariaDB上做主机端口映射,只要两个容器在同一网络,就能直接通过容器/服务名访问。
内容的提问来源于stack exchange,提问作者Mouke




