我有一个包含两个容器的 docker-compose.yml 文件:
containerA:
...
ports:
- "80:9000"
containerB:
...
links:
- containerA
我期望从 可以containerA
通过端口 80 访问containerB
,但只能通过端口 9000 访问。80 端口只能从主机上看到。
有没有办法让容器的containerA
9000 端口可以通过 80 端口访问到它所链接的所有容器,而不仅仅是主机?
答案1
ports
当您使用docker compose 文件的部分公开端口时,您正在指定一个host:container
映射,因此预计容器上的 9000 只能通过主机上的 80 访问。
你可以直接将端口暴露给其他容器https://docs.docker.com/compose/yml/#expose,但不能指定外部端口号,只能指定 9000(而不是 80)。
另一种选择是使用大使模式,即有一个“大使”作为消费者和提供者之间的沟通桥梁 https://docs.docker.com/articles/ambassador_pattern_linking/
因此容器 B -> 容器 A 大使 -> 容器 A
您可以在大使上公开端口 80,然后大使可以连接到容器 A 的端口 9000。
当您构建更复杂的基础设施时,您可以在服务注册表方面发挥更多创造力,因此容器可以通过服务注册表而不是简单的容器链接来相互定位。
不过,出于良好的习惯,您通常不应直接指定外部端口。如果您这样做并尝试在同一台 docker 主机上运行容器的多个副本,则会发生端口冲突。或者,如果您正在运行另一个试图公开相同外部端口的容器,您也会遇到端口冲突。