本地Go程序连接Docker中MySQL遇连接拒绝问题求解决方案
不用docker-compose解决本地Go程序连接Docker中MySQL的问题
先明确两个错误的原因
- 用
localhost:3306报错连接拒绝:要么是创建容器时没做端口映射,本地无法访问容器内的3306端口;要么是容器内的MySQL只绑定了127.0.0.1(仅容器内部可访问),即使映射了端口也没用。 - 用容器名
db01报错找不到主机:容器名的DNS解析只在同一个Docker网络内部生效,本地Go程序不在Docker网络里,自然解析不了这个名字。
两种不用docker-compose的解决方法
方法1:端口映射+localhost访问
重新创建容器时加上端口映射参数(如果已创建容器,先停删再重建):
docker run -d -p 3306:3306 --name db01 -e MYSQL_ROOT_PASSWORD=你的密码 mysql:latest-p 3306:3306是把容器的3306端口映射到本地的3306端口- 官方MySQL镜像默认让MySQL绑定
0.0.0.0(允许所有IP访问),无需额外修改配置
Go代码里的DSN改成:
dsn := "root:你的密码@tcp(localhost:3306)/你的数据库名?charset=utf8mb4&parseTime=True&loc=Local"
方法2:直接用容器IP访问(无需端口映射)
先查询容器的内部IP:
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' db01执行后会输出类似
172.17.0.2的IP地址Go代码里用这个IP替换localhost:
dsn := "root:你的密码@tcp(172.17.0.2:3306)/你的数据库名?charset=utf8mb4&parseTime=True&loc=Local"- 注意:容器重启后IP可能会变化,适合临时测试场景
额外检查项
- 确认容器在运行:执行
docker ps,查看db01的状态为Up - 确认容器内MySQL正常:执行
docker exec -it db01 mysql -uroot -p,输入密码能进入MySQL命令行即可 - 确认Go代码导入了MySQL驱动:必须添加
_ "github.com/go-sql-driver/mysql"(仅注册驱动,无需直接调用)
内容的提问来源于stack exchange,提问作者Jassy
相关产品推荐
相关产品推荐

