使用flume采集应用服务器(华为云)上的日志信息,但运维同学为了方便管理资源,要求使用docker-compose方式安装。而官方docker仓库中的flume不是最新版的,所以打算自己构建flume镜像。 flume依赖于jdk,所以安装flume的容器需要有jdk;那么首先构建一个基于centos7的jdk1.8的镜像centos7-jdk1.8;然后基于镜像centos7-jdk1.8构建安装的flume镜像flume;最后再使用docker-compose安装容器。
一、构建centos7-jdk1.8镜像
1)编写Dockerfile文件
# 使用 centos7 作为基础镜像
FROM centos:7
MAINTAINER niedefang "niedefang@126.com"
# 添加压缩包到容器目录 /usr/java/jdk 中
ADD jdk-8u281-linux-x64.tar.gz /usr/local/java
# 设置环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_281
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH $PATH:$JAVA_HOME/bin
CMD ["java","-version"]
2)创建镜像并推到远程华为云仓库
docker build -t swr.cn-north-4.myhuaweicloud.com/shuiben/centos7-jdk1.8:1.0 . && docker push swr.cn-north-4.myhuaweicloud.com/shuiben/centos7-jdk1.8:1.0
二、构建flume镜像
1)编写Dockerfile文件
FROM swr.cn-north-4.myhuaweicloud.com/shuiben/centos7-jdk1.8:1.0
MAINTAINER niedefang "niedefang@126.com"
ADD apache-flume-1.9.0-bin.tar.gz /opt/
RUN mv /opt/apache-flume-1.9.0-bin /opt/flume
#设置环境变量
ENV FLUME_HOME /opt/flume
ENV PATH $PATH:$FLUME_HOME/bin
WORKDIR /opt/flume
#ENTRYPOINT ["tail", "-f", "/dev/null"]
#ENTRYPOINT ["./conf/start_agents.sh"]
CMD ["flume-ng","version"]
2)创建镜像并推到远程华为云仓库
docker build -t swr.cn-north-4.myhuaweicloud.com/shuiben/flume .
docker push swr.cn-north-4.myhuaweicloud.com/shuiben/flume
注:这两个镜像也可以放在一个Dockerfile中构建成一个镜像;我这里分开构建的原因是如果后期再有需要使用jdk的镜像,则可以直接使用。
三、构建flume容器
1)编写docker-compose.yml文件
version: "3"
services:
flume:
image: swr.cn-north-4.myhuaweicloud.com/shuiben/flume
container_name: myflume
restart: always
network_mode: bridge
privileged: true
volumes:
- ./conf:/opt/flume/conf #映射配置文件目录
- ./logs:/opt/flume/logs #映射日志文件目录
- /data/log/xiaohe/prod:/logs/xiaohe #映射flume监听的日志文件所在目录
entrypoint: ["bash","-c","/opt/flume/conf/start_agents.sh"] #启动flume的agent的脚本
tty: true #不加这个属性,容器启动后会自动停止
2)启动flume agent的脚本
start_agents.sh
#!/bin/bash
echo "Start agents..."
flume-ng agent -c conf/ -n log_monitor -f conf/flume.conf -Dflume.root.logger=INFO,console > logs/log_monitor.out 2>&1
#如果使用docker run 的方式启动容器,都要记得加上 exec "$@" 或者 tail -f /dev/null ;否则执行完脚本容器就自动关闭了;而docker-compose方式因为有tty:true,所以这里就不需要了
#exec "$@"
#tail -f /dev/null
3)flume.conf文件编写
log_monitor.sources = r1
log_monitor.channels = c1
log_monitor.sinks = k1
log_monitor.sources.r1.type = TAILDIR
#当偏移量不能写入到文件时是否跳到文件结尾
#log_monitor.sources.r1.channels.skipToEnd = True
log_monitor.sources.r1.filegroups = f1
log_monitor.sources.r1.filegroups.f1 = /logs/xiaohe/app.log*
log_monitor.channels.c1.type=SPILLABLEMEMORY
log_monitor.channels.c1.checkpointDir = /data/flume/checkpoint
log_monitor.channels.c1.dataDirs = /data/flume
log_monitor.sinks.k1.type =avro
log_monitor.sinks.k1.hostname = 39.107.24.78
log_monitor.sinks.k1.port = 4444
log_monitor.sources.r1.channels = c1
log_monitor.sinks.k1.channel = c1
4)启动和停止容器
#启动
docker-compose up -d
#停止
docker-compose down -v