Docker容器用什么URL来访问另一个docker容器B(相同的dev机器,不同的项目)

问题描述 投票:0回答:2

假设我们需要在开发的某些阶段很少这样做(为了测试几个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 for 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)需要访问Food上的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中,我们只需在同一私有子网192.168.50.50和192.168.50.51上手动为它们分配IP,并且他们“谈了” “彼此很好,我们可以简单地将这些IP'编码'到我们的开发代码中。 Docker似乎有一个额外的抽象层让我感到困惑。

docker-compose docker-networking
2个回答
1
投票

我终于找到了一个SO线程,提到了较新版本的Docker,比如我使用主机名host.docker.internal访问主机,所以回答我的问题是 - 因为我已经为Foo和Bar分配了不同的端口 - Bar容器可以使用网址http://host.docker.internal:3000/api_test

但仍然希望能够为每个容器分配静态IP,因此我将问题保持打开状态。


0
投票

您可以使用docker network访问容器A到B. https://docs.docker.com/network/

使用docker network --help。

  1. 创建一个网络 docker network create mynetwork
  2. 将containerA和containerB中的容器放在此网络中,在这种情况下,这是我的网络。 qazxsw poi qazxsw poi
  3. 您现在可以使用容器名称访问一个容器到另一个容器。

你也可以用ping测试它。去A或B容器bash并使用;

  1. docker network connect mynetwork containerA
  2. docker network connect mynetwork containerB
  3. 如果你在容器中使用qazxsw poi测试它。

例如-1:

如果要在带端口的apache虚拟主机设置中使用它;

  • apt-get update

例如-2:

我有两个容器; apt-get install iputils-pingping containerB命名。我在端口ProxyPass "/" "http://containerB:3000"上的基本容器中运行nodejs app。我在第二个容器myphp上运行apache和php。

基本上我的nodejs应用程序给了我一个“Hello Word”输出。它正在使用容器qazxsw poi这是代码:

base

基本上我的PHP应用程序给我所有源代码连接的地址。它正在研究容器qazxsw poi。这是代码:

myphp

然后我把这两个容器放在同一个网络上。当我运行这个index.php时,这是myphp容器应用程序。它给了我“Hello Word”;

因此,如果您将容器放在同一个网络中,您可以使用其名称(例如3000)或者如果您的路由器正在侦听“/ api_test”base来互相访问。

最后这就是我正在做的沟通容器。我希望它对你也有用。

© www.soinside.com 2019 - 2024. All rights reserved.