使用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



