Docker容器内无法连接宿主机MySQL的问题排查与解决
容器内连接宿主机MySQL失败的问题与解决
环境信息
- Ubuntu: 20.04
- Docker版本: 20.10
- MySQL版本: 8.0
- 容器环境:Python + mysql client
- 宿主机:部署MySQL服务
宿主机MySQL配置
sudo apt install -y mysql-server apt install -y default-libmysqlclient-dev # 修改绑定地址:/etc/mysql/mysql.conf.d/mysqld.cnf # bind-address = 0.0.0.0
Docker容器构建配置
RUN apt-get update &&\ apt install -y default-mysql-client &&\ apt-get install -y gcc &&\ apt-get install -y default-libmysqlclient-dev &&\ /usr/local/bin/python -m pip install --upgrade pip &&\ pip install --no-cache-dir SQLAlchemy
容器内Python连接代码
from sqlalchemy import create_engine from sqlalchemy import text SQLALCHEMY_DATABASE_URI = "mysql://root:pwd@localhost:3306/mysql?charset=utf8mb4" engine = create_engine(SQLALCHEMY_DATABASE_URI, encoding='utf8', pool_pre_ping=True) # for mysql with engine.connect() as connection: result = connection.execute(text("show tables;")) print(result.all())
问题现象
尝试通过SQLAlchemy和mysql-client连接宿主机MySQL均失败。
已尝试的方法
- 修改MySQL绑定地址为
0.0.0.0 - 启动容器添加参数:
--add-host host.docker.internal:host-gateway - 直接使用IP地址连接
多数方案称添加--add-host即可解决,但该方法无效。
更新进展
使用--network=host启动容器可成功连接,但不想采用该方式,希望通过host.docker.internal实现连接。
最终解决方案
启动容器时添加参数--add-host host.docker.internal:host-gateway,连接时指定主机为host.docker.internal(例如使用命令mysql -h host.docker.internal),同时将MySQL中root用户的host设置为%,允许非localhost连接。
内容的提问来源于stack exchange,提问作者Archi
相关产品推荐
相关产品推荐

