假设我们需要在开发的某些阶段很少这样做(为了测试几个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_test
和http://127.0.0.1:3000/api_test
(这是我们在网络浏览器中使用的,因此并没有真正期望从容器到容器工作)而且我尝试过http://172.18.0.3:3000/api_test
和http://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似乎有一个额外的抽象层让我感到困惑。
我终于找到了一个SO线程,提到了较新版本的Docker,比如我使用主机名host.docker.internal
访问主机,所以回答我的问题是 - 因为我已经为Foo和Bar分配了不同的端口 - Bar容器可以使用网址http://host.docker.internal:3000/api_test
但仍然希望能够为每个容器分配静态IP,因此我将问题保持打开状态。
您可以使用docker network访问容器A到B. https://docs.docker.com/network/
使用docker network --help。
docker network create mynetwork
你也可以用ping测试它。去A或B容器bash并使用;
docker network connect mynetwork containerA
docker network connect mynetwork containerB
例如-1:
如果要在带端口的apache虚拟主机设置中使用它;
apt-get update
例如-2:
我有两个容器; apt-get install iputils-ping
和ping 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
来互相访问。
最后这就是我正在做的沟通容器。我希望它对你也有用。