ubuntu用Docker部署kafka消息服务

**

为了方便后续的配置,以下部署的时候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参数已经修改过来了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值