gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 17:51:09 25 4
gpt4 key购买 nike

我有两个不同的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有效。我想做的是能够通过 postgresservice_a容器 引用localhost容器,就好像这两个容器是一个容器并且它们共享相同的localhost一样。我知道如果可以从postgres.dev容器内部使用主机名service_a,但是我希望能够使用localhost。这可能吗?请注意,我不太熟悉网络或Docker。

Mac版本:10.12.4

Docker版本:Docker版本17.03.0-CE,内部版本60ccb22

我已经做了很多先前的研究,但是找不到解决方案。
相关:https://forums.docker.com/t/localhost-and-docker-compose-networking-issue/23100/2

最佳答案

正确的方法:不要使用localhost。而是使用docker内置的DNS网络,并按其服务名称引用容器。您甚至不应该设置容器名称,因为这样会破坏扩展。

不好的方法:如果您不想使用docker联网功能,则可以切换到主机联网,但这会关闭一个非常关键的功能,而其他docker功能(例如将容器在其自身隔离的网络中连接在一起的选项)不再工作。使用该免责声明,结果将如下所示:

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/

请注意,由于您不再位于容器网络中,因此我从容器到主机的端口发布已删除。我删除了主机名设置,因为您不应该从Docker容器中更改主机本身的主机名。

您引用的链接论坛帖子显示了这是VM时,主机如何无法与作为localhost的容器进行通信。这是一个预期的限制,但是容器本身将能够作为localhost相互通信。如果您将基于VirtualBox的安装与docker-toolbox一起使用,则应该能够通过virtualbox IP与容器通信。

真正错误的方法:滥用容器网络模式。该模式可用于调试容器网络问题和特殊用例,并且实际上不应避免避免将应用程序重新配置为使用DNS。而且,当您停止数据库时,您将破坏另一个容器,因为它将丢失其网络 namespace 。

为此,您可能需要运行两个单独的docker-compose.yml文件,因为docker-compose会在执行任何操作之前检查网络是否存在。从postgres容器开始:
version: "2"
services:
postgres:
container_name: postgres.dev
image: postgres:9.6
ports:
- "5432:5432"
volumes:
- ../configs/postgres/scripts:/docker-entrypoint-initdb.d/

然后,您可以在同一网络 namespace 中进行第二项服务:
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

关于docker - 如何在两个不同的Docker容器之间共享本地主机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43547795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com