利用Docker 安装 zookeeper和kafka

首先准备一台安装有jdk和docker的linux服务器,阿里云和腾讯云都有相关的产品,直接有docker版的linux服务云,如果是裸机,需要安装jdk和docker,这里就不赘述准备工作了

1 拉取镜像

docker pull wurstmeister/zookeeper

docker pull wurstmeister/kafka

2 创建临时容器,用于先将容器内的zookeeper和kafka文件拷贝到宿主机,便于挂载目录(直接挂载目录会出现无法进入容器的问题)

docker run -d --restart=always --log-driver json-file --log-opt max-size=100m --log-opt max-file=2  --name zookeeper -p 2181:2181 -v /etc/localtime:/etc/localtime  wurstmeister/zookeeper

docker run -d --restart=always --log-driver json-file --log-opt max-size=100m --log-opt max-file=2 --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=10.0.4.15:2181/kafka -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://10.0.4.15:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -v /etc/localtime:/etc/localtime  wurstmeister/kafka

3 先将容器内的zookeeper和kafka文件拷贝到宿主机

docker cp kafka:/opt/kafka_2.13-2.8.1 /opt/kafka

docker cp zookeeper:/opt/zookeeper-3.4.13 /opt/zookeeper

这里可以复制一份副本,如果容器出现什么问题需要删除容器,这第三步就不需要重复做了,只需要将宿主机的kafka和zookeeper文件夹删除,利用副本就可以了

4 删除临时容器

docker stop zookeeper
docker stop kafka
docker rm zookeeper
docker rm kafka

5 创建正式容器

docker run -d --restart=always --log-driver json-file --log-opt max-size=100m --log-opt max-file=2  --name zookeeper -p 2181:2181 -v /etc/localtime:/etc/localtime   wurstmeister/zookeeper
docker run -d --restart=always --log-driver json-file --log-opt max-size=100m --log-opt max-file=2 --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=10.0.4.15:2181/kafka -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://<外公网IP:9092> -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -v /etc/localtime:/etc/localtime -v /opt/kafka/:/opt/kafka_2.13-2.8.1 wurstmeister/kafka

说明

1 --restart=always docker重启后会自动启动服务,这个必须开启

2  KAFKA_BROKER_ID=0 kafka的节点id,如果是集群环境必须不能重复,单机版只要配置成0 

3 -e KAFKA_ZOOKEEPER_CONNECT=10.0.4.15:2181/kafka   配置zookeeper和kafka的通信地址,这里可以填写内网ip,切记加/kafka,容易忽视

4 KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://<公网ip:9092>,这里是比较坑爹的地方,记住如果你是外网部署,即你的客户端调取kafka kpi的服务器和kafka不是在一个内网内,这里必须配置成公网ip,否则可以配置内网ip

5 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 这里的话只要配置成内网地址就可以了

6 -v /opt/kafka/:/opt/kafka_2.13-2.8.1 这步也很重要,将容器内的服务安装地址挂载到宿主机,便于做配置和查看日志等操作,因为容器内的centOS极可能是没有vim和vi工具的

6 查看容器状态

docker ps 

如下图,说明docker已经创建好了zookeeper和kafka容器了

7 进入容器,来到kafka的bin目录

docker exec -it kafka bash

cd opt/kafka_2.13-2.8.1/bin

8 创建topic

./kafka-topics.sh --create --zookeeper 10.0.4.15:2181/kafka --replication-factor 1 --partitions 1 --topic test

9 开两个窗口,分别执行生产了消费的命令

#生产消息
./kafka-console-producer.sh --broker-list 10.0.4.15:9092 --topic test

#消费消息
./kafka-console-consumer.sh --bootstrap-server 10.0.4.15:9092 --topic test --from-beginning

如下图,说明kafka已经部署完成

利用Docker 安装 zookeeper和kafka_第1张图片

 10 如果是云平台的服务器,一般需要开启端口才能远程api调用,需要开启 9092 2181 2888 3888 端口号

11 本地java调用kafka api,配置yml,主要是kafka地址配置,其他暂时可以略过

  kafka:
    bootstrap-servers: 公网ip:9092
#    properties:
#      sasl:
#        mechanism: PLAIN
#        jaas:
#          config: 'org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="admin";'
#      security:
#        protocol: SASL_PLAINTEXT
    producer:
      retries: 3
      batch-size: 16384
      buffer-memory: 33554432
      acks: 0
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.apache.kafka.common.serialization.StringSerializer
    consumer:
      bootstrap-servers: 公网ip:9092
      group-id: default-group
      enable-auto-commit: false
      auto-offset-reset: latest
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      max-poll-records: 1000
      fetch-max-wait: 500
      properties:
        max.partition.fetch.bytes: 1048576
        value.deserializer.encoding: UTF-8

你可能感兴趣的:(java-zookeeper,docker,zookeeper)