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

Abh*_*hna 1 containers jenkins docker dockerhub devops

我正在尝试以下方法:

  • 在一个带有暴露端口(例如4200)的容器中旋转MySQL 5.5。
  • 在一个带有裸露端口(例如4300)的容器中旋转MySQL 5.7。
  • 旋转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
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为:

  • 尝试使用docker cli命令完成上述操作,以使用官方docker映像轻松实现jenkins集成。

转到使用配置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(localhost:4200)/”
  • dsn =“ root:root @ tcp(172.17.0.0.x:4200)/”(docker0 ip)

  • dbname =“ somename”

我们如何看待以上内容?欢迎提供有关实现我的目标的最佳实践或新方法的建议:)需要帮助!!谢谢 :)

Abh*_*hna 6

由于上述答案,我能够解决我的问题。

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

我正在为可能刚开始使用 docker 并且对 docker 网络没有明确了解的任何人写这个答案。

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

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

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

码头工人网络

上图可以帮助你更好地理解它。

Docker0 : Docker0 与 IP 的接口。

Docker0

现在,进入命令:

使用此命令获取容器的 IP:

如何从主机获取 Docker 容器的 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容器ips

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

以供参考:

覆盖网络

在此处输入图片说明

用户定义桥

在此处输入图片说明

默认桥接网络

在此处输入图片说明

希望以上内容有帮助,如有不对的地方欢迎指正。

谢谢 :)


mch*_*wre 5

这应该工作,请按照下列步骤操作:

  • 运行mysql容器 docker run --name mysql55c -p 4200:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.5
  • Dockerfile使用以下内容为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)
  • 使用以下命令构建golang容器映像 docker build -t goapp .
  • 运行golang容器 docker run -itd goapp
  • 检查golang容器的日志:
$ 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

试试这个,让我知道。