首页 > 解决方案 > 无法从一个容器连接到在不同容器中运行的 MySQL 实例

问题描述

我无法从一个容器连接到在另一个容器中运行的 MySQL 实例。安装程序可以在 MacOS 上运行,但不能在 Windows 上运行。

我有 docker-compose 和两个服务:App 和 DB:

我正在等待数据库被初始化。然后我尝试在我的 Go 应用程序中 ping db。

这是连接字符串:root:pass@tcp(db:3060)/orders?loc=Local&parseTime=1. 用户正确。密码正确。主机名也正确。端口正确。但我得到了错误:

dial tcp 192.168.48.2:3060: connect: connection refused

凭证没问题,因为我可以同时从我的主机连接到数据库。

我正在使用 Go MySQL 驱动程序和 MySQL 5.7。我也试过 MySQL 8 - 同样的效果。

在我的 docker-compose.yml 下面

version: "3.7"
services:
  db:
    image: mysql:5.7
    container_name: golang-example-api-db
    # restart: on-failure
    tty: true
    ports:
        - "33306:3306"
    environment:
      MYSQL_USER: root
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: orders
      SERVICE_TAGS: prod
      SERVICE_NAME: mysql
      TZ: Asia/Bangkok
    volumes:
      - orders-db:/var/lib/mysql
    networks:
        - app-network
  app:
    build:
      context: .  
      dockerfile: Dockerfile
    image: kodersky/golang-api-example
    container_name: golang-api-example-api
    restart: on-failure
    tty: true
    environment:
      SERVICE_NAME: golang
      SERVICE_TAGS: prod
      TERM: xterm-256color
      TZ: Asia/Bangkok
      WAIT_HOSTS: db:3306
    depends_on:
      - db
    command: sh -c '/wait && /go/src/github.com/kodersky/golang-api-example/main'
    networks:
        - app-network

戈朗代码:

connection := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", dbUser, dbPass, dbHost, dbPort, dbName)
val := url.Values{}
val.Add("parseTime", "1")
val.Add("loc", "Local")
dsn := fmt.Sprintf("%s?%s", connection, val.Encode())
dbConn, err := sql.Open(`mysql`, dsn)

if err != nil && viper.GetBool("debug") {
    log.Println(err)
}
err = dbConn.Ping()
if err != nil {
    log.Fatal(err)
}

标签: mysqldockergodocker-compose

解决方案


推荐阅读