**
为了方便后续的配置,以下部署的时候IP都统一使用同一个IP
**
首先,先下载两个官方images:
docker pull wurstmeister/kafka
docker pull wurstmeister/zookeeper
不加其他参数默认下载最新的镜像
可以用docker search kafka查询docker hub中可下载的镜像
启动zookeeper容器
docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper
启动kafka容器
docker run -d --name kafka --publish 9092:9092 --link zookeeper --env KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 --env KAFKA_ADVERTISED_HOST_NAME=10.147.19.120 -env KAFKA_ADVERTISED_PORT=9092 --volume /etc/localtime:/etc/localtime wurstmeister/kafka:latest
192.168.59.101 改为宿主机器的IP地址,如果不这么设置,可能会导致在别的机器上访问不到kafka。
创建docker-compose.yml文件
version: '2'
services:
zookeeper:
image: wurstmeister/zookeeper #映射的镜像名
container_name: zookeeper #启动的容器名
mem_limit: 1024M
environment:
ZOOKEEPER_CLIENT_PORT: 2181
KAFKA_HEAP_OPTS: "-Xmx512M -Xms512M"
kafka:
image: wurstmeister/kafka #映射的镜像名
container_name: kafka #启动的容器名
mem_limit: 1024M
depends_on:
- zookeeper
ports: #让docker之外的网络可以访问
- 9092:9092
environment:
KAFKA_BROKER_NO: 1
#KAFKA_ADVERTISED_HOST_NAME: 10.147.19.120 #改成本机IP
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://10.147.19.120:9092
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_HEAP_OPTS: "-Xmx1G -Xms128M"
KAFKA_LOG_DIRS: "/kafka/KafkaLog" #更改topic日志存储路径
volumes:
- /var/run/docker.sock:/var/run/docker.sock #宿主机的/var/run/docker.sock被映射到了容器内
#- /mnt/mntnas/KafkaLog:/kafka/KafkaLog #把磁盘映射进docker
- /etc/localtime:/etc/localtime
- /opt/kafka_2.12-2.3.0/logs:$PWD/logs
- /kafka:$PWD/log.dirs
之后执行
docker-compose up -d
即可启动
接着执行
docker ps
查看容器是否成功启动
若启动失败,使用
docker ps -a 或者 docker ps -l
查看启动失败的容器
使用
docker logs 容器ID
查看具体报错日志
如要进入kafka容器:
docker exec -it 容器ID /bin/bash
kafka配置文件路径
cd /opt/kafka_2.12-2.3.0/config
里面有个server.properties文件
若是外网无法访问
可以在server.properties最后增加
advertised.host.name=10.120.11.93 #个人在使用中只配置了这一处,外网即可访问
或者
advertised.listeners=PLAINTEXT://59.64.11.22:9092 #外网IP,方便配置,在部署的时候IP都统一
并在docker-compose.yml中的kafka节点下增加
```yaml
ports: # 增加
- 9092:9092 # 增加
若要删除TOPIC立即生效,在server.properties文件最后追加
delete.topic.enable=true
linux中kafka常用命令
查看topic列表
kafka-topics.sh --list --zookeeper zookeeper:2181
查看kafka特定topic的详情,使用–topic与–describe参数
bin/kafka-topics.sh --zookeeper 127.0.0.1:2181 --topic lx_test_topic --describe
创建topic并运行producer
kafka-topics.sh --zookeeper zookeeper:2181 --create --replication-factor 1 --partitions 1 --topic kafkatest #创建topic,本人使用时创建的topic的partitions 都保持了一致
可以在一个窗口中开启生产者,另一个窗口中开启消费者,模拟收发消息
kafka-console-producer.sh --broker-list localhost:9092 --topic kafkatest #开启生产者
开启消费者
kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic kafkatest --from-beginning #此处localhost也可换成IP,取决于上面docker-compose.yml中配置的ip是多少
现在,在producer里输入任何内容,都会在consumer里收到。
以下操作未实践,取自网上大佬
跨container的部署
上面的配置只能在单个container里使用,不实用。这是因为kafka advertised配置在localhost上。
需要跨container访问,就需要通过docker的网络访问,要修改这个配置:
version: '2'
services:
zookeeper:
image: confluentinc/cp-zookeeper
container_name: zookeeper
mem_limit: 1024M
environment:
ZOOKEEPER_CLIENT_PORT: 2181
kafka:
image: confluentinc/cp-kafka
container_name: kafka
mem_limit: 1024M
depends_on:
- zookeeper
environment:
KAFKA_BROKER_NO: 1
KAFKA_ADVERTISED_HOST_NAME: domain_name # 修改
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://domain_name:9092 # 修改
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_HEAP_OPTS: "-Xmx512M -Xms16M"
改完重启docker-compose,另外,因为zookeeper重启后,topic不会被持久保存,所以重启后需要重新创建topic。
然后启动两个新的container模拟网络访问:
docker run -it --rm --link kafka:domain_name --network kafka_default --name consumer confluentinc/cp-kafka /bin/bash
docker run -it --rm --link kafka:domain_name --network kafka_default --name producer confluentinc/cp-kafka /bin/bash
注意,需要指定一下docker网络为kafka_default,这是官方image使用的默认网络。
然后分别在consumer和producer两个container里测试:
kafka-console-consumer --bootstrap-server domain_name:9092 --topic kafkatest --from-beginning
kafka-console-producer --broker-list domain_name:9092 --topic kafkatest
效果与单container一样。
从Docker网络之外访问的部署
如果需要从docker网络之外访问,就需要把端口映射到宿主机了。
同样需要修改配置,增加网络映射等:
version: '2'
services:
zookeeper:
image: confluentinc/cp-zookeeper
container_name: zookeeper
mem_limit: 1024M
environment:
ZOOKEEPER_CLIENT_PORT: 2181
kafka:
image: confluentinc/cp-kafka
container_name: kafka
mem_limit: 1024M
depends_on:
- zookeeper
ports: # 增加
- 9092:9092 # 增加
environment:
KAFKA_BROKER_NO: 1
KAFKA_ADVERTISED_HOST_NAME: domain_name
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://domain_name:9092
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_HEAP_OPTS: "-Xmx512M -Xms16M"
然后启动两个新的container模拟外部网络访问:
docker run -it --rm --add-host=domain_name:172.17.0.1 --name consumer confluentinc/cp-kafka /bin/bash
docker run -it --rm --add-host=domain_name:172.17.0.1 --name producer confluentinc/cp-kafka /bin/bash
其中172.17.0.1为docker宿主机在默认docker网络(注意不是kafka_default)里的IP,具体可以通过以下命令查看:
ip route
然后分别在consumer和producer两个container里测试:
kafka-console-consumer --bootstrap-server domain_name:9092 --topic kafkatest --from-beginning
kafka-console-producer --broker-list domain_name:9092 --topic kafkatest
这里有一个坑需要注意的是:
如果宿主机上有防火墙,需要增加一条规则,允许docker网络访问宿主机的端口,否则会连接失败。比如:
# 取得行号
iptables -L INPUT --line-num
# xx为最后一行DROP的行号,插到它前面
iptables -I INPUT xx -p tcp -m tcp -s 172.17.0.0/16 --dport 9092 -j ACCEPT
docker起得kafka日志文件存储路径修改
1.指定log位置:KAFKA_LOG_DIRS: “/kafka/KafkaLog”
其他参数同理:KAFKA_XXX_ZZZ,对应server.properties里的xxx.zzz
2.把磁盘映射进docker:- /mnt/mntnas/KafkaLog:/kafka/KafkaLog
重新创建kafka容器:进入docker-compose.yml文件位置,docker-compose up -d
[root@izbp1d36xiav554wzwc3klz]~/docker/kafka# cat docker-compose.yml
version: '2'
services:
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181:2181"
kafka:
image: wurstmeister/kafka
ports:
- "32769:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: 111.111.111.111
#KAFKA_ADVERTISED_LISTENERS: "192.168.1.9"
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LOG_DIRS: "/kafka/KafkaLog"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /mnt/mntnas/KafkaLog:/kafka/KafkaLog
kafka-manager:
image: sheepkiller/kafka-manager
environment:
ZK_HOSTS: zookeeper:2181
ports:
- "39000:9000"
#其中ip地址为宿主机上的 docker-machine ip 地址
最后进入容器,docker exec -it kafka-id bash,能看到$KAFKA_HOME/config/server.properties里的log.dirs参数已经修改过来了。