如何从同一宿主机的另一个Docker实例连接到MySQL Docker实例
稳定连接解决方案
最优方案:使用Docker内置DNS解析(同一自定义网络下)
你创建的mynetwork属于Docker自定义桥接网络,这类网络默认自带DNS服务,同网络下的容器可以直接使用容器名作为hostname互相访问,完全不需要关心容器动态变化的IP地址。
你只需要修改Python代码中的数据库连接host配置即可:
# 将原host值127.0.0.1替换为MySQL容器的名称mysql host="mysql"
原问题原因说明
- 本地直接运行Python脚本时,
127.0.0.1指向宿主机,你启动MySQL容器时做了3306:3306的端口映射,所以可以正常连接 - Python容器内部的
127.0.0.1指向容器自身,自身没有运行MySQL服务,因此会报连接失败错误
多环境兼容方案:将连接配置抽离为环境变量
如果需要同时支持本地开发调试、容器部署两种场景,不需要反复修改代码,只需要将数据库连接参数配置为从环境变量读取即可:
- 在
.env文件中新增配置项:
# 本地开发时用127.0.0.1,容器部署时改为mysql即可 MYSQL_HOST=127.0.0.1 MYSQL_PORT=3306 MYSQL_USER=root MYSQL_PASSWORD=5895 MYSQL_DATABASE=你的库名
- Python代码中从环境变量读取配置:
import os import mysql.connector host = os.getenv("MYSQL_HOST") port = int(os.getenv("MYSQL_PORT")) user = os.getenv("MYSQL_USER") password = os.getenv("MYSQL_PASSWORD") database = os.getenv("MYSQL_DATABASE") conn = mysql.connector.connect( host=host, port=port, user=user, password=password, database=database )
- 容器启动时也可以直接通过参数覆盖环境变量,不需要修改镜像内的配置:
docker run -itd -p 3000:3000 -e MYSQL_HOST=mysql --name test --network mynetwork twitter-alpha
注意事项
- 确保两个容器都加入了同一个自定义桥接网络
mynetwork,Docker默认的bridge网络不支持DNS解析功能 - 确保MySQL容器的名称没有拼写错误,DNS解析是和容器名严格匹配的
内容的提问来源于stack exchange,提问作者rkk1995
相关产品推荐
相关产品推荐

