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容器以运行我的应用程序
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集成
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集装箱的日志:
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进行
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