从另一个 docker 调用一个 docker 遇到连接被拒绝

Calling one docker from another docker encountered connection refused

我正在使用 kubernetes(通过 windows 10 - docker 桌面)。

我正在使用 mysql,即由 helm 3 运行ning(从 bitnami 存储库加载)。

我正在创建另一个应用程序。 现在,我正在 docker 上进行测试(还没有在 kubernetes 中)。

一切正常,但是当尝试从我的项目连接数据库时 (顺便说一句 - 项目工作正常,但在 docker 上 运行ning 时就不行了)。

类似于:

docker run --name test-docker --rm my-image:tag --db "root:12345@tcp(127.0.0.1:3306)/test" 

(db 是连接到 db 的参数)。

我收到消息:

2022-02-21T12:18:17.205Z        FATAL   failed to open db: could not setup schema: cannot create jobs table: dial tcp 127.0.0.1:3306: connect: connection refused

我调查了一下,发现问题可能是因为 dockers 运行ning 需要 运行 在同一个网络上。 (尽管如此,它们实际上是 dockers,当一个被 K8S 的 helm 工具 运行ning 时)。

这是在: kubernetes networking

当我运行:

nsenter -t your-container-pid -n ip addr

pid 不是目录,所以我得到消息:

/proc/<pid>/ns/net - No such file or directory

我怎样才能最终运行我的项目可以使用mysql(运行ning in dockers on K8S)?

谢谢。

Docker 容器默认与其他容器和外部网络隔离。在 Docker 个容器之间建立连接有几个选项:

  • Docker 自动设置一个默认的 bridge 网络,通过它可以在容器之间以及容器与主机之间进行通信。您的两个容器都应该在 bridge 网络上 - 用于您的项目的容器通过引用它的名称连接到您的数据库容器。有关此方法及其设置方式的更多详细信息,请参见 here

  • 您还可以创建 user-defined 桥接网络 - 基本上,您自己的自定义桥接网络 - 并将您的 Docker 容器附加到它。这样,两个容器都不会连接到默认的 bridge 网络。 here.

    详细描述了此方法的示例
    1. 首先,user-defined 应创建网络:
    docker network create <network-name>
    
    1. 列出您新创建的网络并使用 inspect 命令检查它的 IP 地址,并且没有容器连接到它:
    docker network ls
    docker network inspect <network-name>
    
    1. 您可以在容器开始时使用 --network 标志连接容器:
    docker run -dit --name <container-name1> --network <network-name> 
    docker run -dit --name <container-name2> --network <network-name> 
    

    或通过 docker network connect 将 运行 个容器按名称或 ID 附加到您新创建的网络 - 列出了更多选项 here:

    docker network connect <network-name> <container-name1>
    docker network connect <network-name> <container-name2>
    
    1. 要验证您的容器是否已连接到网络,请再次检查 docker network inspect 命令。

连接到网络后,容器可以相互通信,您可以使用另一个容器的 IP 地址或名称连接到它们。

EDIT: 正如@Eitan 所建议的,在 root:12345@tcp(127.0.0.1:3306)/test 中引用网络而不是更改 IP 地址时, 可以使用特殊的 DNS 名称 host.docker.internal - 它解析为主机使用的内部 IP 地址。