Abh*_*hna 1 containers jenkins docker dockerhub devops
我正在尝试以下方法:
我的想法是我需要针对不同的数据库版本运行测试。
为此,我需要能够与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
Run Code Online (Sandbox Code Playgroud)
高朗应用程式容器
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"
Run Code Online (Sandbox Code Playgroud)
方法2-使用--net(网桥网络和主机): 创建网桥nw
码头工人网络
MYSQL容器:
docker run --name mysql55c --net mynw -p 127.0.0.1:4200:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.5
Run Code Online (Sandbox Code Playgroud)
高朗应用程式容器
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"
Run Code Online (Sandbox Code Playgroud)
我没有建立自己的桥梁网络,我也很累
--net主机
我能够从主机-mysql工作台连接到sql容器。但是,尝试连接到容器内的mysql服务器时,golangapp出现连接被拒绝错误。
所有容器都在同一主机上。
我没有使用dockerfile或docker compose为:
转到使用配置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
}
Run Code Online (Sandbox Code Playgroud)
我在配置中尝试过的dsn url组合:
dsn =“ root:root @ tcp(172.17.0.0.x:4200)/”(docker0 ip)
dbname =“ somename”
我们如何看待以上内容?欢迎提供有关实现我的目标的最佳实践或新方法的建议:)需要帮助!!谢谢 :)
由于上述答案,我能够解决我的问题。
任何了解 docker 网络基础知识并且只想要解决方案的人都可以完全忽略这个答案。
我正在为可能刚开始使用 docker 并且对 docker 网络没有明确了解的任何人写这个答案。
问题:不同 docker 容器之间的通信。
要在 docker 中的 n 个不同容器之间进行通信,我们首先需要了解 docker 网络是如何工作的:
上图可以帮助你更好地理解它。
Docker0 : Docker0 与 IP 的接口。
现在,进入命令:
使用此命令获取容器的 IP:
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 桥接网络在容器之间进行通信。
以供参考:
覆盖网络
用户定义桥
默认桥接网络
希望以上内容有帮助,如有不对的地方欢迎指正。
谢谢 :)
这应该工作,请按照下列步骤操作:
docker run --name mysql55c -p 4200:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.5Dockerfile使用以下内容为golang 创建:FROM golang:latest
COPY . /
RUN go get "github.com/go-sql-driver/mysql"
CMD go run /main.go
Run Code Online (Sandbox Code Playgroud)
main.go使用以下内容创建:package main
import(
_ "github.com/go-sql-driver/mysql"
"database/sql"
"log"
)
func main() {
// Open up our database connection.
db, err := sql.Open("mysql", "root:root@tcp(192.168.0.33:4200)/mysql")
// if there is an error opening the connection, handle it
if err != nil {
log.Print(err.Error())
} else {
log.Print("DB connected successfully")
}
defer db.Close()
}
Run Code Online (Sandbox Code Playgroud)
docker build -t goapp .docker run -itd goapp$ docker logs dbd5294abd61
2019/06/19 13:24:17 DB connected successfully
Run Code Online (Sandbox Code Playgroud)
注意:我运行了mysql容器,该容器暴露在主机的4200端口上。在golang代码中,我的连接字符串是我的机器的专用ip root:root@tcp(192.168.0.33:4200)/mysql所在的位置192.168.0.33。
您的主要收获应该是您的数据库连接字符串应指向主机的私有/公共ip。如果您在没有容器链接的情况下运行golang。
如果在运行golang时使用了容器链接,
docker run -itd --link mysql55c:mydb goapp那么golang代码中的mysql连接字符串应该是root:root@tcp(mydb:4200)/mysql
试试这个,让我知道。