Docker部署MariaDB无法通过SQLAlchemy或mysql连接的问题
问题背景
尝试连接Docker中运行的MariaDB,操作及报错情况如下:
- 启动容器命令:
docker run -p 127.0.0.1:3306:3306 --name mdb -e MARIADB_ROOT_PASSWORD=Password123! -d mariadb:latest
- 容器内
/etc/mysql/my.conf的bind-address配置:
#bind-address=0.0.0.0
- 获取容器IP命令:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mdb
- Python连接代码(SQLAlchemy):
from sqlalchemy import create_engine engine = create_engine("mariadb+mariadbconnector://root:Password123!@172.17.0.3:3306/mdb") engine.connect()
- 测试连接的mysql命令:
mysql -h 172.17.0.3 -P 3306 --protocol=TCP -u root -p
返回错误:
ERROR 2003 (HY000): Can't connect to MySQL server on '172.17.0.2:3306' (60)
排查与解决步骤
1. 端口映射导致的地址访问限制
你启动容器时指定了-p 127.0.0.1:3306:3306,这意味着宿主机仅在本地回环地址(127.0.0.1)暴露3306端口,容器IP(172.17.0.3)无法直接从宿主机访问。优先使用宿主机回环地址连接:
- 修改Python连接字符串:
engine = create_engine("mariadb+mariadbconnector://root:Password123!@127.0.0.1:3306/mdb")
- 修改mysql测试命令:
mysql -h 127.0.0.1 -P 3306 --protocol=TCP -u root -p
2. MariaDB用户权限限制
默认情况下,root用户仅允许从容器内部的localhost访问,即使容器IP可达也会被拒绝。需进入容器授权远程访问:
- 进入容器:
docker exec -it mdb bash
- 登录MariaDB:
mysql -u root -pPassword123!
- 授权root从任意地址访问(或指定特定网段):
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Password123!' WITH GRANT OPTION; FLUSH PRIVILEGES;
完成后退出容器,再尝试用容器IP连接。
3. 错误中的IP不一致问题
错误信息显示的是172.17.0.2,但你使用的是172.17.0.3,大概率是容器重启后IP发生变化:
- 重新执行
docker inspect命令确认最新容器IP; - 或创建自定义Docker网络,给容器分配固定IP,避免IP变动。
4. bind-address配置说明
当前配置中bind-address被注释,MariaDB默认会监听所有地址(0.0.0.0),这部分配置无问题,无需修改。
内容的提问来源于stack exchange,提问作者G M
相关产品推荐
相关产品推荐

