如何让不同的 Docker 容器在不向全世界公开端口的情况下相互通信
How to let different Docker containers talk to each other without exposing the ports to the whole world
我需要在受控环境中测试我的 kafka
消费者和消息触发器。所以我做了一个 ansible
项目来创建一些模拟 kafka
服务器:mokafelk.
它工作正常,除了安全问题。 playbook
默认启动一个 3 节点 dockerized
kafka
集群,但 kafka 服务器上的侦听端口对所有人开放。这是用于创建集群的 Dockerfile
的 jinja2
template。
基本上我希望容器能够相互通信。我不认为容器 linking 是一种选择,因为在我看来 linking 只是单向的。但是如果我是正确的,使用 127.0.0.1:{{ port }}:{{ port }}
公开端口只会将端口公开给主机,不会将端口公开给其他容器。 0.0.0.0:{{ port }}:{{ port }}
向全世界公开端口。那么我怎么能 link 两个以上的容器呢?这一定是一个常见问题,但我似乎没有找到快速解决方案...
这里详细解释了docker容器网络:https://docs.docker.com/engine/userguide/networking/dockernetworks/
简而言之:
默认情况下 docker 守护程序将网络适配器 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
基巴纳 172.17.0.6
然后您可以从主机系统和容器中访问您的 kafkas 172.17.0.2:9092、172.17.0.3:9092、172.17.0.4:9092。
我需要在受控环境中测试我的 kafka
消费者和消息触发器。所以我做了一个 ansible
项目来创建一些模拟 kafka
服务器:mokafelk.
它工作正常,除了安全问题。 playbook
默认启动一个 3 节点 dockerized
kafka
集群,但 kafka 服务器上的侦听端口对所有人开放。这是用于创建集群的 Dockerfile
的 jinja2
template。
基本上我希望容器能够相互通信。我不认为容器 linking 是一种选择,因为在我看来 linking 只是单向的。但是如果我是正确的,使用 127.0.0.1:{{ port }}:{{ port }}
公开端口只会将端口公开给主机,不会将端口公开给其他容器。 0.0.0.0:{{ port }}:{{ port }}
向全世界公开端口。那么我怎么能 link 两个以上的容器呢?这一定是一个常见问题,但我似乎没有找到快速解决方案...
这里详细解释了docker容器网络:https://docs.docker.com/engine/userguide/networking/dockernetworks/
简而言之:
默认情况下 docker 守护程序将网络适配器 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
基巴纳 172.17.0.6
然后您可以从主机系统和容器中访问您的 kafkas 172.17.0.2:9092、172.17.0.3:9092、172.17.0.4:9092。