docker compose 部署kafka及遇到的问题
docker-compose.yml文件如下
version: '3'
services:
zookepper:
image: wurstmeister/zookeeper # 原镜像`wurstmeister/zookeeper`
container_name: zookeeper # 容器名为'zookeeper'
volumes: # 数据卷挂载路径设置,将本机目录映射到容器目录
- "/etc/localtime:/etc/localtime"
ports: # 映射端口
- "2181:2181"
kafka:
image: wurstmeister/kafka # 原镜像`wurstmeister/kafka`
container_name: kafka # 容器名为'kafka'
volumes: # 数据卷挂载路径设置,将本机目录映射到容器目录
- "/etc/localtime:/etc/localtime"
environment: # 设置环境变量,相当于docker run命令中的-e
KAFKA_BROKER_ID: 0 # 在kafka集群中,每个kafka都有一个BROKER_ID来区分自己
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://ip:9092 # TODO(此处ip改为自己的ip) 将kafka的地址端口注册给zookeeper
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092 # 配置kafka的监听端口
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
#KAFKA_CREATE_TOPICS: "hello_world"
ports: # 映射端口
- "9092:9092"
depends_on: # 解决容器依赖启动先后问题
- zookepper
kafka-manager:
image: sheepkiller/kafka-manager # 原镜像`sheepkiller/kafka-manager`
container_name: kafka-manager # 容器名为'kafka-manager'
environment: # 设置环境变量,相当于docker run命令中的-e
ZK_HOSTS: zookeeper:2181
APPLICATION_SECRET: xxxxx
KAFKA_MANAGER_AUTH_ENABLED: "true" # 开启kafka-manager权限校验
KAFKA_MANAGER_USERNAME: admin # 登陆账户
KAFKA_MANAGER_PASSWORD: 123456 # 登陆密码
ports: # 映射端口
- "9000:9000"
depends_on: # 解决容器依赖启动先后问题
- kafka
一开始在该文件所在目录下运行命令
docker-compose up -d
然后 docker ps 查看发现 zookeeper和kafka-manager启动成功了,但kafka并未启动成功
之后为避免干扰,停掉zookeeper和kafka-manager,并删除这三个容器应用
docker rm -f kafka zookeeper kafka-manager
使用下面命令重新部署,并查看完整启动日志
docker-compose up
发现启动kafka过程中报了错
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed; error=‘Out of memory’ (errno=12)
该报错信息在运行或编译占用内存大的大软件大项目的过程中可能会出现,原因应该是内存不足,可以尝试增加机器内存,或者创建或增加swap的空间
由于我使用的是云服务器,扩容内存要加钱,着实囊中羞涩😭,我使用第二种方法,增加swap空间。
解决方法:
先执行下面命令 查看内存是不是还有 最主要的是 看有没有交换空间 swap 如果没有交换空间 或者交换空间比较小 要先安装交换空间 或者增大空间
free -m
1.创建一个大小为500M的swapfile文件:
dd if=/dev/zero of=swapfile bs=1024 count=500000
在root权限下,创建swapfile (有时会遇到dd命令不识别 可能是你安装过一次了 那就先把swapfile删除。)像/dev/null一样, /dev/zero也是一个伪文件, 但它实际上产生连续不断的null的流(二进制的零流,而不是ASCII型的)。/dev/zero主要的用处是用来创建一个指定长度用于初始化的空文件,就像临时交换文件。
2.将swapfile设置为swap空间(把这个文件变成swap文件)
mkswap swapfile
3.启用交换空间(启用这个swap文件)
swapon swapfile
删除交换空间命令:swapoff swapfile
至此增加交换空间的操作结束了。可以使用free命令查看swap空间大小是否发生变化;
之后再重新部署kafka,就成功了