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

使用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部署

  1. 在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"
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 17:06:21