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

容器内Go应用无法连接同Docker Compose中的MySQL容器

解决Docker Compose中Go应用连接MySQL的连接拒绝问题

问题分析

你的Go应用与MySQL服务同属一个Docker Compose网络,但无论使用localhost:3306还是服务名predictiondb:3306都无法连接,报错dial tcp 172.18.0.2:3306: connect: connection refused。结合排查信息,核心问题大概率是MySQL用户权限/认证插件不兼容,以及可能的服务就绪时机不匹配。

解决方案

1. 修复MySQL root用户的远程访问权限与认证插件

MySQL 8.0默认root用户仅允许本地localhost访问,且默认使用caching_sha2_password认证插件,而go-sql-driver/mysql对该插件的支持需要额外配置,建议直接修改为兼容的mysql_native_password并开放远程访问:

  • 进入MySQL容器执行命令:
docker exec -it predictiondb mysql -uroot -proot
  • 在MySQL命令行中执行授权语句:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
FLUSH PRIVILEGES;

这条语句允许root用户从任何地址(%)访问,并使用旧版兼容的认证插件。

2. 修正Go应用的数据库连接串

使用服务名predictiondb(Docker Compose自动解析为容器IP),并添加必要的连接参数:

import (
    "database/sql"
    "log"

    _ "github.com/go-sql-driver/mysql"
)

func main() {
    // 添加parseTime=true(处理时间类型)和tls=skip-verify(跳过容器间TLS验证)
    db, err := sql.Open("mysql", "root:root@tcp(predictiondb:3306)/prediction?parseTime=true&tls=skip-verify")
    if err != nil {
        panic(err)
    }
    defer db.Close()
    
    err = db.Ping()
    if err != nil {
       log.Fatal(err)
    }
    log.Println("数据库连接成功")
}

3. 确保MySQL服务完全就绪后启动应用

depends_on仅保证容器启动顺序,不确保MySQL服务已完成初始化。给MySQL服务添加健康检查,让应用在MySQL真正就绪后再启动:

修改docker-compose.yml中的predictiondb和Platform配置:

Platform:
    networks:
      - shared
    image: platform
    build:
      context: ../../../
      dockerfile: Dockerfile.slt
    container_name: platform
    ports:
      - 7777:7777
      - 1053:1053
    volumes:
      - /tmp/server:/tmp/server
    restart: unless-stopped
    env_file:
      - docker.env
    depends_on:
      predictiondb:
        condition: service_healthy # 等待MySQL健康检查通过
predictiondb:
    networks:
      - shared
    image: mysql:latest
    restart: always
    container_name: predictiondb
    environment:
      MYSQL_ROOT_PASSWORD: "root"
      MYSQL_DATABASE: "prediction"
    ports:
      - 3306:3306
    expose:
      - 3306
    volumes:
      - predictiondb:/var/lib/mysql
    healthcheck: # 添加健康检查
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-proot"]
      interval: 5s
      timeout: 5s
      retries: 5

验证步骤

  1. 停止并重新启动所有容器:docker-compose down && docker-compose up -d
  2. 查看应用容器日志:docker logs platform,确认是否输出连接成功信息
  3. 若仍有问题,可进入应用容器测试连通性:docker exec -it platform ping predictiondb,确认网络可达

内容的提问来源于stack exchange,提问作者whishky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 10:15:41