Docker in docker 和 docker compose 无故阻塞一个端口
Docker in docker and docker compose block one port for no reason
现在我正在设置一个基于 docker 图像进行部署的应用程序。
我使用 gitlab ci 来:
- 测试每项服务
- 构建每个服务
- Docker调整每个图像(创建 docker 容器)
- 运行 集成测试(启动 docker compose 在特定端口上启动所有服务,运行 集成测试)
- 停止产品图像和 运行 新图像
我为每项服务都这样做了,但我 运行 遇到了问题。
当我启动我的 docker 容器进行集成测试时,它会在 gitlab ci 任务中设置。对于每个任务,使用基于 docker 的 运行ner。我还安装了主机 docker 套接字,以便能够在 docker.
中使用 docker
所以我的gradledocker镜像是由gitlab运行ner启动的。然后将安装 docker 并使用 docker compose 启动所有图像。
一个微服务监听端口 10004。在 docker 组合文件中有一个 11004:10004 端口映射。
我的集成测试尝试连接到端口 11004。但这现在不起作用。
当我在 运行 docker 尝试执行集成测试时附加到图像时,我无法通过调用
手动执行此操作
wget ip: port
我刚刚收到消息并等待回复。我的测试都可以成功连接。我的服务不记录有关新连接的任何消息。
当我在我的主机 shell 中执行这个 wget
命令时,它就起作用了。
这是一个 public ip,在我的容器中,我还可以使用 telnet
和 wget
连接到其他端口。当我尝试从 docker 实例中的 docker 连接时,只有一项服务的一个端口被破坏。
当我不使用 docker compose 时,它就可以工作。 Docker compose 似乎设置了一个特殊的cial 默认网络,它做了一些奇怪的事情。
将网络设置为主机也可以...
那么有没有人在使用docker compose时也有过这样的经历?
对于 mac,相同的设置在 docker 中完美无缺,但我的服务器 运行s 在 Debian 8 上。
我现在的解决方案是使用 shell 运行ner 来避免 docker in docker 问题。它也在那里工作。
所以 docker 中的 docker 结合 docker compose 似乎有一个丑陋的错误。
我是坐在地铁里写的,但我希望描述我的问题也足以ci谈论经验。我不认为我们需要一些源代码来找到错误的配置,因为它在 docker 和 Mac.
中没有 docker 的情况下也能工作
我发现 docker 中的 docker 仍然有一些奇怪的行为。我通过添加一个新的 gitlab ci 运行ner 解决了我的问题,它是一个 shell 运行ner。因此 docker-compose 在我的主机上是 运行 并且一切正常。
我可以重复使用相同的 运行ner 在生产中启动 docker 图像,就像我在集成测试中所做的那样。所以简单的修复对我还有另一个好处。
结果是避免陷阱的最佳实践:
仅在确实需要时才在 docker 中使用 docker。
例如,确保您的主机 docker 图像与您感兴趣的 docker 图像之间的快速 io 通信。
祝您使用 docker 愉快(在 docker 中(在 docker 中)):]
现在我正在设置一个基于 docker 图像进行部署的应用程序。
我使用 gitlab ci 来:
- 测试每项服务
- 构建每个服务
- Docker调整每个图像(创建 docker 容器)
- 运行 集成测试(启动 docker compose 在特定端口上启动所有服务,运行 集成测试)
- 停止产品图像和 运行 新图像
我为每项服务都这样做了,但我 运行 遇到了问题。
当我启动我的 docker 容器进行集成测试时,它会在 gitlab ci 任务中设置。对于每个任务,使用基于 docker 的 运行ner。我还安装了主机 docker 套接字,以便能够在 docker.
中使用 docker所以我的gradledocker镜像是由gitlab运行ner启动的。然后将安装 docker 并使用 docker compose 启动所有图像。
一个微服务监听端口 10004。在 docker 组合文件中有一个 11004:10004 端口映射。
我的集成测试尝试连接到端口 11004。但这现在不起作用。
当我在 运行 docker 尝试执行集成测试时附加到图像时,我无法通过调用
手动执行此操作wget ip: port
我刚刚收到消息并等待回复。我的测试都可以成功连接。我的服务不记录有关新连接的任何消息。
当我在我的主机 shell 中执行这个 wget
命令时,它就起作用了。
这是一个 public ip,在我的容器中,我还可以使用 telnet
和 wget
连接到其他端口。当我尝试从 docker 实例中的 docker 连接时,只有一项服务的一个端口被破坏。
当我不使用 docker compose 时,它就可以工作。 Docker compose 似乎设置了一个特殊的cial 默认网络,它做了一些奇怪的事情。
将网络设置为主机也可以...
那么有没有人在使用docker compose时也有过这样的经历?
对于 mac,相同的设置在 docker 中完美无缺,但我的服务器 运行s 在 Debian 8 上。
我现在的解决方案是使用 shell 运行ner 来避免 docker in docker 问题。它也在那里工作。
所以 docker 中的 docker 结合 docker compose 似乎有一个丑陋的错误。
我是坐在地铁里写的,但我希望描述我的问题也足以ci谈论经验。我不认为我们需要一些源代码来找到错误的配置,因为它在 docker 和 Mac.
中没有 docker 的情况下也能工作我发现 docker 中的 docker 仍然有一些奇怪的行为。我通过添加一个新的 gitlab ci 运行ner 解决了我的问题,它是一个 shell 运行ner。因此 docker-compose 在我的主机上是 运行 并且一切正常。
我可以重复使用相同的 运行ner 在生产中启动 docker 图像,就像我在集成测试中所做的那样。所以简单的修复对我还有另一个好处。
结果是避免陷阱的最佳实践:
仅在确实需要时才在 docker 中使用 docker。
例如,确保您的主机 docker 图像与您感兴趣的 docker 图像之间的快速 io 通信。
祝您使用 docker 愉快(在 docker 中(在 docker 中)):]