如何在两个不同的Docker容器之间共享本地主机?

我有两个不同的Docker容器,每个容器都有不同的图像。 容器中的每个应用程序都使用不冲突的端口。 请参阅docker-compose.yml

 version: "2" services: service_a: container_name: service_a.dev image: service_a.dev ports: - "6473:6473" - "6474:6474" - "1812:1812" depends_on: - postgres volumes: - ../configs/service_a/var/conf:/opt/services/service_a/var/conf postgres: container_name: postgres.dev hostname: postgres.dev image: postgres:9.6 ports: - "5432:5432" volumes: - ../configs/postgres/scripts:/docker-entrypoint-initdb.d/ 

我可以成功地从主机(Mac OS)curl每个图像,例如curl -k https://localhost:6473/service_a/api/version工作。 我想要做的就是能够通过localhostservice_a容器引用postgres容器,就好像这两个容器是一个容器一样,它们共享相同的localhost 。 我知道,如果我使用service_a容器内的主机名postgres.dev ,但是我希望能够使用localhost主机,这是可能的。 这可能吗? 请注意,我不是很熟悉networking或Docker。

Mac版本:10.12.4

Docker版本:Docker版本17.03.0-ce,build 60ccb22

我已经完成了一些先前的研究,但是找不到解决scheme。 相关: https : //forums.docker.com/t/localhost-and-docker-compose-networking-issue/23100/2

正确的方法是:不要使用本地主机。 而是使用docker内置的DNSnetworking,并通过服务名称引用容器。 你甚至不应该设置容器名称,因为这会打破缩放。


不好的方法:如果你不想使用dockernetworkingfunction,那么你可以切换到主机networking,但是这closures了一个非常关键的function和其他dockerfunction,如select在自己的孤立networking中连接容器的选项不再工作。 通过该免责声明,结果将如下所示:

 version: "2" services: service_a: container_name: service_a.dev image: service_a.dev network_mode: "host" depends_on: - postgres volumes: - ../configs/service_a/var/conf:/opt/services/service_a/var/conf postgres: container_name: postgres.dev image: postgres:9.6 network_mode: "host" volumes: - ../configs/postgres/scripts:/docker-entrypoint-initdb.d/ 

请注意,由于您不再位于容器networking中,因此我将容器中的端口发布从主机中删除。 而且我删除了主机名设置,因为您不应该从一个docker容器中更改主机本身的主机名。

您参考的链接的论坛post显示,当这是一个VM时,主机不能以localhost与容器通信。 这是一个预期的限制,但容器本身将能够作为本地主机相互交谈。 如果您使用基于VirtualBox的安装与docker-toolbox,您应该能够通过virtualbox IP与容器交谈。


真是错误的方法:滥用容器networking模式。 该模式可用于debugging容器networking问题和专用用例,实际上不应用于避免重新configuration应用程序以使用DNS。 而当你停止数据库,你会打破你的其他容器,因为它将失去其networking命名空间。

为此,您可能需要运行两个单独的docker-compose.yml文件,因为在执行任何操作之前,docker-compose将检查networking的存在。 从postgres容器开始:

 version: "2" services: postgres: container_name: postgres.dev image: postgres:9.6 ports: - "5432:5432" volumes: - ../configs/postgres/scripts:/docker-entrypoint-initdb.d/ 

然后,您可以在同一个networking命名空间中创build第二个服务:

 version: "2" services: service_a: container_name: service_a.dev image: service_a.dev network_mode: "container:postgres.dev" ports: - "6473:6473" - "6474:6474" - "1812:1812" volumes: - ../configs/service_a/var/conf:/opt/services/service_a/var/conf 

特别是对于Mac和本地testing期间,我设法使用docker.for.mac.localhost方法获得多个容器的工作。 我logging它http://nileshgule.blogspot.sg/2017/12/docker-tip-workaround-for-accessing.html