首先docker搭建kafka环境是需要有zookeeper的, 所以这里需要先搭建zookeeper环境
通过dockerfile创建zookeeper
创建一个文件夹, 里面创建出kafka子文件夹和zookeeper子文件夹, 然后在zookeeper文件夹中创建一个Dockerfile文件, 文件内容如下
FROM wurstmeister/zookeeper:3.4.6
MAINTAINER wirte the zookeeper docker file
在通过dockerfile生成zookeeper之前, 需要修改一下docker的镜像加载位置, 否则的话镜像拉取速度会很慢.
访问阿里云网站, 通过支付宝登录即可
https://cr.console.aliyun.com
找到镜像加速器
选择Ubuntu系统, 此时就会生成出一个对应的加速地址
将地址复制, 在ubuntu中编辑daemon.json文件, 位置在`/etc/docker/daemon.json
如果文件不存在, 就手动创建一下, 注意名称不要出现错误
文件内容将刚才的地址填入, 格式如下
{
"registry-mirrors": ["https://youraddr.mirror.aliyuncs.com"]
}
然后保存退出
重新加载daemon配置文件, 然后重启docker
systemctl daemon-reload
systemctl restart docker
此时docker拉取镜像的速度就会提升
通过dockerfile文件拉取zookeeper镜像
cd zookeeper
docker build -t zookeeper:3.4.6 Dockerfile .
等待镜像拉取完毕
查看镜像文件
docker images
启动zookeeper
docker run -d --name zookeeper -p 2181:2181 -t zookeeper:3.4.6
查看docker容器
docker ps -a
进入kafka文件夹, 编辑kafka的Dockerfile文件
FROM wurstmeister/kafka:2.13-2.6.0
MAINTAINER wirte the kafka docker file
ENV KAFKA_VERSION "2.13-2.6.0"
RUN mkdir -p /data/kafka/logs && mkdir -p /data/zookeeper/logs && mkdir -p /data/zookeeper/data
RUN sed -i '/^dataDir=/c dataDir=/data/zookeeper/data' /opt/kafka_$KAFKA_VERSION/config/zookeeper.properties
RUN sed -i '/^dataDir/a dataLogDir=/data/zookeeper/logs' /opt/kafka_$KAFKA_VERSION/config/zookeeper.properties
后面的三条RUN命令, 是配置镜像的内容
第一个是创建logs目录和data目录
第二个是将数据存储目录设置到指定文件夹
第三个是将日志存储目录设置到指定文件夹
以便后期启动时, 将数据和日志映射到ubuntu主机上, docker容器重启时不会丢失数据
执行dockerfile文件
docker build -t kafka:2.6.0 Dockerfile .
启动kafka
sudo rm -rf /data/kafka/logs/meta.properties && docker run -d --name kafka --publish 9092:9092 --link zookeeper --env KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 --env KAFKA_ADVERTISED_HOST_NAME=192.168.1.79 --env KAFKA_ADVERTISED_PORT=9092 --env KAFKA_LOG_DIRS=/data/kafka/logs --volume /etc/localtime:/etc/localtime --volume /data/kafka:/data/kafka --volume /data/zookeeper:/data/zookeeper kafka:2.6.0
这里没用代码块显示, 是为了看得更直观
最后解释一下命令开头的那个删除文件的作用
-d 参数是让docker在后台运行
– name参数是也容器起个名
–publish 是将docker中的端口号与ubuntu主机端口做一个映射
–env参数是启动时的配置文件, 修改后的内容在kafka容器中的server.properties文件中可以看到
–volume是docker容器映射镜像文件夹和主机文件夹的命令
因为zookeepr也是通过容器启动的, 所以每次启动时他的id都是不一样的, 而kafka启动会去连接zookeeper, kafka有一个配置文件, 在里面记录着zookeeper的id, 但是每次zookeeper重启, id会变化, 所以这个记录zookeeper id的文件, 需要在kafka启动之前删除, 让kafka去重新寻找zookeeper进行连接, 这就是命令开头位置的 删除meta.properites文件的作用
启动之后可以进入kafka容器中进行查看
首先通过命令获取kafka容器id
docker ps -a
查看结果如下
anx@ubuntu-server:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d8821e8c1ed7 postgres:alpine "docker-entrypoint.s…" 46 hours ago Up 46 hours 0.0.0.0:5432->5432/tcp mypostgres
1998ec9ef5d5 kafka:2.6.0 "start-kafka.sh" 46 hours ago Up 46 hours 0.0.0.0:9092->9092/tcp kafka
b2c5218c06a0 zookeeper:3.4.6 "/bin/sh -c '/usr/sb…" 46 hours ago Up 46 hours 22/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp zookeeper
其中CONTAINER ID字段的值就是容器id
docker exec -it 1998ec9ef5d5 /bin/bash
进入之后通过kafka的一些命令就可以操作kafka, 例如通过控制台向kafka发送消息, 或者在控制台监听kafka某个topic的消息内容, 显示出来等等