我正在尝试以下操作:
这个想法是我需要我的测试来针对不同的数据库版本运行。
为此,我需要能够与我的 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):
创建网桥 nw
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"
我没有创建自己的桥接网络,我也很累
--net host
我能够从主机连接到 sql 容器 - mysql 工作台。
但是,当尝试连接到容器内的 mysql 服务器时,golangapp 出现连接被拒绝错误。
所有容器都在同一主机上。
我没有使用 dockerfile 或 docker compose 为:
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 组合:
我们如何看待以上内容?
欢迎提出关于实现我的目标的最佳实践或新方法的建议:)
需要帮忙!!
谢谢 :)
最佳答案
感谢上面的答案,我能够解决我的问题。
任何了解 docker 网络基础知识并且只想要解决方案的人都可以完全忽略这个答案。
我正在为可能刚开始使用 docker 并且对 docker 网络没有清晰了解的任何人写这个答案。
问题:不同 docker 容器之间的通信。
要在 docker 中的 n 个不同容器之间进行通信,我们首先需要了解 docker 网络是如何工作的:
这基本上是一个虚拟以太网桥,可以自动与连接到它的任何其他网络接口(interface)通信。
上图可以帮助您更好地理解它。
docker 0:
带有 IP 的 Docker0 接口(interface)。
现在,进入命令:
使用此命令获取容器的 IP:
How to get a Docker container's IP address from the host?
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id
SQL 容器:
docker run --name mysql55c -p 4500:3306 -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=db_ngen -d mysql:5.5
上面的命令创建了一个名为 mysql55c 的容器,其 ip 从 docker0 子网。
Golang 容器
docker run -w /go/src/app -it -d --name golangapp --link mysql55c:db -v $(pwd):/go/src/app golang bash
上面的容器创建了一个名为 golangapp 的容器。
重要的是要观察
--link
命令。该命令允许两个容器相互发现。
但是在引入 docker 网络功能之后,可以使用 docker 默认桥接网络或用户定义的网络来完成。
容器IP:
现在,我们可以看到我们可以使用默认的 docker bridge 网络在容器之间进行通信。
引用:
叠加网
用户自定义网桥
默认桥接网络
希望以上内容对您有所帮助,如果我在任何地方错了,请随时纠正我。
谢谢 :)
关于docker - 从另一个容器访问一个容器中的 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56667414/