10个日常Docker使用技巧_3
背景:
阅读新闻
10个日常Docker使用技巧
[日期:2015-12-21]
来源:xiequan.info
作者:谢权
[字体:大 中 小]
我有机会建立一个以Docker为基础的微服务架构在我现在的工作中,很多人都会分享他们使用Docker的心得,我想我也不会例外。因此我总结了一些,可能你会在日常使用Docker的时候会用到。
1. 一台主机部署多个Docker实例
如果你想运行多个Docker 容器在一台主机上,如果要设置不同的TLS设置,网络设置,日志设置和存储驱动程序特定的容器,这是特别有用的。例如,我们目前正在运行一个标准设立两个Docker守护进程。一运行consul提供DNS解析,并作为群集存储为其他Docker 容器。
For example:
# start a docker daemon and bind to a specific port
docker daemon -H tcp://$IP:5000 --storage-opt dm.fs=xfs \
-p "/var/run/docker1.pid" \
-g "/var/lib/docker1" \
--exec-root="/var/run/docker1
# and start another daemon
docker daemon -H tcp://$IP:5001 --storage-opt dm.fs=xfs \
-s devicemapper \
--storage-opt dm.thinpooldev=/dev/mapper/docker--vg-docker--pool \
-p "/var/run/docker2.pid" \
-g "/var/lib/docker2" --exec-root="/var/run/docker2"
--cluster-store=consul://$IP:8500 \
--cluster-advertise=$IP:2376
# start a docker daemon and bind to a specific port
dockerdaemon -H tcp://$IP:5000 --storage-opt dm.fs=xfs \
-p "/var/run/docker1.pid" \
-g "/var/lib/docker1" \
--exec-root="/var/run/docker1
# and start another daemon
docker daemon -H tcp://$IP:5001 --storage-opt dm.fs=xfs \
-s devicemapper \
--storage-opt dm.thinpooldev=/dev/mapper/docker--vg-docker--pool \
-p "/var/run/docker2.pid" \
-g "/var/lib/docker2" --exec-root="/var/run/docker2"
--cluster-store=consul://$IP:8500 \
--cluster-advertise=$IP:2376
2. Docker Exec的使用
Docker Exec是一个很重要很多人都会用到的工具,也许你使用Docker不只是为你的升级,生产和测试环境,同时也对本地机器上运行的数据库,服务器密钥库等,这是能够直接运行的容器的上下文中运行的命令,非常方便。
我们做了大量的Cassandra,并检查表是否包含正确的数据。如果你只是想执行一个快速CQL查询,Docker exec 就很赞:
$ docker ps --format "table {{.ID}}\t {{.Names}}\t {{.Status}}"
CONTAINER ID NAMES STATUS
682f47f97fce cassandra Up 2 minutes
4c45aea49180 consul Up 2 minutes
$ docker exec -ti 682f47f97fce cqlsh --color
Connected to Test Cluster at 127.0.0.1:9042.
[cqlsh 5.0.1 | Cassandra 2.2.3 | CQL spec 3.3.1 | Native protocol v4]
Use HELP for help.
cqlsh>
$ dockerps --format "table {{.ID}}\t {{.Names}}\t {{.Status}}"
CONTAINERID NAMES STATUS
682f47f97fce cassandra Up 2 minutes
4c45aea49180 consul Up 2 minutes
$ dockerexec -ti 682f47f97fce cqlsh --color
Connectedto TestClusterat 127.0.0.1:9042.
[cqlsh 5.0.1 | Cassandra 2.2.3 | CQLspec 3.3.1 | Native protocolv4]
Use HELPfor help.
cqlsh>
或者只是访问nodetool或镜像中可用的任何其他工具:
$ docker exec -ti 682f47f97fce nodetool status
Datacenter: datacenter1=======================Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns Host ID Rack
UN 192.168.99.100 443.34 KB 256 ? 8f9f4a9c-5c4d-4453-b64b-7e01676361ff rack1
Note: Non-system keyspaces don't have the same replication settings, effective ownership information
$ dockerexec -ti 682f47f97fce nodetoolstatus
Datacenter: datacenter1=======================Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns HostID Rack
UN 192.168.99.100 443.34 KB 256 ? 8f9f4a9c-5c4d-4453-b64b-7e01676361ff rack1
Note: Non-systemkeyspacesdon't havethesamereplicationsettings, effectiveownershipinformation
这当然可以被应用到任何(Client)的工具捆绑在一起的镜像中。我个人觉得这样会比所有客户端和本地更新更简单。
3. Docker 的检查 和JQ
与其说这是一个Docker技巧,不如说是一个JQ技巧。如果你没有听过JQ,它是一个在命令行解析JSON的伟大工具。因为我们可以不需要使用format specifier而能够查看容器里面发生的一切。
# Get network information:
$ docker inspect 4c45aea49180 | jq '.[].NetworkSettings.Networks'
{
"bridge": {
"EndpointID": "ba1b6efba16de99f260e0fa8892fd4685dbe2f79cba37ac0114195e9fad66075",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02"
}
}
# Get the arguments with which the container was started
$ docker inspect 4c45aea49180 | jq '.[].Args'
[
"-server",
"-advertise",
"192.168.99.100",
"-bootstrap-expect",
"1"
]
# Get all the mounted volumes
11:22 $ docker inspect 4c45aea49180 | jq '.[].Mounts'
[
{
"Name": "a8125ffdf6c4be1db4464345ba36b0417a18aaa3a025267596e292249ca4391f",
"Source": "/mnt/sda1/var/lib/docker/volumes/a8125ffdf6c4be1db4464345ba36b0417a18aaa3a025267596e292249ca4391f/_data",
"Destination": "/data",
"Driver": "local",
"Mode": "",
"RW": true
}
]
# Get network information:
$ dockerinspect 4c45aea49180 | jq '.[].NetworkSettings.Networks'
{
"bridge": {
"EndpointID": "ba1b6efba16de99f260e0fa8892fd4685dbe2f79cba37ac0114195e9fad66075",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02"
}
}
# Get the arguments with which the container was started
$ dockerinspect 4c45aea49180 | jq '.[].Args'
[
"-server",
"-advertise",
"192.168.99.100",
"-bootstrap-expect",
"1"
]
# Get all the mounted volumes
11:22 $ dockerinspect 4c45aea49180 | jq '.[].Mounts'
[
{
"Name": "a8125ffdf6c4be1db4464345ba36b0417a18aaa3a025267596e292249ca4391f",
"Source": "/mnt/sda1/var/lib/docker/volumes/a8125ffdf6c4be1db4464345ba36b0417a18aaa3a025267596e292249ca4391f/_data",
"Destination": "/data",
"Driver": "local",
"Mode": "",
"RW": true
}
]
当然,它也能很好的完成查询其他类型的(Docker-esque) API生成的JSON(e.g Marathon, Mesos, Consul etc.)JQ提供了一个非常广泛的API,用于访问和处理JSON.更多信息可以在这里找到: https://stedolan.github.io/jq/
4. 扩展现有容器和在本地注册
在Docker hub中有大量可以使用的的不同使用场景的镜像。我们注意到,虽然有很多可用的镜像,但是很多时候我们不得对他们做一些修改。比如更好的健康检查consul,通过系统变量或命令行参数的其他配置,为更好地设置或增加我们的集群,这是不容易做到的。如果我们碰到这个是刚刚创建自己的Docker的镜像和把它推到我们的本地注册表。我们通常是这么做的。
比如,我们希望有JQ可在我们的consul 镜像中这样我们就可以很方便的检查我们的服务是否正常。
FROM progrium/consul
USER root
ADD bin/jq /bin/jq
ADD scripts/health-check.sh /bin/health-check.sh
FROMprogrium/consul
USERroot
ADDbin/jq /bin/jq
ADDscripts/health-check.sh /bin/health-check.sh
我们有了health check scripts and JQ我们就可以从我们自己的consul image做health check了。我们也有一个本地注册表运行镜像在创建后,我们只是标记生成的镜像,并将其推到我们的本地注册表
$ docker build .
...
$ docker tag a3157e9edc18 /consul-local:some-tag
$ docker push /consul-local:some-tag
$ dockerbuild .
...
$ dockertaga3157e9edc18 /consul-local:some-tag
$ dockerpush /consul-local:some-tag
现在,它可以提供给我们的开发者了。并且也可在我们的不同的测试环境中使用。
5. 访问远程主机的Docker
Docker的CLI是一个非常酷的工具,其中一个很大的特点是,你可以用它来轻松地访问多Docker守护进程,即使它们在不同的主机。你需要做的就是设置DOCKER_HOST环境变量指向Docker daemon的监听地址。如果该端口是可以的访问,你可以直接在远程主机上的Docker,这和你运行一个Docker daemon ,并设置为通过docker-machine几乎相同的原理。
$ docker-machine env demo
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/jos/.docker/machine/machines/demo"
export DOCKER_MACHINE_NAME="demo"
$ docker-machineenvdemo
exportDOCKER_TLS_VERIFY="1"
exportDOCKER_HOST="tcp://192.168.99.100:2376"
exportDOCKER_CERT_PATH="/Users/jos/.docker/machine/machines/demo"
exportDOCKER_MACHINE_NAME="demo"
但你不必限制自己Docker daemons 程通过docker-machine启动。如果你有你的后台程序运行的控制,以及安全的网络,你可以很容易地从一台机器控制所有的。
6. 简单的主机目录挂载
当你正在使用你的容器,你有时需要得到容器里面的一些数据。您可以复制它,或者通过使用ssh命令。但多数情况下是最容易的是将一个主机目录添加容器中。可以很容易地通过执行下面的命令完成操作:
$ mkdir /Users/jos/temp/samplevolume/
$ ls /Users/jos/temp/samplevolume/
$ docker run -v /Users/jos/temp/samplevolume/:/samplevolume -it --rm busybox
$ docker run -v /Users/jos/temp/samplevolume/:/samplevolume -it --rm busybox
/ # ls samplevolume/
/ # touch samplevolume/hello
/ # ls samplevolume/
hello
/ # exit
$ ls /Users/jos/temp/samplevolume/
hello
$ mkdir /Users/jos/temp/samplevolume/
$ ls /Users/jos/temp/samplevolume/
$ dockerrun -v /Users/jos/temp/samplevolume/:/samplevolume -it --rmbusybox
$ dockerrun -v /Users/jos/temp/samplevolume/:/samplevolume -it --rmbusybox
/ # ls samplevolume/
/ # touch samplevolume/hello
/ # ls samplevolume/
hello
/ # exit
$ ls /Users/jos/temp/samplevolume/
hello
你可以看到我们指定的目录安装在容器内,而且我们把所有的文件都在主机上,并在容器内可见。我们也可以使用inspect查看,看看有什么安装在哪里。
$ docker inspect 76465cee5d49 | jq '.[].Mounts'
[
{
"Source": "/Users/jos/temp/samplevolume",
"Destination": "/samplevolume",
"Mode": "",
"RW": true
}
]
$ dockerinspect 76465cee5d49 | jq '.[].Mounts'
[
{
"Source": "/Users/jos/temp/samplevolume",
"Destination": "/samplevolume",
"Mode": "",
"RW": true
}
]
我们可以在Docker官网看到更多的特性和使用方 法: https://docs.docker.com/engine/userguide/dockervolumes/
7.添加DNS解析到你的容器
我之前提到过,我们可以通过consul来管理容器。Consul是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件,可以为容器提供服务发现和健康检查。对于服务发现Consul提供无论是REST API或传统DNS,他的伟大的之处是,当你运行一个具体的镜像,你可以指定你的容器DNS服务器。
当你有Consul运行(或者其它 DNS server)你可以把它添加到您的Docker daemon就像这样:
docker run -d --dns $IP_CONSUL --dns-search service.consul
dockerrun -d --dns $IP_CONSUL --dns-searchservice.consul
现在,我们可以解决与Consul的名字注册的所有容器的IP地址,比如在我们的环境我们有了一个cassandra 集群。每个cassandra将自己注册名称为“cassandra”我们的Consul 集群。最酷的是,我们现在只是解决卡cassandra的地址基于主机名(而不必使用Docker链接)
$ docker exec -ti 00c22e9e7c4e bash
daemon@00c22e9e7c4e:/opt/docker$ ping cassandra
PING cas九度快排系统 https://www.190seo.comsandra.service.consul (192.168.99.100): 56 data bytes
64 bytes from 192.168.99.100: icmp_seq=0 ttl=64 time=0.053 ms
64 bytes from 192.168.99.100: icmp_seq=1 ttl=64 time=0.077 ms
^C--- cassandra.service.consul ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/stddev=0.053/0.065/0.077/0.000 ms
daemon@00c22e9e7c4e:/opt/docker$
$ dockerexec -ti 00c22e9e7c4e bash
daemon@00c22e9e7c4e:/opt/docker$ pingcassandra
PINGcassandra.service.consul (192.168.99.100): 56 databytes
64 bytesfrom 192.168.99.100: icmp_seq=0 ttl=64 time=0.053 ms
64 bytesfrom 192.168.99.100: icmp_seq=1 ttl=64 time=0.077 ms
^C--- cassandra.service.consulpingstatistics ---
2 packetstransmitted, 2 packetsreceived, 0% packetloss
round-tripmin/avg/max/stddev=0.053/0.065/0.077/0.000 ms
daemon@00c22e9e7c4e:/opt/docker$
8. Docker-UI是一个很棒来查看和获取洞察你容器的方式
使用Docker CLI来查看Docker容器所发生的一切并不难。很多时候,虽然你并不需要的Docker CLI的全部功能,但只是想快速浏览其中的容器运行,看看发生了什么。Docker UI ( https://github.com/crosbymichael/dockerui )就是一个这样伟大的项目,并且他是开源的。
有了这个工具,你可以看到一个特定的Docker deamon的容器和镜像的最重要的东西。
9. Container 不能启动? Overwrite the Entry Point你只需要从bash启动。
有时候一个容器只是没有做你想要它做的事情,你已经重新创建了Docker 镜像,你在启动时运行了几次,但不知何故,该应用程序没有反应,然后日志显示也没什么有用的信息。最简单的调试方法是overwrite the entry point ,看看在容器内部发生的一切,查看文件权限是否正确。拷贝进入镜像的文件是否正确,或者任何其它可能出现的错误。幸运的是,Docker有这样做的一个简单的解决方案。你可以从一个选择的入口点启动你的容器:
$ docker run -ti --entrypoint=bash cassandra
root@896757f0bfd4:/# ls
bin dev etc lib mediaopt root sbin sys usr
boot docker-entrypoint.sh home lib64 mntproc run srv tmp var
root@896757f0bfd4:/#
$ dockerrun -ti --entrypoint=bashcassandra
root@896757f0bfd4:/# ls
bin dev etc libmediaopt root sbin sys usr
boot docker-entrypoint.sh home lib64 mntproc run srv tmp var
root@896757f0bfd4:/#
10. 监听一个容器的事件:
当你编写自己的脚本,或者只是想了解发生了什么,你可以Docker event command运行你的镜像,为此编写脚本很容易。
这是我们没有使用Docker Compose 和Swarm yet和Docker 1.9网络层 特性的情况,Docker一个很酷的工具,有一套伟大的工具。在未来希望Docker越来越好,我也会给大家展示一些Docker更酷的东西。
更多Docker相关教程见以下内容:
Docker安装应用(CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm
Ubuntu 14.04安装Docker http://www.linuxidc.com/linux/2014-08/105656.htm
Ubuntu使用VNC运行基于Docker的桌面系统 http://www.linuxidc.com/Linux/2015-08/121170.htm
阿里云CentOS 6.5 模板上安装 Docker http://www.linuxidc.com/Linux/2014-11/109107.htm
Ubuntu 15.04下安装Docker http://www.linuxidc.com/Linux/2015-07/120444.htm
在Ubuntu Trusty 14.04 (LTS) (64-bit)安装Docker http://www.linuxidc.com/Linux/2014-10/108184.htm
在 Ubuntu 15.04 上如何安装Docker及基本用法 http://www.linuxidc.com/Linux/2015-09/122885.htm
Docker 的详细介绍:请点这里
Docker 的下载地址:请点这里
本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-12/126586.htm
Docker容器明文密码问题解决之道
使用Elasticsearch + Logstash + Kibana搭建日志集中分析平台实践
相关资讯
Docker Docker使用技巧
Docker启动容器报错: could not (今 06:39)
使用 Docker 搭建 Tomcat 运行环境 (09月02日)
Ubuntu 16.04 服务器上配置使用 (06月25日)
Docker对CPU使用及在Kubernetes中 (今 06:36)
Docker 健康检查功能 (08月13日)
来自Datadog的Docker全球使用调查 (06月20日)
本文评论
查看全部评论 (0)
表情:
姓名:
匿名
字数
同意评论声明
评论声明
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款
最新资讯
Docker启动容器报错: could not synchronis
Docker中执行sed: can't move '/etc/resolv
Docker对CPU使用及在Kubernetes中的应用
使用Docker部署Ambari的若干要点
容器化实践的经验分享
TensorFlow与Kubernetes/Docker结合使用实
一加被指以非匿名形式搜集使用者数据
重建二叉树
C#实现二叉树的遍历
Python 实现单例模式
背景:
阅读新闻
使用Elasticsearch + Logstash + Kibana搭建日志集中分析平台实践
[日期:2015-12-21]
来源:xiequan.info
作者:谢权
[字体:大 中 小]
在上周的上海Gopher Meetup的聚会上,听了ASTA谢的演讲。然后公司最近也需要实现一个日志集中分析平台。ASTA谢恰好也讲了他使用了Elasticsearch + Logstash + Kibana这个组合进行日志分析。回来之后就买了一本书然后各种google把它配置好了,当然只是把框架搭好了。这三个组建还有很多功能并没有熟悉。本文只是简单的介绍在CentOS如果配置ELK(因为公司的服务器是Centos的,个人比较喜欢Ubuntu 哈哈)
什么是ELK:
Elasticsearch + Logstash + Kibana(ELK)是一套开源的日志管理方案,分析网站的访问情况时我们一般会借助Google/百度/CNZZ等方式嵌入JS做数据统计,但是当网站访问异常或者被攻击时我们需要在后台分析如Nginx的具体日志,而Nginx日志分割/GoAccess/Awstats都是相对简单的单节点解决方案,针对分布式集群或者数据量级较大时会显得心有余而力不足,而ELK的出现可以使我们从容面对新的挑战。
Logstash:负责日志的收集,处理和储存
Elasticsearch:负责日志检索和分析
Kibana:负责日志的可视化
官方网站:
JDK – http://www.Oracle.com/technetwork/java/javase/downloads/index.html
Elasticsearch – https://www.elastic.co/downloads/elasticsearch
Logstash – https://www.elastic.co/downloads/logstash
Kibana – https://www.elastic.co/downloads/kibana
Nginx-https://www.nginx.com/
服务端配置:
安装Java JDK:
cat /etc/RedHat-release
//这是我linux的版本
CentOS Linux release 7.1.1503 (Core)
//我们通过yum 方式安装Java Jdk
yum install java-1.7.0-openjdk
Elasticsearch安装:
#下载安装
wget https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.1.noarch.rpm
yum localinstall elasticsearch-1.7.1.noarch.rpm
#启动相关服务
service elasticsearch start
service elasticsearch status
#查看Elasticsearch的配置文件
rpm -qc elasticsearch
/etc/elasticsearch/elasticsearch.yml
/etc/elasticsearch/logging.yml
/etc/init.d/elasticsearch
/etc/sysconfig/elasticsearch
/usr/lib/sysctl.d/elasticsearch.conf
/usr/lib/systemd/system/elasticsearch.service
/usr/lib/tmpfiles.d/elasticsearch.conf
#查看端口使用情况
netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1817/master
tcp 0 0 0.0.0.0:5601 0.0.0.0:* LISTEN 27369/node
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 31848/nginx: master
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 16567/sshd
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 8263/java
tcp6 0 0 :::5000 :::* LISTEN 2771/java
tcp6 0 0 :::8009 :::* LISTEN 8263/java
tcp6 0 0 :::3306 :::* LISTEN 28839/mysqld
tcp6 0 0 :::80 :::* LISTEN 31848/nginx: master
tcp6 0 0 :::8080 :::* LISTEN 8263/java
tcp6 0 0 :::9200 :::* LISTEN 25808/java
tcp6 0 0 :::9300 :::* LISTEN 25808/java
tcp6 0 0 :::9301 :::* LISTEN 2771/java
tcp6 0 0 :::22 :::* LISTEN 16567/sshd
我们看到9200端口了说明我们安装成功了,我们可以在终端输入
#测试访问
curl -X GET http://localhost:9200/
或者直接浏览器打开我们可以看到
{
status: 200,
name: "Pip the Troll",
cluster_name: "elasticsearch",
version: {
number: "1.7.2",
build_hash: "e43676b1385b8125d647f593f7202acbd816e8ec",
build_timestamp: "2015-09-14T09:49:53Z",
build_snapshot: false,
lucene_version: "4.10.4"
},
tagline: "You Know, for Search"
}
说明我们的程序是运行正常的。
Kibana的安装:
#下载tar包
wget https://download.elastic.co/kibana/kibana/kibana-4.1.1-linux-x64.tar.gz
#解压
tar zxf kibana-4.1.1-linux-x64.tar.gz -C /usr/local/
cd /usr/local/
mv kibana-4.1.1-linux-x64 kibana
#创建kibana服务
vim /etc/rc.d/init.d/kibana
#!/bin/bash
### BEGIN INIT INFO
# Provides: kibana
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Runs kibana daemon
# Description: Runs the kibana daemon as a non-root user
### END INIT INFO
# Process name
NAME=kibana
DESC="Kibana4"
PROG="/etc/init.d/kibana"
# Configure location of Kibana bin
KIBANA_BIN=/usr/local/kibana/bin
# PID Info
PID_FOLDER=/var/run/kibana/
PID_FILE=/var/run/kibana/$NAME.pid
LOCK_FILE=/var/lock/subsys/$NAME
PATH=/bin:/usr/bin:/sbin:/usr/sbin:$KIBANA_BIN
DAEMON=$KIBANA_BIN/$NAME
# Configure User to run daemon process
DAEMON_USER=root
# Configure logging location
KIBANA_LOG=/var/log/kibana.log
# Begin Script
RETVAL=0
if [ `id -u` -ne 0 ]; then
echo "You need root privileges to run this script"
exit 1
fi
# Function library
. /etc/init.d/functions
start() {
echo -n "Starting $DESC : "
pid=`pidofproc -p $PID_FILE kibana`
if [ -n "$pid" ] ; then
echo "Already running."
exit 0
else
# Start Daemon
if [ ! -d "$PID_FOLDER" ] ; then
mkdir $PID_FOLDER
fi
daemon --user=$DAEMON_USER --pidfile=$PID_FILE $DAEMON 1>"$KIBANA_LOG" 2>&1 &
sleep 2
pidofproc node > $PID_FILE
RETVAL=$?
[[ $? -eq 0 ]] && success || failure
echo
[ $RETVAL=0 ] && touch $LOCK_FILE
return $RETVAL
fi
}
reload()
{
echo "Reload command is not implemented for this service."
return $RETVAL
}
stop() {
echo -n "Stopping $DESC : "
killproc -p $PID_FILE $DAEMON
RETVAL=$?
echo
[ $RETVAL=0 ] && rm -f $PID_FILE $LOCK_FILE
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status -p $PID_FILE $DAEMON
RETVAL=$?
;;
restart)
stop
start
;;
reload)
reload
;;
*)
# Invalid Arguments, print the following message.
echo "Usage: $0 {start|stop|status|restart}" >&2
exit 2
;;
esac
#修改启动权限
chmod +x /etc/rc.d/init.d/kibana
#启动kibana服务
service kibana start
service kibana status
#查看端口
netstat -nltp
因为刚刚已经执行过
netstat -nltp
所以显示的效果我这就不贴了,如果我们能看到5601端口就说明我们安装成功了。
Option 1:Generate SSL Certificates:
生成SSL证书是为了服务端和客户端进行验证:
sudo vi /etc/pki/tls/openssl.cnf
Find the section in the file, and add this line under it (substituting in the Logstash Server’s private IP address):
subjectAltName=IP: logstash_server_private_ip
cd /etc/pki/tls
sudo openssl req -config /etc/pki/tls/openssl.cnf -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt
Option 2: FQDN (DNS):
cd /etc/pki/tls
sudo openssl req -subj '/CN=logstash_server_fqdn/' -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt
Logstash安装:
Logstash Forwarder(客户端):
安装Logstash Forwarder
wget https://download.elastic.co/logstash-forwarder/binaries/logstash-forwarder-0.4.0-1.x86_64.rpm
yum localinstall logstash-forwarder-0.4.0-1.x86_64.rpm
#查看logstash-forwarder的配置文件位置
rpm -qc logstash-forwarder
/etc/logstash-forwarder.conf
#备份配置文件
cp /etc/logstash-forwarder.conf /etc/logstash-forwarder.conf.save
#编辑 /etc/logstash-forwarder.conf,需要根据实际情况进行修改
vim /etc/logstash-forwarder.conf
{
"network": {
"servers": [ "这里写服务器的ip:5000" ],
"ssl ca": "/etc/pki/tls/certs/logstash-forwarder.crt",
"timeout": 15
},
"files": [
{
"paths": [
"/var/log/messages",
"/var/log/secure"
],
"fields": { "type": "syslog" }
}
]
}
Logstash Server(服务端):
#下载rpm包
wget https://download.elastic.co/logstash/logstash/packages/centos/logstash-1.5.4-1.noarch.rpm
#安装
yum localinstall logstash-1.5.4-1.noarch.rpm
#创建一个01-logstash-initial.conf文件
vim /etc/logstash/conf.d/01-logstash-initial.conf
input {
lumberjack {
port=> 5000
type=> "logs"
ssl_certificate=> "/etc/pki/tls/certs/logstash-forwarder.crt"
ssl_key=> "/etc/pki/tls/private/logstash-forwarder.key"
}
}
filter {
if [type]=="syslog" {
grok {
match=> { "message"=> "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:[%{POSINT:syslog_pid}])?: %{GREEDYDATA:syslog_message}" }
add_field=> [ "received_at", "%{@timestamp}" ]
add_field=> [ "received_from", "%{host}" ]
}
syslog_pri { }
date {
match=> [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
}
}
output {
elasticsearch { host=> localhost }
stdout { codec=> rubydebug }
}
#启动logstash服务
service logstash start
service logstash status
#访问Kibana,Time-field name 选择 @timestamp 要在下一步操作 Nginx 日志配置之后访问 不然会没有数据不能创建
http://localhost:5601/
#增加节点和客户端配置一样,注意同步证书(可以通过SSH的方式同步)
/etc/pki/tls/certs/logstash-forwarder.crt
配置Nginx日志:
#修改客户端配置
vim /etc/logstash-forwarder.conf
{
"network": {
"servers": [ "自己服务器的ip地址:5000" ],
"ssl ca": "/etc/pki/tls/certs/logstash-forwarder.crt",
"timeout": 15
},
"files": [
{
"paths": [
"/var/log/messages",
"/var/log/secure"
],
"fields": { "type": "syslog" }
}, {
"paths": [
"/app/local/nginx/logs/access.log"
],
"fields": { "type": "nginx" }
}
]
}
#服务端增加patterns
mkdir /opt/logstash/patterns
vim /opt/logstash/patterns/nginx
NGUSERNAME [a-zA-Z.@-+_%]+
NGUSER %{NGUSERNAME}
NGINXACCESS %{IPORHOST:remote_addr} - - [%{HTTPDATE:time_local}] "%{WORD:method} %{URIPATH:path}(?:%{URIPARAM:param})? HTTP/%{NUMBER:httpversion}" %{INT:status} %{INT:body_bytes_sent} %{QS:http_referer} %{QS:http_user_agent}
#修改logstash权限
chown -R logstash:logstash /opt/logstash/patterns
#修改服务端配置
vim /etc/logstash/conf.d/01-logstash-initial.conf
input {
lumberjack {
port=> 5000
type=> "logs"
ssl_certificate=> "/etc/pki/tls/certs/logstash-forwarder.crt"
ssl_key=> "/etc/pki/tls/private/logstash-forwarder.key"
}
}
filter {
if [type]=="syslog" {
grok {
match=> { "message"=> "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:[%{POSINT:syslog_pid}])?: %{GREEDYDATA:syslog_message}" }
add_field=> [ "received_at", "%{@timestamp}" ]
add_field=> [ "received_from", "%{host}" ]
}
syslog_pri { }
date {
match=> [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]
}
}
if [type]=="nginx" {
grok {
match=> { "message"=> "%{NGINXACCESS}" }
}
}
}
output {
elasticsearch { host=> localhost }
stdout { codec=> rubydebug }
}
我们看一下完成配置之后的效果:
好了,我是折腾了2天才折腾出来的,感觉自己好笨。写篇总结为了下一次能够快速的搭建起来。
Linux上安装部署ElasticSearch全程记录 http://www.linuxidc.com/Linux/2015-09/123241.htm
Elasticsearch安装使用教程 http://www.linuxidc.com/Linux/2015-02/113615.htm
ElasticSearch 配置文件译文解析 http://www.linuxidc.com/Linux/2015-02/114244.htm
ElasticSearch集群搭建实例 http://www.linuxidc.com/Linux/2015-02/114243.htm
分布式搜索ElasticSearch单机与服务器环境搭建 http://www.linuxidc.com/Linux/2012-05/60787.htm
ElasticSearch的工作机制 http://www.linuxidc.com/Linux/2014-11/109922.htm
ElasticSearch 的详细介绍:请点这里
ElasticSearch 的下载地址:请点这里
本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-12/126587.htm
10个日常Docker使用技巧
深入浅出讲述提升 WordPress 性能的九大秘笈
相关资讯
ElasticSearch LogStash Kibana
统计Elasticsearch中月每天索引量 (今 08:28)
Logstash5.4.1解析日志报错处理 (08月13日)
CentOS上安装 ElasticSearch 详解 (05月15日)
Elasticsearch 基于ElastAlert发送 (08月22日)
Linux下安装搜索引擎Elasticsearch (05月23日)
ElasticSearch 5.2.2 集群环境的搭 (04月25日)
本文评论
查看全部评论 (2)
表情:
姓名:
匿名
字数
同意评论声明
评论声明
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款
第 2 楼 carbon 发表于 2016/2/19 11:58:14什么原因,求楼主抽空给我解释一下回复 支持 (0) 反对 (0)第 1 楼 carbon 发表于 2016/2/19 11:42:50完全按照你的步骤来的,只不过java版本是1.8.0,但我打开kibana时看不到Time-field name这个项回复 支持 (0) 反对 (0)
最新资讯
统计Elasticsearch中月每天索引量的脚本
Apache httpd 信息泄露漏洞(CVE-2017-9798
VMware vCenter Server HTML注入漏洞(CVE-
CentOS 7配置DHCP
Fable 1.2将在首次FableConf大会上发布
用开源软件写的57行代码,PK掉8600万的商业
Eclipse更新了Eclipse公共许可(EPL)
Envoy加入CNCF
ElK分析Tomcat的Catalina.out日志
ELK(elasticsearch5.0)head插件安装配置