Docker端口映射和主机名

3
这个问题涉及到了解Docker如何处理容器的主机名和端口。
假设我有两个服务运行在不同的Docker容器中,并将容器的80端口映射到8081端口(service1)和8082端口(service2):
service1: 8081:80
service2: 8082:80

现在我清楚了,从主机的角度来看,我可以通过使用暴露的端口(http:// localhost:8081和http:// localhost:8082)访问这些服务。但是如果我想通过像http:// container1和http:// container2这样使用容器来访问我的服务呢?为实现这种情况,我需要做什么:

  • 如何转发端口?
  • 我如何知道确切的主机名以从docker主机机器中解析容器的主机名?

谢谢您的帮助!


1
部署第三个使用Nginx作为代理的容器,它将以http://container1和http://container2的形式提供这些端口的服务。 - Ijaz Ahmad
1个回答

4

正如Ijaz Ahmad Khan所说,你需要在该网络内使用另一个容器作为代理,例如nginx。

如果你将端口从docker-compose暴露到主机(你的电脑),它只能作为特定端口的localhost域名访问,就像你提到的那样。如果你像这样运行docker-compose.yml:

version: "3"
services:
  service1:
    image: something
    name: service1_name
    ports:
      - "8081:80"
  service2:
    image: something
    name: service2_name
    ports:
      - "8082:80"

Docker-compose将创建一个名为文件夹的默认网络,其中包含docker-compose.yml和后缀_default。在这个网络中,所有容器都可以相互看到。使用expose命令来处理此网络中的容器(以便它们可以相互看到和通信),使用port来发布到主机(您的计算机)。

这意味着:

对于网络中的其他容器,service1在您的计算机上显示为http://localhost:8081,而在service1:80中。

对于网络中的其他容器,service2在您的计算机上显示为http://localhost:8082,而在service2:80中。

请注意,指定的容器名称对服务网络地址没有影响。要测试容器仅在网络内可见,请尝试从另一个容器ping它们。

docker run --rm --network=your_folder_name_default debian ping service1

要查看容器在哪个网络上运行,您可以使用inspect命令。

docker inspect service1_name

现在你需要使用容器名称。

你有使用nginx代理容器的示例吗?谢谢。 - Sebastian Schabbach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接