kafka依赖zookeeper,因此需要使用docker同时安装zookeeper和kafka。 macOS的docker在容器和宿主之间无法通过ip直接通信,因此在安装的时候需要特殊注意与ip相关的设置。当容器需要访问宿主ip时,需要使用docker.for.mac.host.internal或者host.docker.internal代替。
# 1. 拉取镜像
docker pull zookeeper
docker pull wurstmeister/kafka
# 2. 启动zookeeper
docker run -d -p 2181:2181 --name zookeeper1 zookeeper
# 3. 启动kafka
docker run -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=docker.for.mac.host.internal:2181/kafka -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://docker.for.mac.host.internal:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 wurstmeister/kafka
复制代码
-
-d设置后台运行
-
--name zookeeper指定容器别名
-
-p 2181:2181绑定容器端口到宿主端口
-
-e参数可以设置docker容器内环境变量:
- KAFKA_BROKER_ID=0 在kafka集群中,每个kafka都有一个BROKER_ID来区分自己
- KAFKA_ZOOKEEPER_CONNECT={host-ip}:{zookeeper-port}/kafka 配置zookeeper管理kafka的路径
- KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://{host-ip}:9092 把kafka的地址端口注册给zookeeper
- KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 kafka监听地址
测试kafka生产与消费
docker exec -it kafka bash
cd /opt/kafka/bin
# 运行kafka生产者
./kafka-console-producer.sh --broker-list 127.0.0.1:9092 --topic first-topic
# 出现>之后发送Hello
>Hello
# 打开新终端,启动kafka消费者
cd /opt/kafka/bin
./kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092 --topic first-topic --from-beginning
复制代码
假如运行报错的话:可修改host文件 映射 127.0.0.1 docker.for.mac.host.internal
【原因】可能原因是本地dns原因,无法解析docker.for.mac.host.internal或者host.docker.internal
docker exec: 在运行的容器中执行命令。 -i 即使没有附加也保持STDIN打开,-t分配一个伪终端。
docker kill/stop docker stop:先发sigterm信号给docker,运行其在一定时间内进行一些操作后再关闭。 docker kill:直接发送sigkill信号杀死容器。
docker run/start docker run:从镜像启动一个容器。 docker start:运行已停止的容器。
从docker images列表中启动一个镜像:docker run <IMAGE ID> 查看启动过的容器:docker ps -a 重新启动容器:docker start <CONTAINER ID>