You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何让独立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-address0.0.0.0(允许所有IP访问),如果第一个栈的MariaDB有自定义配置限制了连接来源,可能需要手动调整(不过你提到不能修改第一个项目,默认情况下应该是没问题的)。
  • 不需要在第一个栈的MariaDB上做主机端口映射,只要两个容器在同一网络,就能直接通过容器/服务名访问。

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

火山引擎 最新活动