【发布时间】:2019-11-02 04:16:59
【问题描述】:
我正在尝试以下方法:
- 在一个带有暴露端口的容器中运行 MySQL 5.5,例如 4200。
- 在一个带有暴露端口的容器中运行 MySQL 5.7,比如 4300。
- 旋转一个 golang 容器来运行我的应用程序。
我的想法是我需要针对不同的数据库版本运行测试。
为此,我需要能够与我的 golang 容器中的每个 sql 容器通信。
我尝试过的:
方法 1 - 使用 --link:
MYSQL 容器:
docker run --name mysql55c -p 127.0.0.1:4200:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.5
GO LANG 应用容器
docker run -w /go/src/app -it --link mysql55c -d --name golangapp -v $(pwd):/go/src/app golang bash -c "go get github.com/go-sql-driver/mysql;go build main.go; go test -v
--config ./config.ini"
方法 2 - 使用 --net (bridge network &host): 创建一座桥梁
docker network mynw
MYSQL 容器:
docker run --name mysql55c --net mynw -p 127.0.0.1:4200:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.5
GO LANG 应用容器
docker run -w /go/src/app -it --net mynw -d --name golangapp -v $(pwd):/go/src/app golang bash -c "go get github.com/go-sql-driver/mysql;go build main.go; go test -v
--config ./config.ini"
没有自己搭建桥接网络,我也累了
--网络主机
我能够从主机连接到 sql 容器 - mysql 工作台。 但是,当尝试连接到容器内的 mysql 服务器时,golangapp 出现连接被拒绝错误。
所有容器都在同一个主机上。
我没有使用 dockerfile 或 docker compose as:
- 尝试使用 docker cli 命令完成上述操作,以便使用官方 docker 映像轻松集成 jenkins。
Go 代码使用配置 url 连接到数据库
func dbconn() (*sql.DB, error) {
opendb, err := sql.Open("mysql", *dsn + *dbname) //coming from flag
if err != nil {
return nil, err
}
return opendb, nil
}
我在配置中尝试过的dsn url组合:
- dsn = "root:root@tcp(localhost:4200)/"
dsn = "root:root@tcp(172.17.0.0.x:4200)/" (docker0 ip)
dbname="somename"
我们如何看待上面的内容? 欢迎提出关于实现我的目标的最佳实践或新方法的建议:) 需要帮忙!! 谢谢你:)
【问题讨论】:
-
您的 Go 代码使用的数据库连接 URL 是否正确? (只是为了确保)
-
@andreybleme 是的,我用来连接的 url 就像我在上面的配置中提到的那样。我正在使用 mysql 驱动程序连接到它。也会更新 go 代码:)
-
mysqld --verbose --help | grep bind-address=> 检查绑定地址 -
@Ntwobike 我使用上述命令检查了 mysql55c 容器内的绑定地址,没有设置默认绑定地址。这是问题吗?如果是,我是否需要编写一个 docker 文件将绑定地址设置为
0.0.0.0或者我可以使用 docker run 吗? -
如果它的 0.0.0.0 或根本不存在,那么您可以从任何 ip 连接。然后检查您的用户是否可以从 docker network
SELECT user,host FROM mysql.user连接; =>user | %或user | 172.*我也希望你在你的 Go 应用程序中通过容器名称来引用 mysql?
标签: docker jenkins containers devops dockerhub