首页 > 解决方案 > Docker撰写端口映射,主机端口!=容器端口

问题描述

如何curl http://barfoo:8002在不更改 docker 文件的情况下从 foobar-container 工作?

我有以下撰写文件:

version: '3'
services:
  foobar:
    build:
      context: ./foobar
    ports:
      - 8001:80
    depends_on:
      - barfoo
  barfoo:
    build:
      context: ./barfoo
    ports:
      - 8002:80

我将以下内容添加到计算机上的主机文件中

127.0.0.1     foobar
127.0.0.1     barfoo

现在我开始这个项目docker-compose up

当我在终端上执行以下操作时,这在逻辑上可以正常工作:curl http://barfoo:8002

当我从 foobar 容器 ( docker-compose exec foobar /bin/bash) 中的 Bash 执行相同操作时,我得到Failed to connect to barfoo port 8002: Connection refused,如果我使用curl http://barfoo:80它就可以了。

原因是我想模拟类似生产的情况,在生产中不需要端口,因为它们使用不同的主机名,并且都可以直接使用端口 80

标签: dockerdocker-composedocker-networking

解决方案


如何使 curl http://barfoo:8002从 foobar-container 工作,而不更改 docker 文件?

简单的解决方案是将主机端口 8002 映射到barfoo端口 8002。但这可能不是您想要的。

barfoo是在内部 docker dns 中注册的服务名称,只能由foobar运行时创建的同一 docker 网络中的服务()访问docker-compose up

8002 是映射到 docker 主机的端口。

因此,当您curl http://barfoo:8002foobar容器运行时,您会尝试将服务连接barfoo到端口 8002。但是barfoo在容器内的端口 80 上侦听,而不是在 8002 上。

另一种解决方案:

您可以添加network_mode: hostbarfoofoobar

  foobar:
    build:
      context: ./foobar
    network_mode: host
    ports:
      - 8001:80
    depends_on:
      - barfoo
  barfoo:
    build:
      context: ./barfoo
    network_mode: host
    ports:
      - 8002:80

但随后foobar需要使用localhost:8002

原因是我想模拟类似生产的情况,在生产中不需要端口,因为它们使用不同的主机名,并且都可以直接使用端口 80

如果这真的是你想要的,一个更好的选择是使用 docker stack。

您的服务将是docker swarm服务:

您可以使用以下方式部署它们:

docker deploy --compose-file path_to_compose_file

然后foobar将连接到barfoo使用服务名称和端口barfoo:80


推荐阅读