采用docker部署kafka、zookeeper,一般的做法是创建一个docker网络,然后kafka、zookeeper都使用这个网络。问题是,我部署到生产环境的时候,这种做法被禁止了。原因是添加了这个docker网络以后,服务器就无法访问了。该服务器是通过互联网访问的。我也不知道为啥就会搞到他们网络崩溃,总之就是不允许。
那怎么办?
经摸索,证明可以采用两个docker容器共享其中一个容器的网络配置的做法。众所周知,docker容器各自独立,相互区隔,自成一个世界。同一个网络,就是为了能够互相访问。创建docker网络如此,共享容器网络如此,都是这个目的。
以下是操作记录,以及相应学习。
一、共享容器网络配置
(一)原先创建docker网络方案
1、首先创建一个网络
sudo docker network create app-tier --driver bridge
2、安装zookeeper
sudo docker run --restart=always -d --name zookeeper-server \
--network app-tier \
-p 2181:2181 \
-e ALLOW_ANONYMOUS_LOGIN=yes \
bitnami/zookeeper:latest
3、安装Kafka
sudo docker run --restart=always -d --name kafka-server \
--network app-tier \
-p 8004:9092 \
-e ALLOW_PLAINTEXT_LISTENER=yes \
-e KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper-server:2181 \
-e KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.10.249:8004 \
bitnami/kafka:latest
(二)共享容器网络配置方案
1、安装zookeeper,并映射所有要用到的端口
sudo docker run \
--restart=always -d --name zookeeper-server \
-p 2181:2181 \
-p 8004:9092 \
-e ALLOW_ANONYMOUS_LOGIN=yes \
bitnami/zookeeper:latest
2、安装Kafka
脚本中,–net=container:zookeeper-server,意为使用容器zookeeper-server的网络。注意到端口8004:9092放在了创建容器zookeeper-server时进行了设置。因为 --net=container 模式下,是不允许再进行端口暴露设置(-p host port : container port )的。但由于共享了容器zookeeper-server的网络配置,因此在创建容器zookeeper-server时设置即可。
sudo docker run --restart=always -d --name kafka-server \
--net=container:zookeeper-server \
-e ALLOW_PLAINTEXT_LISTENER=yes \
-e KAFKA_CFG_ZOOKEEPER_CONNECT=localhost:2181 \
-e KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.122.1:8004 \
bitnami/kafka:latest
二、docker的网络模式
docker有以下几种网络模式:bridge、host、container、none和overlay。安装docker之后,即可见到:
1、bridge
默认模式。一般我们创建容器就是用了这种模式(无须显示指定)。为了让外部能够访问到docker容器,应当暴露一些端口,-p host port : container port,我们都很熟悉了。
2、host
docker就直接基于宿主机的网络,理论上外部可以直接访问这个docker容器。这样的话,docker的区隔性、安全性会有所削弱。
3、container
就是上面提到的,共享容器网络配置模式。
4、none
啥网络模式都不分配,由docker容器里面的程序自己实现,便于它想怎么搞就怎么搞。
5、overlay
跨主机的docker容器互访。
参考文章:
My kafka docker container cannot connect to my zookeeper docker container
docker 容器的网络模式
Docker的网络模式bridge、host、container other、overlay