基于docker的高可用解決方案

Docker從2013年發(fā)布第一個(gè)版本以來(lái)格嗅,已經(jīng)火遍全球焕檬,技術(shù)迭代也比較頻繁,其周邊產(chǎn)品和技術(shù)也越來(lái)越豐富囱晴。Docker的輕量級(jí)容器不僅實(shí)現(xiàn)了資源隔離膏蚓,而且?guī)缀蹩梢赃\(yùn)行在任何地方,使得部署和擴(kuò)展變得非常容易畸写,隨著Docker的日趨完善驮瞧,目前Docker已經(jīng)被越來(lái)越多的公司應(yīng)用到生產(chǎn)環(huán)境中。

Docker從2013年發(fā)布第一個(gè)版本以來(lái)枯芬,已經(jīng)火遍全球论笔,技術(shù)迭代也比較頻繁,其周邊產(chǎn)品和技術(shù)也越來(lái)越豐富千所。Docker的輕量級(jí)容器不僅實(shí)現(xiàn)了資源隔離狂魔,而且?guī)缀蹩梢赃\(yùn)行在任何地方,使得部署和擴(kuò)展變得非常容易淫痰,隨著Docker的日趨完善最楷,目前Docker已經(jīng)被越來(lái)越多的公司應(yīng)用到生產(chǎn)環(huán)境中。

一、環(huán)境

1.1籽孙、宿主機(jī)操作系統(tǒng)環(huán)境

Centos7.1-64

1.2烈评、docker版本

Server Version: 1.9.1

1.3、集群網(wǎng)絡(luò)環(huán)境

master:10.2.0.80

slave1:10.2.0.77

slave2:10.2.0.134

服務(wù)發(fā)現(xiàn):10.2.0.99

二犯建、介紹一下各組件

1础倍、docker

Docker daemon引擎

2、consul

服務(wù)發(fā)現(xiàn)和配置共享的服務(wù)軟件

3胎挎、swarm

基于docker的集群調(diào)度管理軟件沟启,docker 1.2版本中已經(jīng)自動(dòng)集成集群功能了。

4犹菇、rethinkdb

RethinkDB是一個(gè)完全支持Memcached協(xié)議德迹、數(shù)據(jù)可持久化的工業(yè)級(jí)key-value存儲(chǔ)系統(tǒng),它自帶了cluster和web資源管理功能揭芍。

5胳搞、shipyard

docker可視化資源管理平臺(tái)

6、registrator

服務(wù)自動(dòng)注冊(cè)

7称杨、nginx

web服務(wù)代理軟件

8肌毅、consultemplate

docker服務(wù)自動(dòng)發(fā)現(xiàn)軟件,這個(gè)要結(jié)合nginx使用姑原,當(dāng)我們?cè)谒拗鳈C(jī)上啟動(dòng)一個(gè)容器服務(wù)時(shí)悬而,這時(shí)候consultemplate就會(huì)自動(dòng)從consul服務(wù)上發(fā)現(xiàn)在這個(gè)容器,并更新nginx配置文件锭汛。

9笨奠、cadvisor

google公司開(kāi)源的docker容器資源監(jiān)控軟件

10、influxdb

InfluxDB是一個(gè)開(kāi)源分布式時(shí)序唤殴、事件和指標(biāo)數(shù)據(jù)庫(kù)般婆。使用 Go 語(yǔ)言編寫(xiě),無(wú)需外部依賴朵逝。其設(shè)計(jì)目標(biāo)是實(shí)現(xiàn)分布式和水平伸縮擴(kuò)展蔚袍。

11、grafana

圖表展現(xiàn)服務(wù)配名,功能非常強(qiáng)大啤咽。

12、graylog+ Elasticsearch

具有報(bào)警選項(xiàng)的可插入日志和事件分析服務(wù)器

三段誊、安裝Docker

具體的安裝方法可以參考官方文檔:

https://docs.docker.com/engine/installation/linux/centos/

針對(duì) CentOS, 則需要修改以下配置文件:

vim /etc/sysconfig/docker

如果沒(méi)有個(gè)docker配置文件闰蚕,可以把以下這段直接加上,

---------------------------------------------------

# /etc/sysconfig/docker

#

# Other arguments to pass to the docker daemon process

# These will be parsed by the sysv initscript and appended

# to the arguments list passed to docker -d

other_args="-g /opt/test/docker -H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock--insecure-registryregistry.intra.test.com:5000 "

DOCKER_CERT_PATH=/etc/docker

# Resolves: rhbz#1176302 (docker issue #407)

DOCKER_NOWARN_KERNEL_VERSION=1

# Location used for temporary files, such as those created by

# # docker load and build operations. Default is /var/lib/docker/tmp

# # Can be overriden by setting the following environment variable.

# # DOCKER_TMPDIR=/var/tmp

DOCKER_TMPDIR=/opt/docker/tmp

---------------------------------------------------

以上配置文件主要修改3點(diǎn)

1连舍、docker安裝的一些初始化信息變更没陡。例如原來(lái)容器安裝完涩哟,它們相關(guān)的信息默認(rèn)是存儲(chǔ)在/var/lib/docker目錄下,我現(xiàn)在把安改到/opt/docker目錄下盼玄,因?yàn)橐院笏腥萜鳟a(chǎn)生的日志等相關(guān)數(shù)據(jù)都會(huì)存在這個(gè)目錄下贴彼,所以盡量選擇一個(gè)大的分區(qū)。

2埃儿、docker daemon的socket綁定信息

3器仗、增加了私有倉(cāng)庫(kù)地址,如果沒(méi)有私有倉(cāng)庫(kù)童番,那就可以不用改精钮。

然后你就可以啟動(dòng)Docker服務(wù)了.

systemctl enable docker && service start docker


四、安裝consul服務(wù)

這就開(kāi)始了剃斧,因?yàn)橛辛薲ocker,所以千萬(wàn)就不要再想著用源代碼或者rpm方式來(lái)安裝相關(guān)服務(wù)轨香,那樣就顯得太low了,以后一切的服務(wù)皆可用容器方式來(lái)運(yùn)行幼东。consul相關(guān)的資料請(qǐng)參考官網(wǎng)https://www.consul.io/intro/getting-started/install.html臂容,如果還有不理解的就查查google吧,與它類似的服務(wù)還有etcd,zookeeper,doozerd等根蟹,這方面我就不多說(shuō)了脓杉。因?yàn)閏onsul的高可用集群最少需要3臺(tái)機(jī)器,但是這3臺(tái)简逮,只要其中一臺(tái)故障這個(gè)consul的集群就掛了球散,按官方的建 議最好5臺(tái),這樣可以同時(shí)故障2臺(tái)买决,但是我為節(jié)省資源就用3臺(tái)沛婴。所以我在master,slave1,slave2的機(jī)器都安裝了consul服務(wù)

4.1、master:10.2.0.80

docker run -d \\

-p 8300:8300 \\

-p 8301:8301 \\

-p 8301:8301/udp \\

-p 8302:8302 \\

-p 8302:8302/udp \\

-p 8400:8400 \\

-p 8500:8500 \\

-p 8600:53 \\

-p 53:53/udp \\

-v /opt/test/data/consul:/data \\

-h $HOSTNAME \\

--restart=always \\

--name=consul progrium/consul:latest -server -bootstrap -ui-dir=/ui -advertise 10.2.0.80 -client 0.0.0.0

解釋下各個(gè)參數(shù):

-d容器在后臺(tái)運(yùn)行, detached mode

--restart=always重啟模式, always 表示永遠(yuǎn)

-p 8400:8400映射 consul的 rpc 端口8400

-p 8500:8500映射 UI 界面的端口8500.

-p 53/udp綁定udp 端口53(默認(rèn) DNS端口)在 docker0 bridge 地址上.

-v /opt/test/data/consul:/data ?這個(gè)把consul的數(shù)據(jù)文件目錄掛載到宿主機(jī)上督赤,這樣萬(wàn)一容器重啟,數(shù)據(jù)就不會(huì)丟失泻蚊。

-advertise 10.2.0.80服務(wù)對(duì)外公布的 IP, ?否則 service 會(huì)顯示為內(nèi)部的容器的 IP 地址, 這樣就訪問(wèn)不到了.

-client 0.0.0.0consul 監(jiān)聽(tīng)的地址.

然后咱們開(kāi)始部署其它2臺(tái)consul agent機(jī)器, 這次要增加 -join 參數(shù)

4.2躲舌、slave1:10.2.0.77

docker run -d \\

-p 8300:8300 \\

-p 8301:8301 \\

-p 8301:8301/udp \\

-p 8302:8302 \\

-p 8302:8302/udp \\

-p 8400:8400 \\

-p 8500:8500 \\

-v /opt/test/data/consul:/data \\

-h $HOSTNAME \\

--restart=always \\

--name=consulprogrium/consul:latest\\

-server -join 10.2.0.80 -advertise 10.2.0.77 -client 0.0.0.0

4.3、slave2:10.2.0.134

docker run -d \\

-p 8300:8300 \\

-p 8301:8301 \\

-p 8301:8301/udp \\

-p 8302:8302 \\

-p 8302:8302/udp \\

-p 8400:8400 \\

-p 8500:8500 \\

-v /opt/test/data/consul:/data \\

-h $HOSTNAME \\

--restart=always \\

--name=consulprogrium/consul:latest\\

-server -join 10.2.0.80 -advertise 10.2.0.134 -client 0.0.0.0

這樣consul集群服務(wù)已經(jīng)安裝完成性雄,這時(shí)我們進(jìn)入10.2.0.80啟動(dòng)的consul容器查看一下consul的狀態(tài)

4.4没卸、進(jìn)入consul 容器

docker exec -it d638539891e7 bash

#consul info ? //查看consul狀態(tài),看到leader = true和server=true說(shuō)明整集群狀態(tài)已經(jīng)正常了。

----------------------------------------------------------------------------------------------------

agent:

check_monitors = 0

check_ttls = 0

checks = 0

services = 29

build:

prerelease =

revision = 9a9cc934

version = 0.5.2

consul:

bootstrap = true

known_datacenters = 1

leader = true

server = true

#consul members ? //看到consul集群已檢測(cè)到3臺(tái)server了秒旋。并且狀態(tài)都正常约计。

-------------------------------------------------------------------------------------------------------

Node ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Address ? ? ? ? ?Status ?Type ? ?Build ?Protocol ?DC

10.2.0.80 ? ? ? ? ? ? ? ? ? ? ? ? ?10.2.0.80:8301 ? alive ? server ?0.5.2 ?2 ? ? ? ? dc1

10.2.0.77 ? ? ? ? ? ? ? ? ? ? ? ? ?10.2.0.77:8301 ? alive ? server ?0.5.2 ?2 ? ? ? ? dc1

10.2.0.134 ? ? ? ? ? ? ? ? ? ? ? ?10.2.0.134:8301 ?alive ? server ?0.5.2 ?2 ? ? ? ? dc1

-------------------------------------------------------------------------------------------------------

#現(xiàn)在就可以看到consul的web平臺(tái)了

http://10.2.0.80:8500/ui/#/dc1/services

五、安裝swarm迁筛、shipyard管理平臺(tái)

swarm的具體資料可以參考官網(wǎng)https://docs.docker.com/swarm/overview/

shipyard的具體資料可以參考官網(wǎng)是http://www.shipyard-project.com

shipyard的官網(wǎng)的具體安裝步驟http://www.shipyard-project.com/docs/deploy/manual/

但是不要看著他們的安裝步驟, 就直接開(kāi)始了煤蚌,因?yàn)楣倬W(wǎng)用的是 etcd 不是 consul 的, consul 是 docker 官網(wǎng)推薦的,像大的互聯(lián)網(wǎng)公司用的基本上是consul,所以我也推薦。

5.1、添加master:10.2.0.80節(jié)點(diǎn)

5.1.1尉桩、啟動(dòng)容器shipyard-rethinkdb

docker run -it -d -p 8080:8080 -h $HOSTNAME -v /opt/test/data:/data --restart=always ?--name shipyard-rethinkdb rethinkdb:latest

參數(shù)解釋:

-v /opt/test/data:data把rethinkdb的數(shù)據(jù)目錄掛載到宿主機(jī)的/opt/test/data目錄下筒占,這樣rethinkdb容器如果重啟,數(shù)據(jù)不會(huì)丟失蜘犁。

-p 8080:8080 映射rethinkdb的 web UI端口翰苫,這樣可以看到rethinkdb的web可視化資源管理平臺(tái)。

#為了增加rethinkdb的高可用,有條件的話可以把它做成一個(gè)cluster这橙,具體參考https://github.com/dockerfile/rethinkdb

5.1.2奏窑、啟動(dòng)shipyard-proxy

docker run ?-ti ?-d ?-p 10.2.0.80:2375:2375 ?--hostname=$HOSTNAME --restart=always --name shipyard-proxy ?-v /var/run/docker.sock:/var/run/docker.sock ?-e PORT=2375 ?shipyard/docker-proxy:latest

5.1.3、啟動(dòng)shipyard-swarm-manager

docker run ?-ti -d --restart=always --name shipyard-swarm-manager registry.intra.test.com:5000/ops/shipyard-swarm:v0.1 manage --replication --addr 10.2.0.80:3375 --host tcp://0.0.0.0:3375 consul://10.2.0.80:8500

5.1.4屈扎、啟動(dòng)shipyard-swarm-agent

docker run -ti ?-d ?--restart=always ?--name shipyard-swarm-agent registry.intra.test.com:5000/ops/shipyard-swarm:v0.1 ?join --addr 10.2.0.80:2375 consul://10.2.0.80:8500

5.1.5埃唯、啟動(dòng)shipyard-controller

docker run -it -d --restart=always --name shipyard-controller --link shipyard-rethinkdb:rethinkdb --link shipyard-swarm-manager:swarm -p 80:8080 shipyard/shipyard:latest server -d tcp://swarm:3375

5.2、添加slave1:10.2.0.77節(jié)點(diǎn)

5.2.1助隧、啟動(dòng)shipyard-proxy

docker run ?-ti ?-d ?-p 10.2.0.77:2375:2375 ?--hostname=$HOSTNAME --restart=always --name shipyard-proxy ?-v /var/run/docker.sock:/var/run/docker.sock ?-e PORT=2375 ?registry.intra.test.com:5000/ops/shipyard-docker-proxy:v0.1

5.2.2筑凫、啟動(dòng)shipyard-swarm-agent

docker run -ti ?-d ?--restart=always ?--name shipyard-swarm-agent registry.intra.test.com:5000/ops/shipyard-swarm:v0.1 ?join --addr 10.2.0.77:2375 consul://10.2.0.80:8500

5.2.3、添加registrator

registrator 是基于 docker 的 sock 文件來(lái)做服務(wù)發(fā)現(xiàn)的一個(gè)第三方的方案并村,有實(shí)力的公司也可以自已開(kāi)發(fā)服務(wù)注冊(cè)agent巍实。

registrator的官網(wǎng)資料參考http://gliderlabs.com/registrator/latest/

docker run -d --restart=always --name=registrator --net=host -v /var/run/docker.sock:/tmp/docker.sock gliderlabs/registrator -ip ip-of-host consul://localhost:8500

例:docker run -d --restart=always --name=registrator --net=host -v /var/run/docker.sock:/tmp/docker.sock gliderlabs/registrator -ip 10.2.0.77 consul://localhost:8500

參數(shù)解釋:

-v /var/run/docker.sock:/tmp/docker.sock映射 docker 的 socket 到 container 中的對(duì)應(yīng)位置, 這樣 registration 就能監(jiān)控有哪些服務(wù)啟動(dòng)了.

registration 所屬的主機(jī) IP, 一定要設(shè)置此屬性, 否則服務(wù)IP會(huì)顯示為127.0.0.1

consul://localhost:8500consul 綁定到本地的 consul 接口上。

參考資料:

Docker DNS & Service Discovery with Consul and Registrator

5.3哩牍、添加slave1:10.2.0.134節(jié)點(diǎn)

5.3.1棚潦、啟動(dòng)shipyard-proxy

docker run ?-ti ?-d ?-p 10.2.0.134:2375:2375 ?--hostname=$HOSTNAME --restart=always --name shipyard-proxy ?-v /var/run/docker.sock:/var/run/docker.sock ?-e PORT=2375 ?registry.intra.test.com:5000/test/ops/shipyard-docker-proxy:v0.1

5.3.2、啟動(dòng)shipyard-swarm-agent

docker run -ti ?-d ?--restart=always ?--name shipyard-swarm-agent registry.intra.test.com:5000/ops/shipyard-swarm:v0.1 ?join --addr 10.2.0.134:2375 consul://10.2.0.80:8500

5.3.3膝昆、添加registrator

docker run -d --restart=always --name=registrator --net=host -v /var/run/docker.sock:/tmp/docker.sock gliderlabs/registrator -ip 10.2.0.134 consul://localhost:8500

Docker DNS & Service Discovery with Consul and Registrator

以上服務(wù)都啟動(dòng)后就可以訪問(wèn)shipyard的管理平臺(tái)了http://10.2.0.80/#/containers丸边,默認(rèn)的用戶名:admin,密碼:shipyard ,通過(guò)這個(gè)平臺(tái)就可以看到這3臺(tái)宿主機(jī)上啟動(dòng)的所有容器,可以對(duì)它進(jìn)行重啟荚孵,暫停妹窖,部署,擴(kuò)容等各種可視化操作收叶。這個(gè)平臺(tái)滿足目前開(kāi)發(fā)和測(cè)試的環(huán)境骄呼,我覺(jué)得問(wèn)題不大,如果要用于生產(chǎn)環(huán)境判没,還是有幾點(diǎn)以下問(wèn)題的思考:

1蜓萄、需要考慮shipyard管理平臺(tái)本身的高可用。

2澄峰、整個(gè)集群的資源無(wú)法進(jìn)行隔離嫉沽,例如:這個(gè)集群我有10臺(tái)slave宿主機(jī),我想把其中的一個(gè)服務(wù)的10個(gè)容器只部署在3臺(tái)宿主機(jī)上俏竞。目前這個(gè)集群做不到绸硕。

3堂竟、集群中的容器要做升級(jí)時(shí),無(wú)法選擇升級(jí)策略臣咖。

六跃捣、流量接入層配置

這邊主要采用的是nginx+consul-template方案,我覺(jué)得nginx做代理,效率比較好夺蛇,再說(shuō)nginx的7層規(guī)則寫(xiě)起來(lái)也比較方便疚漆。當(dāng)然也可以用別的方法,例如:dns刁赦、haproxy等娶聘。

consul-template主要是從consul自動(dòng)發(fā)現(xiàn)service的主機(jī)+端口信息,這樣一組服務(wù)的容器在減縮時(shí)甚脉,可以做到自動(dòng)伸縮丸升,不需要人為干預(yù)。

6.1牺氨、nginx服務(wù)

nginx服務(wù)可以選擇原生的狡耻,也可以選擇阿里的tenginx

也可以選擇sina開(kāi)源的一個(gè)nginx模塊,不過(guò)用這個(gè)不需要consul-tempate支持并且是即時(shí)生效的猴凹,并且不需要reload nginx服務(wù)夷狰,所以沒(méi)有性能損耗。https://github.com/weibocom/nginx-upsync-module

6.2郊霎、consul-template

#nginx模塊文件

vim log.test.com.ctmpl

----------------------------------------------------------------------------------------

upstream www.test.com {

{{range service "nginx-test-80"}}

server {{.Address}}:{{.Port}};

#server {{.Address}}:{{.Port}} weight=10 max_fails=3 fail_timeout=10s;

{{end}}

keepalive 65;

#check interval=3000 rise=2 fall=5 timeout=3000 type=http

#check_http_send "GET /health HTTP/1.1\\r\\n\\r\\n";

#check_http_expect_alive http_2xx http_3xx;

}

server {

listen ? ? ? 80;

server_name ?www.test.com;

location / {

proxy_pass http://www.test.com;

proxy_redirect ? ? off;

proxy_set_header ? Host ? ? ? ? ? ? $host;

proxy_set_header ? X-Real-IP ? ? ? ?$remote_addr;

proxy_set_header ? X-Forwarded-For ?$proxy_add_x_forwarded_for;

proxy_next_upstream error timeout invalid_header http_500 http_502 h

ttp_503 http_504;

proxy_max_temp_file_size 0;

proxy_connect_timeout ? ? ?90;

proxy_send_timeout ? ? ? ? 90;

proxy_read_timeout ? ? ? ? 90;

proxy_buffer_size ? ? ? ? ?4k;

proxy_buffers ? ? ? ? ? ? ?4 32k;

proxy_busy_buffers_size ? ?64k;

proxy_temp_file_write_size 64k;

}

error_page ? 500 502 503 504 ?/50x.html;

location = /50x.html {

root ? html;

}

}

----------------------------------------------------------------------------------------

#consu-template配置文件

---------------------------------------------------------------------------------------

consul = "10.2.0.80:8500"

log_level = "warn"

#token ?= "f37ab43b-4d2de-aa283-6effsdf507a9eb71d1b” ? //如果consul有配token沼头,需要加上token,不然是取不到數(shù)據(jù)书劝。

template {

source = "/opt/test/consultemplate/www.test.com.ctmpl"

destination = "/opt/test/nginx/conf/conf.d/www.test.com.conf"

command = “/opt/test/nginx/sbin/nginx -t && /opt/test/nginx/sbin/nginx -s

reload"

}

#啟動(dòng)consul-template服務(wù)

./consul-template --config check_nginx.conf

啟動(dòng)結(jié)果:

2016/07/05 14:50:56 [DEBUG] (config) loading configs from "check_nginx.conf"

the configuration file /opt/test/nginx/conf/nginx.conf syntax is ok

configuration file /opt/test/nginx/conf/nginx.conf test is successful

---------------------------------------------------------------------------------------

在本機(jī)綁定一下hosts,在瀏覽器中輸入www.test.com,肯定有驚喜 ^-^!

七进倍、容器資源監(jiān)控

我們通過(guò)三個(gè)組件(cadvisor influxdb grafana)來(lái)搭建一個(gè)監(jiān)控容器主機(jī)系統(tǒng)的實(shí)時(shí)信息。這里面有一個(gè)重要的問(wèn)題购对,需要大家明確一個(gè)問(wèn)題猾昆,因?yàn)槿萜饔幸粋€(gè)很重要的特性就是隨時(shí)啟動(dòng)運(yùn)行,隨時(shí)停止銷毀骡苞,所以我們的監(jiān)控也需要支持毡庆,能夠隨著容器的啟動(dòng)運(yùn)行,并自動(dòng)加入監(jiān)控烙如,當(dāng)銷毀時(shí),監(jiān)控能夠自動(dòng)刪除毅否。這樣就不需要人工過(guò)多的干預(yù)亚铁。

這邊介紹下幾個(gè)組件的功能,cadvisor谷歌公司自己用來(lái)監(jiān)控他們基礎(chǔ)設(shè)施的一款工具螟加,這個(gè)工具厲害之處不僅能監(jiān)控docker容器的實(shí)時(shí)信息徘溢,而且還能將你的cadvisor這容器所在的主機(jī)的系統(tǒng)的實(shí)時(shí)信息吞琐!,但是由于cadvisor只是能監(jiān)控到實(shí)時(shí)的信息而不能保存然爆,所以我們要使用influxdb將這些實(shí)時(shí)監(jiān)控到的信息存放起來(lái)站粟,以備以后需要。而grafana這個(gè)就是將influxdb存放的信息以圖表的形式曾雕,非常清晰奴烙,完美地展現(xiàn)出來(lái)!

7.1剖张、部署influxdb

具體可以參考https://github.com/tutumcloud/influxdb

docker pulltutum/influxdb:0.10

docker run -d \\

-p8083:8083 \\

-p 8086:8086 \\

--expose 8090 \\

--expose 8099 \\

-v ?/opt/test/data/influxdb:/data ?\\

--name influxsrv ?tutum/influxdb:0.10

參數(shù)解釋:

-p 8083:8083映射8083端口切诀,是為能夠看到influxdb的web管理平臺(tái).

-p 8086:8086映射8086端口,數(shù)據(jù)api接口搔弄,到時(shí)候cadvisor會(huì)訪問(wèn)這個(gè)接口.

-v /opt/test/data/influxdb:/data映射數(shù)據(jù)目錄到宿主機(jī)上幅虑,這樣容器重啟保證數(shù)據(jù)不會(huì)丟失

#docker ps

b2da5c842a06 ? ? ? ?tutum/influxdb:0.10 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"/run.sh" ? ? ? ? ? ? ? ?5 days ago ? ? ? ? ?Up 23 hours ? ? ? ? 0.0.0.0:8083->8083/tcp, 8090/tcp, 0.0.0.0:8086->8086/tcp, 8099/tcp ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? influxsrv

#新建數(shù)據(jù)酷

docker exec -ti influxsrv /bin/bash

root@b2da5c842a06:/# influx

Visithttps://enterprise.influxdata.comto register for updates, InfluxDB server management, and monitoring.

Connectedtohttp://localhost:8086 version 0.10.0

InfluxDBshell0.10.0

>CREATEDATABASEcadvisor

>SHOWDATABASES

name:databases

---------------

name

_internal

cadvisor

>usecadvisor

>CREATEUSER"root"WITHPASSWORD'root'WITHALLPRIVILEGES

>showusers

useradmin

roottrue

>exit

7.2、部署cadvisor服務(wù)

具體可以參考https://github.com/google/cadvisor

docker run -d \\

--volume=/:/rootfs:ro \\

--volume=/var/run:/var/run:rw \\

--volume=/sys:/sys:ro \\

--volume=/var/lib/docker/:/var/lib/docker:ro \\

--publish=8080:8080 \\

--detach=true \\

--link influxsrv:influxsrv \\

--name=cadvisor google/cadvisor:latest \\

-docker_only \\

-h $HOSTNAME

-storage_driver=influxdb \\

-storage_driver_db=cadvisor \\

-storage_driver_host=10.2.0.134:8086

#啟動(dòng)容器后顾犹,用瀏覽器就可以看到本機(jī)所有容器的時(shí)時(shí)監(jiān)控信息了倒庵。

http://10.2.2.134:8080

參數(shù)解釋:

別的參數(shù)我就不解釋了,大家可以看看文檔炫刷,我就說(shuō)一個(gè)最重要的擎宝。

-docker_only這個(gè)參數(shù)主要是說(shuō)明現(xiàn)在cadvisor容器只監(jiān)控容器,如果不加會(huì)把docker相關(guān)一堆沒(méi)有用的信息都加進(jìn)來(lái)柬唯,對(duì)后續(xù)添加grafana時(shí)帶來(lái)很多的麻煩.

-h $HOSTNAME ?這個(gè)參數(shù)很重要认臊,一定要加上,不然后面的grafana取監(jiān)控主機(jī)時(shí)锄奢,只能看到的是一串?dāng)?shù)字失晴,很不方便,加上這個(gè)參數(shù)拘央,就可以直接看到主機(jī)名了涂屁,一目了然。

7.3灰伟、部署grafana服務(wù)

docker run -d \\

-p 3000:3000 \\

-e INFLUXDB_HOST=10.2.0.134 \\

-e INFLUXDB_PORT=8086 \\

-e INFLUXDB_NAME=cadvisor \\

-e INFLUXDB_USER=root \\

-e INFLUXDB_PASS=root \\

--link influxsrv:influxsrv \\

--name grafana grafana/grafana

#這個(gè)參數(shù)就不解釋了拆又,比較明顯易懂。

還有具體的使用方法栏账,可以參考官方網(wǎng)站,如果有什么不懂可以參考官方的例子很方便的帖族。http://play.grafana.org/

7.4、監(jiān)控實(shí)例


八挡爵、日志收集

#我這邊用的是graylog,為什么要用這個(gè)日志的方案竖般,有興趣的朋友可以看一下這篇文章(https://testerhome.com/topics/3026),當(dāng)然有開(kāi)發(fā)實(shí)力的朋友茶鹃,很多功能是可以自已去開(kāi)發(fā)解決的涣雕。但是如果開(kāi)源的產(chǎn)品也符合我們的需求艰亮,就不需要再重復(fù)的造輪子了。還有一點(diǎn)挣郭,這個(gè)日志的方案也是docker官方推薦的迄埃,所以我想應(yīng)該也是不錯(cuò)的。(https://docs.docker.com/engine/admin/logging/overview/

8.1兑障、graylog部署方法

#graylog安裝方法侄非,我這邊用測(cè)試用的是官方的docker-compose的方法,如果實(shí)際生產(chǎn)環(huán)境使用旺垒,如果量比較大的就需要采用分布式部署了彩库。

http://docs.graylog.org/en/2.0/pages/installation/docker.html

這套日志系統(tǒng)唯一的缺點(diǎn),我覺(jué)得是在mongodb上先蒋,所以如果量比較大的話骇钦,這個(gè)可能是一個(gè)瓶頸,當(dāng)然mongodb的使用方案竞漾,現(xiàn)在也比較成熟眯搭,比如多個(gè)shard.還有公司如果有錢(qián),用ssd盤(pán)來(lái)解決业岁,問(wèn)題也不大鳞仙。這些都是需要隨著業(yè)務(wù)的發(fā)展,去不斷優(yōu)化的笔时。

------------------------------------------------------------------------------------------------------------------------

some-mongo:

image: "mongo:3"

volumes:

- /opt/graylog/data/mongo:/data/db

some-elasticsearch:

image: "elasticsearch:latest"

command: "elasticsearch -Des.cluster.name='graylog'"

volumes:

- /opt/graylog/data/elasticsearch:/usr/share/elasticsearch/data

graylog:

image: graylog2/server

volumes:

- /opt/graylog/data/journal:/usr/share/graylog/data/journal

- /opt/graylog/config:/usr/share/graylog/data/config

environment:

GRAYLOG_PASSWORD_SECRET: somepasswordpepper

GRAYLOG_ROOT_PASSWORD_SHA2: 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92

GRAYLOG_REST_TRANSPORT_URI: http://10.2.0.134:12900

links:

- some-mongo:mongo

- some-elasticsearch:elasticsearch

ports:

- "9000:9000"

- "12900:12900"

- "12201/udp:12201/udp"

- "1514/udp:1514/udp"

---------------------------------------------------------------------------------------------------------------------

8.2棍好、啟動(dòng)graplog服務(wù)

docker-compose up -d

8.3、http://10.2.0.134:9000/

用戶名:admin

密碼:graylog

8.4允耿、設(shè)置接收器借笙。

我這里用的是Gelf UDP的input方法來(lái)接收日志,用udp協(xié)議的好處是较锡,當(dāng)日志系統(tǒng)性能有問(wèn)題或者別的故障時(shí)业稼,不會(huì)影響生產(chǎn)服務(wù)。

system==>input==>select input ===>GELF UDP



#設(shè)置好后就可以接收日志了蚂蕴。

8.5低散、設(shè)置容器的日志收集方法

#大家都知道我們的每個(gè)容器產(chǎn)生的日志會(huì)自動(dòng)保存在/var/lib/docker/containers/7e7cb74f63xxxxxxxxx/7e7cb74f63xxxxxxxxx.json.log

所以我們收集日志的方法很多:

a、可以在本地啟動(dòng)一個(gè)收集日志的工具骡楼,時(shí)時(shí)監(jiān)聽(tīng)這個(gè)日志文件

b熔号、可以用docker原生自帶的log-driver方法來(lái)收集日志,我是比較偏向這個(gè)鸟整,因?yàn)槿罩敬姹镜乜缂危瑢?duì)于請(qǐng)求量比較大的業(yè)務(wù),IO是一項(xiàng)極大的挑戰(zhàn)。

注:如果想把docker的應(yīng)用日志輸出到外面祠乃,也就是說(shuō)用docker logs -f可以看到,需要我們?cè)诰帉?xiě)dockerfile時(shí)把日志做一下處理兑燥。

例如:nginx服務(wù) ?參考官方https://www.nginx.com/blog/deploying-nginx-nginx-plus-docker/

#dockerfile

---------------------------------------------------------

FROM centos:centos7

MAINTAINER NGINX Docker Maintainers "docker-maint@nginx.com"

RUN yum install -y ca-certificates

# Download certificate and key from the customer portal (https://cs.nginx.com)

# and copy to the build context

ADD nginx-repo.crt /etc/ssl/nginx/

ADD nginx-repo.key /etc/ssl/nginx/

# Get other files required for installation

RUN wget -q -O /etc/yum.repos.d/nginx-plus-7.repo https://cs.nginx.com/static/files/nginx-plus-7.repo

# Install NGINX Plus

RUN yum install -y nginx-plus

# forward request logs to Docker log collector

RUN ln -sf /dev/stdout /var/log/nginx/access.log

RUN ln -sf /dev/stderr /var/log/nginx/error.log

EXPOSE 80 443

CMD ["nginx", "-g", "daemon off;"]

---------------------------------------------------------

#進(jìn)入容器里看到的

access.log -> /dev/stdout

error.log -> /dev/stderr

#如果容器里的應(yīng)用服務(wù)用supervisord來(lái)管理亮瓷,那么需要把supervisord的服務(wù)配置文件做以下設(shè)置,應(yīng)用的日志才會(huì)對(duì)外輸出降瞳。

#nginx.ini

---------------------------------------------------------

[program:nginx]

command=/usr/sbin/nginx -g 'daemon off;'

autostart = true

startsecs = 3

autorestart = true

startretries = 3

user = root

redirect_stderr = false

#這個(gè)是為了把日志輸出到docker的容器日志文件上嘱支,必需加上這個(gè)設(shè)置

stdout_logfile_maxbytes=0

stdout_logfile=/dev/stdout

stderr_logfile_maxbytes=0

stderr_logfile=/dev/stderr

---------------------------------------------------------

#設(shè)置單個(gè)docker的日志收集方法

docker run -d -p 80 \\

-h $HOSTNAME \\

--name www.test-01 \\

--log-driver=gelf \\

--log-opt gelf-address=udp://10.2.0.134:12201 \\

registry.intra.test.com:5000/ops/nginx-test:v0.1

#全局設(shè)置docker的日志轉(zhuǎn)發(fā)

這樣的好處是,不用每次創(chuàng)建容器時(shí)挣饥,都需要指定日志的接收器的地址除师。

---------------------------------------------------------

# /etc/sysconfig/docker

#

# Other arguments to pass to the docker daemon process

# These will be parsed by the sysv initscript and appended

# to the arguments list passed to docker -d

#other_args="-g /opt/docker -H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock --insecure-registry registry.intra.test.

com:5000 "

other_args="-g /opt/docker -H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock ?--log-driver=gelf--log-opt gelf-address=udp://10.2.0.134:12201--insecure-registry registry.intra.test.

com:5000 "

# Resolves: rhbz#1176302 (docker issue #407)

DOCKER_NOWARN_KERNEL_VERSION=1

# Location used for temporary files, such as those created by

# # docker load and build operations. Default is /var/lib/docker/tmp

# # Can be overriden by setting the following environment variable.

# # DOCKER_TMPDIR=/var/tmp

DOCKER_TMPDIR=/opt/test/docker/tmp

---------------------------------------------------------

8.6、監(jiān)控實(shí)例

這個(gè)日志面板生成功能非常方便扔枫,簡(jiǎn)單易用汛聚,隨時(shí)用隨時(shí)生成。還有最重要的這套日志系統(tǒng)短荐,還可以設(shè)置數(shù)據(jù)流的報(bào)警功能倚舀,需要大家自已去研究使用。并且有完善的用戶管理體系忍宋。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末痕貌,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子糠排,更是在濱河造成了極大的恐慌舵稠,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件入宦,死亡現(xiàn)場(chǎng)離奇詭異哺徊,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)云石,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)唉工,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人汹忠,你說(shuō)我怎么就攤上這事淋硝。” “怎么了宽菜?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵谣膳,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我铅乡,道長(zhǎng)继谚,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任阵幸,我火速辦了婚禮花履,結(jié)果婚禮上芽世,老公的妹妹穿的比我還像新娘。我一直安慰自己诡壁,他們只是感情好济瓢,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著妹卿,像睡著了一般旺矾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上夺克,一...
    開(kāi)封第一講書(shū)人閱讀 51,727評(píng)論 1 305
  • 那天箕宙,我揣著相機(jī)與錄音,去河邊找鬼铺纽。 笑死柬帕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的室囊。 我是一名探鬼主播雕崩,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼融撞!你這毒婦竟也來(lái)了盼铁?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤尝偎,失蹤者是張志新(化名)和其女友劉穎饶火,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體致扯,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肤寝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年嘿般,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了怒详。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贡这。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡巴刻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出罢缸,到底是詐尸還是另有隱情漱竖,我是刑警寧澤随静,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布蹈垢,位于F島的核電站慷吊,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏曹抬。R本人自食惡果不足惜溉瓶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧堰酿,春花似錦疾宏、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至嗅榕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吵聪,已是汗流浹背凌那。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吟逝,地道東北人帽蝶。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像块攒,于是被迫代替她去往敵國(guó)和親励稳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容