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

标签 docker jenkins containers devops dockerhub

我正在尝试以下操作:

  • 在一个带有暴露端口的容器中旋转 MySQL 5.5,比如 4200。
  • 在一个带有暴露端口的容器中旋转 MySQL 5.7,比如 4300。
  • 旋转一个 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
    

    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 为:
  • 尝试使用 docker cli 命令完成上述操作,以便使用官方 docker 镜像轻松集成 jenkins。

  • 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 组合:
  • dsn = "root:root@tcp(localhost:4200)/"
  • dsn = "root:root@tcp(172.17.0.0.x:4200)/"(docker0 ip)
  • dbname="somename"

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

    最佳答案

    感谢上面的答案,我能够解决我的问题。

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

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

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

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

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

  • Docker Networks

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

    docker 0:
    带有 IP 的 Docker0 接口(interface)。

    Docker0

    现在,进入命令:

    使用此命令获取容器的 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:

    dockercontainer ips

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

    引用:

    叠加网

    enter image description here

    用户自定义网桥

    enter image description here

    默认桥接网络

    enter image description here

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

    谢谢 :)

    关于docker - 从另一个容器访问一个容器中的 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56667414/

    相关文章:

    ios - 为 import_from_git 传递变量

    java - 使用 jenkins cli、jdk 8.144、jenkins v2.93 时获取 Java IO 异常

    node.js - 使用 Azure Docker 容器映射端口

    docker - 将数据摄取到德鲁伊时出现错误 : curl: (52) Empty reply from server ,

    docker - RabbitMQ 客户端在运行 docker-compose up 命令时抛出错误

    go -/bin/sh : 1: gvm: not found

    node.js - postman 未到达 AWS EKS API 终端 Node

    jenkins - 我如何使用指定的参数在 jenkins 中获取最新版本

    css - 在不丢失滚动条的情况下缩放容器以监视大小?

    ubuntu - Ubuntu下docker + ufw的最佳实践是什么