You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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可达也会被拒绝。需进入容器授权远程访问:

  1. 进入容器:
docker exec -it mdb bash
  1. 登录MariaDB:
mysql -u root -pPassword123!
  1. 授权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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 21:17:11