如何通过 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
,以便它可以创建第二个容器。 两个容器并排生活。
我的构建步骤如下:
- 克隆源代码
- 构建 docker 图像并标记它
my-app
- 运行 单元测试
docker run ..... my-app yarn test
- 运行 集成测试,启动容器。
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
参数发布的端口。
这是 CI 服务器设置。 CI 没有安装 node
等工具, 仅 Docker。所以我必须 运行 在容器中进行测试。
此容器将依次创建第二个容器以运行 集成测试。
第一个容器已安装 /var/run/docker.sock
,以便它可以创建第二个容器。 两个容器并排生活。
我的构建步骤如下:
- 克隆源代码
- 构建 docker 图像并标记它
my-app
- 运行 单元测试
docker run ..... my-app yarn test
- 运行 集成测试,启动容器。
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
参数发布的端口。