【问题标题】:Docker Port Mappings and HostnamesDocker 端口映射和主机名
【发布时间】:2019-04-10 07:18:04
【问题描述】:

我有一个问题,或者最好说有两个问题。两者都依赖于 Docker,并且与对 docker 如何处理容器主机名和端口的理解有关。

假设我有两个服务在不同的 docker 容器中运行,并将容器中的端口 80 暴露给端口 8081 (service1) 和端口 8082 (service2):

服务1:8081:80 服务2:8082:80

现在我很清楚,从主机的角度来看,我可以使用暴露的端口(@98​​7654321@ 和http://localhost:8082)访问这些服务。但是,如果我想使用http://container1http://container2 之类的容器来访问我的服务怎么办?我必须做些什么来实现这个场景的含义:

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

感谢您的帮助!

【问题讨论】:

  • 部署第三个容器,使用 nginx 作为代理,它将为这些端口提供 container1container2

标签: docker docker-compose


【解决方案1】:

正如 Ijaz Ahmad Khan 所说。您必须在该网络中使用另一个容器作为代理,例如 nginx。

如果您将来自 docker-compose 的端口暴露给主机(您的 pc),则它仅作为具有您提到的特定端口的 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 将创建默认网络,默认网络由 wwitch 中的文件夹命名为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 代理容器的例子吗?谢谢。
猜你喜欢
  • 2020-02-29
  • 2014-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多