docker-compose - docker 容器 A 可以使用什么 URL 访问另一个 docker 容器 B(相同的开发机器,不同的项目)

标签 docker-compose docker-networking

假设我们只在某些开发阶段很少需要这样做(冒烟测试几个 api 调用),让项目 Bar 中的 dockerized web 服务访问 Project Foo 中的 dockerized web 服务的最简单方法是什么?

在开发 Mac 上,Docker Engine:18.09.2,Compose:1.23.2,我们有 Project Foo 和 Project Bar,它们都有自己的 docker-compose 文件,每个文件都有一个 Web 服务和一个数据库服务。

通常它们是独立运行的,并且是独立开发的。

然而,Project Foo 的 web 服务托管了一个 API,我们只是偶尔想从 Project Bar 的 web 容器中访问它

它们被分配到不同的主机端口,docker ps显示 Project Foo 使用端口 0.0.0.0:3000->3000/tcp(例如,我们使用 localhost:3000 从 Mac 的浏览器访问 Web 服务。Project Bar 使用端口 0.0.0.0:3010->3010/tcp
docker inspect Foo 显示其 IP 地址为“172.18.0.3”(网关“172.18.0.1”),Bar 显示其 IP 地址为“172.22.0.4”(网关“172.22.0.1”)
docker network ls表明他们都使用相同的“桥”驱动程序。

两个项目都在 Mac 上运行,总共 4 个容器,(Foo 上的 web+db,Bar 上的 web+db)

如果在 Bar 上运行的程序(Ruby)需要访问 Foo 上的 REST URL,那么 Foo 上的“/api_test”的 URL 是什么?

从我尝试过的 Bar web 容器 http://localhost:3000/api_testhttp://127.0.0.1:3000/api_test (这是我们在网络浏览器中使用的,所以没想到它可以在容器到容器中工作),我试过 http://172.18.0.3:3000/api_testhttp://172.18.0.3/api_test两者都不起作用。

我看到有关设置链接或 docker 网络的在线引用,但所有示例都是针对使用 docker run 而不是使用 docker-compose 时的。我希望如果您知道每个容器的 Web 服务器的 IP 和端口,那么应该是使用正确的 URL 而不需要任何额外的网络设置?

任何帮助,将不胜感激。

首选手动分配的静态 IP 解决方案 ... 在 Docker 之前,我们使用 Vagrant,这很简单,在每个项目的 Vagrantfile 中,我们只是手动为它们分配了同一私有(private)子网 192.168.50.50 和 192.168.50.51 上的 IP,它们彼此“交谈”得很好,我们可以简单地将这些 IP 编码到我们的开发代码中。 Docker 似乎有一个额外的抽象层,这让我感到困惑。

最佳答案

TLDR : 使用 http://host.docker.internal

来自 https://docs.docker.com/docker-for-mac/networking/ ,

The host has a changing IP address (or none if you have no network access). From 18.03 onwards our recommendation is to connect to the special DNS name host.docker.internal, which resolves to the internal IP address used by the host. This is for development purpose and will not work in a production environment outside of Docker Desktop for Mac.



我试过了,这也适用于 Windows。

例如,如果您在端口 5000 上的容器中运行 python 应用程序/微服务,您可以使用它来连接它:

requests.get('http://host.docker.internal:5000')

关于docker-compose - docker 容器 A 可以使用什么 URL 访问另一个 docker 容器 B(相同的开发机器,不同的项目),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55311465/

相关文章:

docker - 如何通过脚本访问私有(private) docker 注册表而不暴露凭据?

php - docker compose - 将 python 添加到 LAMP

c++11 - docker 中的 `npm start` 以 : Please install a supported C++11 compiler and reinstall the module 结尾

docker - 从远程机器连接到容器

docker - 在docker容器内运行的host命令无法解析容器主机名,但ping可以

docker - 如何正确设置 docker 网络以使用 localhost 连接?

python - 如何修复[Errno 111]连接被拒绝

docker - 如何在 Dockerfile 或 docker-compose 中使用 touch 创建文件?

linux - Docker DNS 设置

java - 无法从堆叠的 docker 容器连接到远程 MSSQL 数据库