mysql - 无法从一个容器连接到在不同容器中运行的 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)
}
解决方案
推荐阅读
- azure - 如何在 Azure 函数的 Host.json 文件中获取全局设置
- java - 当方向改变时,将对象从一个片段传递到另一个片段
- javascript - 如何遍历对象数组并将结果显示在列表中?
- r - 如何在堆叠条的顶部设置带有观察数的标签
- c++ - 具有相同 src 的多个“strcat”上的内存损坏
- android - 失败:TARGET_KERNEL_BINARIES
- ios - 在 SwiftUI 中使 VStack 填充屏幕的宽度
- javascript - 如何在组件中传递 i18n 的响应
- javascript - SSL 是否足以保证网站的安全?
- python - 如何使用python测试一个数字是否可以击中一系列数字X次?