同服务器下两个Docker容器通信问题(Mariadb版本兼容场景)
解决同服务器Docker容器间(应用与Mariadb 10.9)的通信问题
核心方案:使用Docker自定义桥接网络
Docker默认的bridge网络不支持容器名DNS解析,自定义网络是容器间通信的最可靠方式,步骤如下:
- 创建自定义网络
docker network create app-db-network
- 启动Mariadb 10.9容器并加入该网络
启动时指定网络,同时配置必要的环境变量:
docker run -d \ --name mariadb-10.9 \ --network app-db-network \ -e MYSQL_ROOT_PASSWORD=你的root密码 \ -e MYSQL_DATABASE=你的应用数据库名 \ -e MYSQL_USER=你的应用数据库用户 \ -e MYSQL_PASSWORD=你的应用数据库密码 \ mariadb:10.9
- 启动应用容器并加入同一网络
确保应用容器和数据库容器在同一个自定义网络内:
docker run -d \ --name 你的应用容器名 \ --network app-db-network \ # 这里添加你的应用容器其他配置(如端口映射、环境变量等) 你的应用镜像名:标签
- 配置应用的数据库连接字符串
应用连接数据库时,直接使用数据库容器的名称mariadb-10.9作为主机名,示例连接字符串:
mysql://你的应用数据库用户:你的应用数据库密码@mariadb-10.9:3306/你的应用数据库名
排查与验证步骤
如果按上述步骤操作后仍无法通信,按以下方式排查:
- 检查容器网络归属:执行以下命令确认两个容器都在同一个自定义网络中
docker inspect mariadb-10.9 | grep Networks docker inspect 你的应用容器名 | grep Networks
- 测试容器间连通性:进入应用容器,ping数据库容器名验证网络连通
docker exec -it 你的应用容器名 ping mariadb-10.9
如果能ping通,说明网络正常,问题可能出在数据库权限或应用配置。
- 检查Mariadb用户权限:确保数据库用户允许从任意地址(或应用容器所在网段)连接,登录Mariadb执行:
GRANT ALL PRIVILEGES ON 你的应用数据库名.* TO '你的应用数据库用户'@'%' IDENTIFIED BY '你的应用数据库密码'; FLUSH PRIVILEGES;
注意事项
- 无需将Mariadb 10.9容器的3306端口映射到主机(除非需要外部访问),容器间通信直接使用自定义网络内的容器端口即可,避免与原有Mariadb 10.11的3306端口冲突。
- 不要使用Docker默认的
bridge网络,其容器名解析存在限制,容易导致通信失败。
内容的提问来源于stack exchange,提问作者Emmanouel
相关产品推荐
相关产品推荐

