目次
如何把 Docker 容器封装成镜像
Docker 摆设 Kafka 集群(mac)
Centos 容器启动 rsyslog 服务
Rsyslog 转发日志至 Kafka
node-rdkafka@2.18.0 使用文档
Librdkafka@2.3.0 国内仓库
如何把 Docker 容器封装成镜像
配景:centos 容器中运行 nginx + rsyslog,另一容器运行 Kafka。centos 容器 rsyslog 无法向 Kafka 生产消息。
要将一个容器封装成一个镜像,你需要使用 Docker 提供的 docker commit 命令。这个命令会基于容器的当前状态创建一个新的镜像。
下面是使用 docker commit 命令的基本步调:
1. 首先,确保你有一个正在运行的容器。你可以通过运行 docker ps 来查察当前运行的容器。
2. 使用 docker commit 命令创建镜像。命令的格式如下:
- docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
复制代码 其中:
- [OPTIONS] 是可选的,可以用来指定新镜像的分析等信息。
- CONTAINER 是要提交的容器的ID或名称。
- [REPOSITORY[:TAG]] 是新镜像的名称和可选的标签。如果不指定标签,默认标签是latest。
例如,如果你有一个名为 my_container 的容器,你想将它封装成名为 my_image 的镜像,并且标签为 v1.0,你可以运行:
- docker commit my_container my_image:v1.0
复制代码 3. 运行命令后,使用 docker images 命令可以查察新创建的镜像。
下面是一个简单的例子:
- # 创建并运行一个容器docker run -d --name my_container ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done" # 提交容器到镜像docker commit my_container my_image:v1.0
- # 查察创建的镜像docker images
复制代码 实验上述步调后,你就会有一个包罗了特定输出的镜像 my_image:v1.0。
Docker 摆设 Kafka 集群(mac)
1. 集群规划
hostname | ip addr | port | listener | zook1 | 172.20.10.11 | 2183:2181 | | zook2 | 172.20.10.12 | 2184:2181 | | zook3 | 172.20.10.13 | 2185:2181 | | kafka1 | 172.20.10.14 | 内部 9093:9093,外部 9193:9193 | | kafka2 | 172.20.10.15 | 内部 9094:9094,外部 9194:9194 | | kafka3 | 172.20.10.16 | 内部 9095:9095,外部 9195:9195 | | 2. 创建网络
- # 配合命令:
- docker network create --driver bridge --subnet 172.20.10.0/25 --gateway 172.20.10.1 zk_network
复制代码 如安在 Docker 中管理和配置容器的网络_怎么修改容器的网络-CSDN博客
3. 编写 docker 文件
- # zk-docker-compose.yml
- version: '3.4'
- services:
- zook1:
- image: zookeeper:latest
- #restart: always #自动重新启动
- hostname: zook1
- container_name: zook1 #容器名称,方便在rancher中显示有意义的名称
- ports:
- - 2183:2181 #将本容器的zookeeper默认端口号映射出去
- volumes:
- # 挂载数据卷 前面是宿主机即本机的目录位置,后面是docker的目录
- - "./zook1/data:/data"
- - "./zook1/datalog:/datalog"
- - "./zook1/logs:/logs"
- environment:
- ZOO_MY_ID: 1 #即是zookeeper的节点值,也是kafka的brokerid值
- ZOO_SERVERS: server.1=zook1:2888:3888;2181 server.2=zook2:2888:3888;2181 server.3=zook3:2888:3888;2181
- networks:
- zk_network:
- ipv4_address: 172.20.10.11
- zook2:
- image: zookeeper
- #restart: always #自动重新启动
- hostname: zook2
- container_name: zook2 #容器名称,方便在rancher中显示有意义的名称
- ports:
- - 2184:2181 #将本容器的zookeeper默认端口号映射出去
- volumes:
- - "./zook2/data:/data"
- - "./zook2/datalog:/datalog"
- - "./zook2/logs:/logs"
- environment:
- ZOO_MY_ID: 2 #即是zookeeper的节点值,也是kafka的brokerid值
- ZOO_SERVERS: server.1=zook1:2888:3888;2181 server.2=zook2:2888:3888;2181 server.3=zook3:2888:3888;2181
- networks:
- zk_network:
- ipv4_address: 172.20.10.12
- zook3:
- image: zookeeper
- #restart: always #自动重新启动
- hostname: zook3
- container_name: zook3 #容器名称,方便在rancher中显示有意义的名称
- ports:
- - 2185:2181 #将本容器的zookeeper默认端口号映射出去
- volumes:
- - "./zook3/data:/data"
- - "./zook3/datalog:/datalog"
- - "./zook3/logs:/logs"
- environment:
- ZOO_MY_ID: 3 #即是zookeeper的节点值,也是kafka的brokerid值
- ZOO_SERVERS: server.1=zook1:2888:3888;2181 server.2=zook2:2888:3888;2181 server.3=zook3:2888:3888;2181
- networks:
- zk_network:
- ipv4_address: 172.20.10.13
- networks:
- zk_network:
- name: zk_network
- external: true
复制代码- # kafka-docker-compose.yml
- version: '2'
- services:
- kafka1:
- image: wurstmeister/kafka
- restart: always #自动重新启动
- hostname: kafka1
- container_name: kafka1
- ports:
- - 9093:9093
- - 9193:9193
- environment:
- KAFKA_BROKER_ID: 1
- KAFKA_LISTENERS: INSIDE://:9093,OUTSIDE://:9193
- #KAFKA_ADVERTISED_LISTENERS=INSIDE://<container>:9092,OUTSIDE://<host>:9094
- KAFKA_ADVERTISED_LISTENERS: INSIDE://172.20.10.14:9093,OUTSIDE://localhost:9193
- KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
- KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
- KAFKA_ZOOKEEPER_CONNECT: zook1:2181,zook2:2181,zook3:2181
- ALLOW_PLAINTEXT_LISTENER: 'yes'
- JMX_PORT: 9999 #开放JMX监控端口,来监测集群数据
- volumes:
- - ./kafka1/wurstmeister/kafka:/wurstmeister/kafka
- - ./kafka1/kafka:/kafka
- external_links:
- - zook1
- - zook2
- - zook3
- networks:
- zk_network:
- ipv4_address: 172.20.10.14
- kafka2:
- image: wurstmeister/kafka
- restart: always #自动重新启动
- hostname: kafka2
- container_name: kafka2
- ports:
- - 9094:9094
- - 9194:9194
- environment:
- KAFKA_BROKER_ID: 2
- KAFKA_LISTENERS: INSIDE://:9094,OUTSIDE://:9194
- #KAFKA_ADVERTISED_LISTENERS=INSIDE://<container>:9092,OUTSIDE://<host>:9094
- KAFKA_ADVERTISED_LISTENERS: INSIDE://172.20.10.15:9094,OUTSIDE://localhost:9194
- KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
- KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
- KAFKA_ZOOKEEPER_CONNECT: zook1:2181,zook2:2181,zook3:2181
- ALLOW_PLAINTEXT_LISTENER: 'yes'
- JMX_PORT: 9999 #开放JMX监控端口,来监测集群数据
- volumes:
- - ./kafka2/wurstmeister/kafka:/wurstmeister/kafka
- - ./kafka2/kafka:/kafka
- external_links:
- - zook1
- - zook2
- - zook3
- networks:
- zk_network:
- ipv4_address: 172.20.10.15
- kafka3:
- image: wurstmeister/kafka
- restart: always #自动重新启动
- hostname: kafka3
- container_name: kafka3
- ports:
- - 9095:9095
- - 9195:9195
- environment:
- KAFKA_BROKER_ID: 3
- KAFKA_LISTENERS: INSIDE://:9095,OUTSIDE://:9195
- #KAFKA_ADVERTISED_LISTENERS=INSIDE://<container>:9092,OUTSIDE://<host>:9094
- KAFKA_ADVERTISED_LISTENERS: INSIDE://172.20.10.16:9095,OUTSIDE://localhost:9195
- KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
- KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
- KAFKA_ZOOKEEPER_CONNECT: zook1:2181,zook2:2181,zook3:2181
- ALLOW_PLAINTEXT_LISTENER: 'yes'
- JMX_PORT: 9999 #开放JMX监控端口,来监测集群数据
- volumes:
- - ./kafka3/wurstmeister/kafka:/wurstmeister/kafka
- - ./kafka3/kafka:/kafka
- external_links:
- - zook1
- - zook2
- - zook3
- networks:
- zk_network:
- ipv4_address: 172.20.10.16
- networks:
- zk_network:
- name: zk_network
- external: true
复制代码- # kafka-manager-docker-compose.yml
- version: '2'
- services:
- kafka-manager:
- image: scjtqs/kafka-manager:latest
- restart: always
- hostname: kafka-manager
- container_name: kafka-manager
- ports:
- - 9000:9000
- external_links:
- # 连接本compose文件以外的container
- - zook1
- - zook2
- - zook3
- - kafka1
- - kafka2
- - kafka3
- environment:
- ZK_HOSTS: zook1:2181,zook2:2181,zook3:2181
- KAFKA_BROKERS: kafka1:9093,kafka2:9094,kafka3:9095
- APPLICATION_SECRET: letmein
- KM_ARGS: -Djava.net.preferIPv4Stack=true
- networks:
- zk_network:
- ipv4_address: 172.20.10.10
- networks:
- zk_network:
- name: zk_network
- external: true
复制代码 4. 在文件目次下,依次 启动docker 文件
- docker compose -p zookeeper -f ./zk-docker-compose.yml up -d
复制代码- docker compose -f ./kafka-docker-compose.yml up -d
复制代码- docker compose -f ./kafka-manager-docker-compose.yml up -d
复制代码 5. 参考链接
docker 摆设 kafka集群 【mac】_mac docker kafka-CSDN博客
https://www.cnblogs.com/jay763190097/p/10292227.html
Centos 容器启动 rsyslog 服务
1. 参考链接
https://zhuanlan.zhihu.com/p/606856175?utm_id=0
Rsyslog 转发日志至 Kafka
1. 参考链接
最佳实践:Rsyslog转发日志至kafka
日志网络之rsyslog to kafka_rsyslog template kafka-CSDN博客
rsyslog配置详解: https://www.cnblogs.com/jiyanfeng/p/17606513.html
2. 安装 rsyslog && rsyslog-kafka
- yum install rsyslog
- yum install rsyslog-kafka
复制代码 安装完成后,查察 /lib64/rysylog/ 中是否存在 omkafka.so,验证 rsyslog-kafka 是否安装成功。
3. rsyslog 配置
编辑配置文件(路径 `/etc/rsyslog.conf` ),在配置项 `#### MODULES ####` 的下面添加如下配置(大概在 `/etc/rsyslogd/` 目次下添加 `XXX.conf` 配置文件)
- # 加载 omkafka 和 imfile 模块
- module(load="omkafka")
- module(load="imfile")
-
- # nginx template
- template(name="nginxAccessTemplate" type="string" string="%hostname%<-+>%syslogtag%<-+>%msg%\n")
-
- # ruleset
- ruleset(name="nginx-kafka") {
- # 日志转发 kafka
- action (
- type="omkafka"
- template="nginxAccessTemplate"
- topic="fee-test"
- broker="localhost:9092"
- )
- }
-
- # 定义消息来源及设置相关的 action
- input(type="imfile" Tag="nginx-accesslog" File="/var/log/nginx/access.log" Ruleset="nginx-kafka")
复制代码 配置简单分析:
* `localhost:9092` 需要修改为你自己的kafka地址(如果为集群多个地址逗号分隔)
* `/var/log/nginx/access.log` 是监控的nginx日志文件
* `topic: fee-test`后续通过 `kafka-manager` 创建
修改完配置后运行: `rsyslogd -N 1` 查察配置是否报错;`rsyslogd -dn` debug 模式运行。
然后重启 `rsyslog`:`service rsyslog restart` `systemctl restart rsyslog` 。重启后查察 `/var/log/message` 中日志是否报错。
4. kafka 报错:InvalidReceiveException: Invalid receive (size = 1195725856 larger than 104857600)
将 $KAFKA_HOME/config/server.properties 文件中的 socket.request.max.bytes 值重置为超过数据包大小,然后重新启动 kafka 服务器。将 socket.request.max.bytes 翻倍。
5. Kafka 配置文件位置
Kafka 配置文件 server.properties 的位置取决于Kafka安装的路径。通常环境下,当你从Apache 官方网站下载 Kafka 或通过工具如 wget 或 curl 命令行工具下载时,配置文件会被放置在 Kafka 安装目次的 config 子目次下。
例如,如果你的 Kafka 安装在 /opt/kafka 目次,那么配置文件 server.properties 的完整路径就是 /opt/kafka/config/server.properties。
如果你是通过某种包管理器(如 apt 或 yum)安装的 Kafka,配置文件的位置可能会有所差别,但通常也会在 /etc/kafka 或 /etc/kafka/conf 目次下。
要修改 Kafka 配置,你需要编辑 server.properties 文件,并根据你的需求举行相应的设置。例如,你可以修改 log.dirs 来指定日志文件存放的目次,大概修改 listeners 来指定Kafka 监听的地址和端口。
node-rdkafka@2.18.0 使用文档
1. 参考链接
node-rdkafka - npm
2. npm install node-rdkafka 时 node-gyp rebuild 卡住解决办法
node-gyp 需要 Python2.7 环境。
可以使用 npm install --loglevel verbose 查察安装时间的详细日志。
node-rdkafka install 时需要构建,通常会卡住。因为构建需要 node 源码来提供头文件,毗连外网下载很慢。so 建议自己下载后放置在 /Users/xxx/Library/Caches/node-gyp/10.23.3 中。
node 区分 arm64 x86 x64 等版本。留意和宿主机的兼容。
- ├── include
- │ └── node
- └── installVersion
复制代码 npm install时node-gyp rebuild 卡住解决办法 - 杜神的技能博客 - ITeye博客
https://www.cnblogs.com/mliudong/p/4528539.html
Librdkafka@2.3.0 国内仓库
librdkafka: librdkafka 是 Apache Kafka 的 C/C++ 开辟包,提供生产者、消费者和管理客户端 - Gitee.com
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |