使用Golang+Gin+Gorm连接Docker中MySQL失败:找不到主机bookstoreDB
问题解决:Gorm连接Docker中MySQL出现"no such host"错误
问题原因
你遇到的dial tcp: lookup bookstoreDB on 172.22.64.1:53: no such host错误,本质是主机名解析失败,分两种场景:
- 如果你的Go程序在本地(Docker容器外)运行:本地DNS无法识别Docker容器名
bookstoreDB - 如果你的Go程序也在Docker容器内:Docker Compose的DNS解析基于服务名而非容器名,你误用了容器名
bookstoreDB而非服务名mysql_server
解决方案
场景1:Go程序在本地运行
直接把连接字符串里的bookstoreDB替换为localhost或127.0.0.1(docker-compose已将MySQL的3306端口映射到本地):
func Connect() { d, err := gorm.Open("mysql", "docker:password@tcp(localhost)/bookstore") if err != nil { panic(err) } db = d }
场景2:Go程序也通过Docker Compose部署
- 在
docker-compose.yml中添加你的Go服务(示例):
version: "3.8" services: mysql_server: image: mysql:8.0 container_name: bookstoreDB environment: - MYSQL_DATABASE=bookstore - MYSQL_USER=docker - MYSQL_PASSWORD=password - MYSQL_ROOT_PASSWORD=password ports: - "3306:3306" # 添加Go服务 go_app: build: . # 假设你的Dockerfile在当前目录 depends_on: - mysql_server ports: - "8080:8080"
- 修改Gorm连接字符串,使用MySQL服务的服务名
mysql_server而非容器名:
func Connect() { d, err := gorm.Open("mysql", "docker:password@tcp(mysql_server)/bookstore") if err != nil { panic(err) } db = d }
额外检查项
- 确认MySQL容器状态正常(你的
docker-compose ps显示已Up,此点没问题) - 确认连接字符串中的用户名、密码、数据库名与
docker-compose.yml中的环境变量完全一致
内容的提问来源于stack exchange,提问作者luigi
相关产品推荐
相关产品推荐

