目录
[如何把 Docker 容器封装成镜像](#如何把 Docker 容器封装成镜像)
[Docker 部署 Kafka 集群(mac)](#Docker 部署 Kafka 集群(mac))
[Centos 容器启动 rsyslog 服务](#Centos 容器启动 rsyslog 服务)
[Rsyslog 转发日志至 Kafka](#Rsyslog 转发日志至 Kafka)
[node-rdkafka@2.18.0 使用文档](#node-rdkafka@2.18.0 使用文档)
[Librdkafka@2.3.0 国内仓库](#Librdkafka@2.3.0 国内仓库)
如何把 Docker 容器封装成镜像
背景:centos 容器中运行 nginx + rsyslog,另一容器运行 Kafka。centos 容器 rsyslog 无法向 Kafka 生产消息。
要将一个容器封装成一个镜像,你需要使用 Docker 提供的 docker commit
命令。这个命令会基于容器的当前状态创建一个新的镜像。
下面是使用 docker commit
命令的基本步骤:
-
首先,确保你有一个正在运行的容器。你可以通过运行
docker ps
来查看当前运行的容器。 -
使用
docker commit
命令创建镜像。命令的格式如下:
bash
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
其中:
-
[OPTIONS]
是可选的,可以用来指定新镜像的说明等信息。 -
CONTAINER
是要提交的容器的ID或名称。 -
[REPOSITORY[:TAG]]
是新镜像的名称和可选的标签。如果不指定标签,默认标签是latest
。
例如,如果你有一个名为 my_container
的容器,你想将它封装成名为 my_image
的镜像,并且标签为 v1.0
,你可以运行:
bash
docker commit my_container my_image:v1.0
- 运行命令后,使用
docker images
命令可以查看新创建的镜像。
下面是一个简单的例子:
bash
# 创建并运行一个容器
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)
- 集群规划
|----------|--------------|---------------------------|----------|
| 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 | |
- 创建网络
bash
# 配合命令:
docker network create --driver bridge --subnet 172.20.10.0/25 --gateway 172.20.10.1 zk_network
如何在 Docker 中管理和配置容器的网络_怎么修改容器的网络-CSDN博客
- 编写 docker 文件
bash
# 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
bash
# 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
bash
# 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
- 在文件目录下,依次启动docker 文件
bash
docker compose -p zookeeper -f ./zk-docker-compose.yml up -d
bash
docker compose -f ./kafka-docker-compose.yml up -d
bash
docker compose -f ./kafka-manager-docker-compose.yml up -d
- 参考链接
docker 部署 kafka集群 【mac】_mac docker kafka-CSDN博客
https://www.cnblogs.com/jay763190097/p/10292227.html
Centos 容器启动 rsyslog 服务
- 参考链接
https://zhuanlan.zhihu.com/p/606856175?utm_id=0
Rsyslog 转发日志至 Kafka
- 参考链接
日志收集之rsyslog to kafka_rsyslog template kafka-CSDN博客
rsyslog配置详解: https://www.cnblogs.com/jiyanfeng/p/17606513.html
- 安装 rsyslog && rsyslog-kafka
bash
yum install rsyslog
yum install rsyslog-kafka
安装完成后,查看 /lib64/rysylog/ 中是否存在 omkafka.so,验证 rsyslog-kafka 是否安装成功。
- rsyslog 配置
编辑配置文件(路径 `/etc/rsyslog.conf` ),在配置项 `#### MODULES ####` 的下面添加如下配置(或者在 `/etc/rsyslogd/` 目录下添加 `XXX.conf` 配置文件)
bash
# 加载 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` 中日志是否报错。
- kafka 报错:InvalidReceiveException: Invalid receive (size = 1195725856 larger than 104857600)
将 $KAFKA_HOME/config/server.properties 文件中的 socket.request.max.bytes 值重置为超过数据包大小,然后重新启动 kafka 服务器。将 socket.request.max.bytes 翻倍。
- 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 使用文档
- 参考链接
- 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 等版本。注意和宿主机的兼容。
bash
├── include
│ └── node
└── installVersion
bash
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