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
用戶名: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)警功能倚舀,需要大家自已去研究使用。并且有完善的用戶管理體系忍宋。