Docker 从另一个容器访问一个容器中的MySQL

Docker 从另一个容器访问一个容器中的MySQL,docker,jenkins,containers,devops,dockerhub,Docker,Jenkins,Containers,Devops,Dockerhub,我正在尝试以下操作: docker run --name mysql55c -p 127.0.0.1:4200:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.5 docker run --name mysql55c --net mynw -p 127.0.0.1:4200:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.5 将MySQL 5.5放在一个容器中,容器中有一个暴露的端口,比如4200 将MySQL

我正在尝试以下操作:

docker run --name mysql55c -p 127.0.0.1:4200:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.5
docker run --name mysql55c --net mynw -p 127.0.0.1:4200:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.5
  • 将MySQL 5.5放在一个容器中,容器中有一个暴露的端口,比如4200
  • 将MySQL 5.7放在一个容器中,容器中有一个暴露的端口,比如4300
  • 旋转golang容器以运行我的应用程序
我的想法是需要针对不同的数据库版本运行测试

为此,我需要能够与golang容器中的每个sql容器进行对话

我尝试过的:

docker run --name mysql55c -p 127.0.0.1:4200:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.5
docker run --name mysql55c --net mynw -p 127.0.0.1:4200:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.5
方法1-使用--link:

docker run --name mysql55c -p 127.0.0.1:4200:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.5
docker run --name mysql55c --net mynw -p 127.0.0.1:4200:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.5
MYSQL容器:

docker run --name mysql55c -p 127.0.0.1:4200:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.5
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 --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"
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"
方法2-使用--net(网桥网络和主机): 新建一座西北向桥梁

docker网络mynw

MYSQL容器:

docker run --name mysql55c -p 127.0.0.1:4200:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.5
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 --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"
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"
我没有建立自己的桥梁网络,我也很累

--网络主机

我能够从host-mysql工作台连接到sql容器。 但是,golangapp在尝试连接到容器中的mysql服务器时遇到连接被拒绝错误

所有容器都位于同一主机上

我没有使用dockerfile或docker compose作为:

docker run --name mysql55c -p 127.0.0.1:4200:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.5
docker run --name mysql55c --net mynw -p 127.0.0.1:4200:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.5
  • 尝试使用docker cli命令完成上述操作,以便使用正式docker映像轻松实现jenkins集成
使用配置url连接数据库的Go代码

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组合:

docker run --name mysql55c -p 127.0.0.1:4200:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.5
docker run --name mysql55c --net mynw -p 127.0.0.1:4200:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.5
  • dsn=“根目录:root@tcp(本地主机:4200)/“
  • dsn=“根目录:root@tcp(172.17.0.0.x:4200)/(docker0 ip)

  • dbname=“somename”

我们如何看待上述问题? 欢迎就实现我的目标的最佳做法或新方法提出建议:) 需要帮助!!
谢谢:)

这应该有效,请按照以下步骤操作:

  • 运行mysql容器
    docker运行——名称mysql55c-p 4200:3306-e mysql\u ROOT\u PASSWORD=ROOT-d mysql:5.5
  • 为golang创建具有以下内容的
    Dockerfile
  • 使用以下内容创建
    main.go
  • 使用
    docker Build-t goapp构建golang容器映像。
  • 运行golang集装箱
    docker运行-itd goapp
  • 检查golang集装箱的日志:
注意:我运行了mysql容器,它暴露在主机的4200端口上。在golang代码中,我的连接字符串是
root:root@tcp(192.168.0.33:4200)/mysql
其中
192.168.0.33
是我机器的私有ip

您的主要收获应该是db连接字符串应该指向主机的私有/公共ip。如果您在没有容器链接的情况下运行golang

如果在运行golang时使用容器链接,请假设
docker run-itd--link mysql55c:mydb goapp
那么golang代码中的mysql连接字符串应该是
root:root@tcp(mydb:4200)/mysql


试试这个,让我知道。

多亏了上面的答案,我才能够解决我的问题

任何了解docker networks基础知识并只想要解决方案的人都可以完全忽略这个答案。

我写这个答案的人谁可能刚刚开始docker和没有一个docker网络的明确理解

问题:不同docker容器之间的通信

要在docker中的n个不同容器之间进行通信,我们首先需要了解docker网络的工作原理:

  • 每当我们在主机中安装docker时,就会创建docker0虚拟接口/网桥。 这基本上是一个虚拟以太网网桥,可以自动与连接到它的任何其他网络接口进行通信
  • docker 0接口有一个ip地址,比如说172.0.0.x
  • 来自此IP的后续容器子网
  • 因此,容器之间的任何通信都可以通过docker网桥或使用主机专用IP进行

上面的图表可以帮助您更好地理解它

Docker0: Docker0与IP的接口

现在,进入命令:

docker run --name mysql55c -p 127.0.0.1:4200:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.5
docker run --name mysql55c --net mynw -p 127.0.0.1:4200:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.5
使用以下命令获取容器的IP:

docker inspect-f'{{range .NetworkSettings.Networks}{{.IPAddress}{{end}}'容器\u name\u或\u id

SQL容器:

docker run——名称mysql55c-p 4500:3306-e MYSQL\u ROOT\u PASSWORD=ROOT-e MYSQL\u DATABASE=db\u ngen-d MYSQL:5.5

上面的命令创建了一个名为mysql55c的容器,其中ip子网来自docker0

戈朗集装箱

docker run-w/go/src/app-it-d——名称golangapp——链接mysql55c:db -v$(pwd):/go/src/app golang bash

上面的容器创建了一个名为golangapp的容器

需要注意的重要事项是
--link
命令。
此命令允许两个容器相互发现。
但在引入docker网络功能后,可以使用docker默认网桥网络或用户定义的网络来完成此操作

容器Ip的:

现在,我们可以看到,我们可以使用默认的docker桥网络在容器之间进行通信

供参考:

docker run --name mysql55c -p 127.0.0.1:4200:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.5
docker run --name mysql55c --net mynw -p 127.0.0.1:4200:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.5
覆盖网络

用户定义桥

默认网桥网络

希望以上内容有帮助,如果我在任何地方出错,请随时纠正我


谢谢:)

Go代码使用的数据库连接URL正确吗?(只是为了确保)@andreybleme是的,我用来连接的url正如我在配置中提到的。我使用go中的mysql驱动程序连接到它。也将更新go代码:)
mysqld--verbose--help | grep bind address
=>检查绑定-address@Ntwobike我查了b