如何通过 HTTP 访问从另一个安装了 /var/run/docker.sock 的容器创建的容器?

How to hit through HTTP a container created from another container mounted with /var/run/docker.sock?

这是 CI 服务器设置。 CI 没有安装 node 等工具, 仅 Docker。所以我必须 运行 在容器中进行测试。

此容器将依次创建第二个容器以运行 集成测试。

第一个容器已安装 /var/run/docker.sock,以便它可以创建第二个容器。 两个容器并排生活

我的构建步骤如下:

  1. 克隆源代码
  2. 构建 docker 图像并标记它 my-app
  3. 运行 单元测试 docker run ..... my-app yarn test
  4. 运行 集成测试,启动容器docker run -v /var/run/docker.sock:/var/run/docker.sock ..... my-app yarn test:integration

问题出在集成测试中:

总而言之,第一个容器调用 yarn:integration 启动第二个容器 运行 在端口 3001 上连接应用程序,然后 运行 对第二个容器进行测试。最后,它停止了第二个容器。

问题是我在第一个容器中的集成测试试图通过 localhost:3001 访问第二个容器,但是 localhost 不是第二个容器的正确主机。

考虑到它们是并排的(而不是一个在另一个中),我如何从第一个容器访问第二个容器?

容器内的

localhost不指向宿主机,它指向容器本身。如果你想访问另一个容器,你需要使用那个 容器的实际 IP,它可以被 docker inspect <CONTAINER ID> 内部端口 发现(即 不是 映射到您的主机的那个)。

或者,您可以为它创建一个 user-defined network and connect 您的容器。然后您将能够使用容器名称作为主机名,例如my-app:3001。请注意,容器名称是由 docker run--name 参数指定的名称。您还需要使用容器的内部端口和 而不是 使用 -p 参数发布的端口。