在docker中使用logstash

文章目录

    • 下载运行
    • 修改容器时区
    • 修改docker的默认存储路径
    • 挂载外部目录,写入没有权限问题

下载运行

下载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的默认存储路径

修改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来执行的了,问题解决。

你可能感兴趣的:(docker)