目录

如何把 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. 集群规划

hostnameip addrportlistener
zook1172.20.10.112183:2181
zook2172.20.10.122184:2181
zook3172.20.10.132185:2181
kafka1172.20.10.14内部 9093:9093,外部 9193:9193
kafka2172.20.10.15内部 9094:9094,外部 9194:9194
kafka3172.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
cat installVersion   
9 

 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 

 

Logo

Kafka开源项目指南提供详尽教程,助开发者掌握其架构、配置和使用,实现高效数据流管理和实时处理。它高性能、可扩展,适合日志收集和实时数据处理,通过持久化保障数据安全,是企业大数据生态系统的核心。

更多推荐