下载logstash镜像,这里使用6.2.2版本
docker pull docker.elastic.co/logstash/logstash-oss:6.2.2
本地运新这个镜像,docker run -d docker.elastic.co/logstash/logstash-oss:6.2.2
查看logstash运行情况
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
517f24d2ef0a docker.elastic.co/logstash/logstash-oss:6.2.2 "/usr/local/bin/do..." About a minute ago Up 12 seconds 5044/tcp, 9600/tcp mystifying_shannon
查看logstash中的配置文件
logstash中有两个关键的目录
/usr/share/logstash/pipeline/
/usr/share/logstash/config/
进入到运行的容器中
docker exec -it 517f24d2ef0a /bin/bash
进入后的目录是 /usr/share/logstash
查看文件列表
bash-4.2$ ls -l
total 64
drwxr-xr-x 2 logstash logstash 321 Feb 16 2018 bin
drwxr-xr-x 2 logstash logstash 114 Feb 16 2018 config
-rw-r--r-- 1 logstash logstash 2276 Feb 16 2018 CONTRIBUTORS
drwxr-xr-x 4 logstash logstash 69 Jun 8 08:30 data
-rw-r--r-- 1 logstash logstash 3843 Feb 16 2018 Gemfile
-rw-r--r-- 1 logstash logstash 21148 Feb 16 2018 Gemfile.lock
drwxr-xr-x 6 logstash logstash 84 Feb 16 2018 lib
-rw-r--r-- 1 logstash logstash 589 Feb 16 2018 LICENSE
drwxr-xr-x 4 logstash logstash 90 Feb 16 2018 logstash-core
drwxr-xr-x 3 logstash logstash 57 Feb 16 2018 logstash-core-plugin-api
drwxr-xr-x 4 logstash logstash 55 Feb 16 2018 modules
-rw-rw-r-- 1 logstash logstash 28122 Feb 16 2018 NOTICE.TXT
drwxr-xr-x 2 logstash logstash 27 Feb 16 2018 pipeline
drwxr-xr-x 3 logstash logstash 30 Feb 16 2018 tools
drwxr-xr-x 4 logstash logstash 33 Feb 16 2018 vendor
查看默认的配置文件 /usr/share/logstash/pipeline/logstash.conf
input {
beats {
port => 5044
}
}
output {
stdout {
codec => rubydebug
}
}
查看/usr/share/logstash/config/pipelines.yml 可以看到默认指定了path.config
cat pipelines.yml
# This file is where you define your pipelines. You can define multiple.
# For more information on multiple pipelines, see the documentation:
# https://www.elastic.co/guide/en/logstash/current/multiple-pipelines.html
- pipeline.id: main
path.config: "/usr/share/logstash/pipeline"
So 我们自定义包的时候,只需要替换pipeline下的config就好
开始编写 Dockerfile
Dockerfile 写错了文件的配置路径,害我查了半天的错,注意默认的配置文件在 /usr/share/logstash/pipeline 下
FROM reg.caoke.com/logstash-base:6.2.2
MAINTAINER Caoke "[email protected]"
USER root
COPY config/logstash.conf /usr/share/logstash/pipeline/logstash.conf
ENTRYPOINT ["logstash","-f","/usr/share/logstash/pipeline","--path.logs=/usr/share/logstash/logs"]
Logstash 的日志默认只输出到console中,想要把日志输出到具体的文件中。需要改动log4j的配置文件。
解决把正常logstash同版本的log4j配置复制一份到容器中
docker cp config/log4j2.properties e930724f1e7cbe:/usr/share/logstash/config/log4j2.properties
解决logstash基础镜像中的时区问题
默认容器中时区是 UTC时间,和我们相差了8个小时,默认logstash容器的运行用户是logstash,没有权限修改时区。
以root用户进入运行中的镜像
docker exec -it -u root {id} bash
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
输入 date 验证当前的时间。
以上完事以后,重新打一个镜像
docker commit -m="modify time and log" -a="caoke" {id} reg.caoke.com/logstash-base:6.2.2
推送镜像到 reg.caoke.com
以后每次有任务运行的时候,修改一下logstash.conf文件,重新build一下,就可以了。
#/bin/bash
TAG=V$(date "+%Y%m%d%H%M%S")
docker build -t reg.xxx.com/app-vod-topic-2es:${TAG} .
if [ $? != "0" ] ;then
echo "build fail and exit"
exit
fi
docker push reg.xxx.com/app-vod-topic-2es:${TAG}
修改docker的默认存储路径/var/lib/docker
这个路径默认是系统盘,空间可能会很小,导致使用一段时间后空间占用很大,所以建议修改这个路径。这里我们用软链的方式来修改。
1.如果是已经运行有数据的情况下,先停止docker服务
service docker stop
mv /var/lib/docker /data/docker
ln -sf /data/docker /var/lib/docker
如果创建不成功,到/var/lib目录下尝试
2.没有数据的情况下,直接到/var/lib目录xia
ln -sf /data/docker docker
挂载的时候目录logs,由于不是logstash创建的,所以logstash用户没有权限去写。尝试在基础镜像中创建好镜像,此时目录已经是logstash的了,应该可以写入。测试后发现不可以,由于挂载的目录是root,必须要求容器内是root。
docker run -d docker.elastic.co/logstash/logstash-oss:6.2.2
docker exec -it 25c76e6bfa2a bash
mkdir /usr/share/logstash/logs
chown -R logstash:logstash /usr/share/logstash/logs
docker cp config/log4j2.properties 25c76e6bfa2a:/usr/share/logstash/config/log4j2.properties
docker exec -it --user root 25c76e6bfa2a bash
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
mkdir /usr/share/logstash/logs
docker commit -m="modify time and log" -a="caoke" 25c76e6bfa2a reg.xxx.com/jiagou-logstash/logstash-base:6.2.2
docker commit -m="modify time and log" -a="caoke" 25c76e6bfa2a xxx-hub.xxx.com/jiagou-logstash/logstash-base:6.2.2
解决:在Dockerfile中指定使用USER root 用户,那么启动的时候就是用root来执行的了,问题解决。