如何让不同的 Docker 容器相互通信而不将端口暴露给全世界

Posted

技术标签:

【中文标题】如何让不同的 Docker 容器相互通信而不将端口暴露给全世界【英文标题】:How to let different Docker containers talk to each other without exposing the ports to the whole world 【发布时间】:2016-05-13 16:41:29 【问题描述】:

我需要在受控环境中测试我的kafka 消费者和消息触发器。所以我做了一个ansible 项目来创建一些模拟kafka 服务器:mokafelk。

它工作正常,只是安全性很糟糕。 playbook 默认启动一个 3 节点 dockerized kafka 集群,但 kafka 服务器上的侦听端口对所有人开放。这是用于创建集群的Dockerfile 中的jinja2 template。

基本上我希望容器能够相互通信。我不认为容器链接是一种选择,因为在我看来链接只是单向的。但是使用127.0.0.1: port : port 暴露端口只会将端口暴露给主机,如果我是正确的,不会将端口暴露给其他容器。 0.0.0.0: port : port 将端口公开给全世界。那么我怎样才能同时链接两个以上的容器呢?这一定是一个普遍的问题,但我似乎没有找到快速的解决方案......

【问题讨论】:

【参考方案1】:

这里详细解释docker容器网络:https://docs.docker.com/engine/userguide/networking/dockernetworks/

简而言之:

默认情况下,docker daemon 会向主机系统添加一个网络适配器 docker0(它会尝试猜测可用的 IP,通常使用 172.17.0.1)。你可以在$ ifconfig看到这个。

默认情况下,所有容器都以增量 IP 连接到此网络。您可以通过$ docker inspect <container name> 检查容器网络设置。

因此,您的 docker 集群的 IP 很可能如下: kafka1 172.17.0.2 kafka2 172.17.0.3 kafka3 172.17.0.4 弹性搜索 172.17.0.5 kibana 172.17.0.6

然后,您可以从主机系统和容器等访问位于 172.17.0.2:9092、172.17.0.3:9092、172.17.0.4:9092 的 kafka。

【讨论】:

感谢您的回答,我从未尝试过,但是在脚本中硬编码 IP 地址也是不好的做法,不是吗?它还假设在播放开始时没有其他容器运行 只需阅读您发布的链接。我不知道docker 的用户定义网络。这似乎是一个新功能。 docker network create --driver bridge isolated_nw 创建一个新网络并在这个用户定义的网络中创建所有容器将允许它们自动通过名称相互通信,这在默认桥接网络中是不支持的。

以上是关于如何让不同的 Docker 容器相互通信而不将端口暴露给全世界的主要内容,如果未能解决你的问题,请参考以下文章

如何使不同主机上的docker容器互相通信

Docker网络基础配置

Docker基础 :网络配置详解

Docker容器的网络管理和网络隔离

如何通过“主机名”在 Docker 容器之间进行通信

Docker网络详解