容器内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
验证步骤
- 停止并重新启动所有容器:
docker-compose down && docker-compose up -d - 查看应用容器日志:
docker logs platform,确认是否输出连接成功信息 - 若仍有问题,可进入应用容器测试连通性:
docker exec -it platform ping predictiondb,确认网络可达
内容的提问来源于stack exchange,提问作者whishky
相关产品推荐
相关产品推荐

