1:下载镜像。
arduino
// 选一个下载
docker pull wurstmeister/kafka
docker pull zookeeper
2:创建通信网络。因为zookeeper和kafka之间的通信,我们可以运用docker内部容器通信机制先新建一个网络。
sql
[root@sz-ben-dev-01 ~]# docker network create kz_test (新建网络)
dcb683a23044e902b251e01f493c814f940bd5bb592025c9eb4b78902f45091f
[root@sz-ben-dev-01 ~]# docker network ls (查看网络)
NETWORK ID NAME DRIVER SCOPE
3ad8fdee7ba6 bridge bridge local
f4d1974d2f42 kz_test bridge local
f95cfc5e16bd none null local
[root@sz-ben-dev-01 ~]# docker network inspect kz_test (查看网络详细信息)
[
{
"Name": "kz_test",
"Id": "f4d1974d2f42373b947828b0b0db431da49af5512909044f74a17c99d0fbb05f",
"Created": "2023-09-01T22:56:19.788423795+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.19.0.0/16",
"Gateway": "172.19.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers":{},//容器为空
"Options": {},
"Labels": {}
}
]
3:创建zookeeper和kafka容器。
ini
docker run --net=kz_test --name kz_zookeeper -p 21810:2181 -d docker.io/zookeeper //创建zookeeper容器
docker run --net=kz_test --name kz_kafka -p 9095:9092 \
--link kz_zookeeper \
-e KAFKA_ZOOKEEPER_CONNECT=172.19.0.2:2181 \
-e KAFKA_ADVERTISED_HOST_NAME=172.28.2.104 \
-e KAFKA_ADVERTISED_PORT=9092 \
-d wurstmeister/kafka//创建kafka容器
KAFKA_ADVERTISED_HOST_NAME参数需要设置为宿主机地址172.28.2.104。
KAFKA_ZOOKEEPER_CONNECT参数设置kz_zookeeper容器内部地址和端口(同一宿主机内的容器互相访问要用容器内地址,查看指令为docker inspect kz_zookeeper,在Networks字段可以看到容器内ip地址)
csharp
[root@sz-ben-dev-01 ~]# docker inspect kz_zookeeper
"Networks": { "kz_test": { ...... "IPAddress": "172.19.0.2", ...... } }
这个时候在去查看网络kz_test,查看指令为docker network inspect kz_test,zookeeper和kafka容器都已经加入kz_test网络了。
perl
[root@sz-ben-dev-01 ~]# docker network inspect kz_test
[
{ "Name": "kz_test", ......
"Containers": {
"08757bd9eb4f2eb778a34b3486fb3cbe1501b699d82cd8ae28ff27f75fa3bd77": {
"Name": "kz_zookeeper",
"EndpointID": "ed0bfaf2d9d0436e44ebd523216f41a048783bad72be7479afd6f80e368ef828",
"MacAddress": "02:42:ac:13:00:02",
"IPv4Address": "172.19.0.2/16",
"IPv6Address": ""
},
"aa2215be18506d5f7bd14564add0360b6c843b888643a116efaa3f8d583d5263": {
"Name": "kz_kafka",
"EndpointID": "4488787fe74c5868d93e3d5272e3f63987738ff2708a89b6891f7bd07cfb6673",
"MacAddress": "02:42:ac:13:00:03",
"IPv4Address": "172.19.0.3/16",
"IPv6Address": ""
}
}
...... } ]
4 测试发送消息和接收消息,验证是否安装成功。
进入容器查看消费者信息或发布生产者消息
bash
// 进入容器 docker exec -it kz_kafka bash
// 进入kafka所在目录 cd opt/kafka_2.13-2.3.0/bin/
// 启动消息发送方 ./kafka-console-producer.sh --broker-list localhost:9092 --topic mykafka
// 再开一个终端进入容器,启动消息接收方 ./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic mykafka --from-beginning
安装过程中踩的坑
1 端口被占用,第3步要执行创建kafka容器的时候报错,9093端口已经存在了。 Error starting userland proxy: listen tcp4 0.0.0.0:9093端口: bind: address already in use
用netstat -tanlp查看当前端口占用情况,发现9093确实已经被占用了,而且用 kill pid号(具体那个进程的pid)一直无效果,该进程是linux系统本身就有的进程。所以我先去删除那个kafka容器,指令为:docker rm pid号,再创建kafka容器,在创建容器的时候我把9093换成了新的端口号9095(netstat -tanlp出来的端口号没有这个),然后kafka容器创建成功了。
2 内存不够,我用docker network inspect kz_test查看的时候发现Containers里没有kz_kafka容器,所以用docker logs -f kz_kafka指令去查看kafka的启动日志发现一些报错,经分析是内存不足,用top指令查看内存占用情况发现git占了一大半内存空间,所以我用了docker stop CONTAINER_NAME/ID关掉git释放了很多内存。
arduino
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed; error='Not enough space' (errno=12)
然后把之前docker运行的kafka 停掉,指令为:docker kill pid号(如果kafka有在运行情况下) ;再删掉重新创建kafka容器,指令为:docker rm pid号,再重新执行第3步的创建zookeeper和kafka容器指令。