从另一个 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 时)。
当我运行:
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.
详细描述了此方法的示例
- 首先,user-defined 应创建网络:
docker network create <network-name>
- 列出您新创建的网络并使用
inspect
命令检查它的 IP 地址,并且没有容器连接到它:
docker network ls
docker network inspect <network-name>
- 您可以在容器开始时使用
--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>
- 要验证您的容器是否已连接到网络,请再次检查
docker network inspect
命令。
连接到网络后,容器可以相互通信,您可以使用另一个容器的 IP 地址或名称连接到它们。
EDIT: 正如@Eitan 所建议的,在 root:12345@tcp(127.0.0.1:3306)/test
中引用网络而不是更改 IP 地址时, 可以使用特殊的 DNS 名称 host.docker.internal
- 它解析为主机使用的内部 IP 地址。
我正在使用 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 时)。
当我运行:
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.- 首先,user-defined 应创建网络:
docker network create <network-name>
- 列出您新创建的网络并使用
inspect
命令检查它的 IP 地址,并且没有容器连接到它:
docker network ls docker network inspect <network-name>
- 您可以在容器开始时使用
--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>
- 要验证您的容器是否已连接到网络,请再次检查
docker network inspect
命令。
连接到网络后,容器可以相互通信,您可以使用另一个容器的 IP 地址或名称连接到它们。
EDIT: 正如@Eitan 所建议的,在 root:12345@tcp(127.0.0.1:3306)/test
中引用网络而不是更改 IP 地址时, 可以使用特殊的 DNS 名称 host.docker.internal
- 它解析为主机使用的内部 IP 地址。