1. 程式人生 > >基於Docker的高可用解決方案

基於Docker的高可用解決方案

Docker從2013年釋出第一個版本以來,已經火遍全球,技術迭代也比較頻繁,其周邊產品和技術也越來越豐富。Docker的輕量級容器不僅實現了資源隔離,而且幾乎可以執行在任何地方,使得部署和擴充套件變得非常容易,隨著Docker的日趨完善,目前Docker已經被越來越多的公司應用到生產環境中。

一、docker簡介

Docker是一個由GO語言寫的程式執行的“容器”(Linux containers, LXCs);目前雲服務的基石是作業系統級別的隔離,在同一臺物理伺服器上虛擬出多個主機。Docker則實現了一種應用程式級別的隔離; 它改變我們基本的開發、操作單元,由直接操作虛擬主機(VM),轉換到操作程式執行的“容器”上來。

二、docker各元件

1、Docker:Docker daemon引擎。

2、consul:服務發現和配置共享的服務軟體。

3、swarm:基於Docker的叢集排程管理軟體,Docker 1.2版本中已經自動整合叢集功能了。

4、rethinkdb:RethinkDB是一個完全支援Memcached協議、資料可持久化的工業級key-value儲存系統,它自帶了cluster和web資源管理功能。

5、shipyard:Docker視覺化資源管理平臺

6、registrator:服務自動註冊

7、nginx:web服務代理軟體

8、consultemplate:Docker服務自動發現軟體,這個要結合nginx使用,當我們在宿主機上啟動一個容器服務時,這時候consultemplate就會自動從consul服務上發現在這個容器,並更新nginx配置檔案。

9、cadvisor:google公司開源的docker容器資源監控軟體

10、influxDB:InfluxDB是一個開源分散式時序、事件和指標資料庫。使用 Go 語言編寫,無需外部依賴。其設計目標是實現分散式和水平伸縮擴充套件。

11、grafana:圖表展現服務,功能非常強大。

12、graylog+ Elasticsearch:具有報警選項的可插入日誌和事件分析伺服器。

三、安裝consul服務

因為consul的高可用叢集最少需要3臺機器,但是這3臺,只要其中一臺故障這個consul的叢集就掛了,按官方的建 議最好5臺,這樣可以同時故障2臺。但是我為節省資源就用3臺。

3.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

解釋下各個引數:

-d容器在後臺執行, detached mode

--restart=always重啟模式, always 表示永遠。

-p 8400:8400對映 consul的 rpc 埠8400。

-p 8500:8500對映 UI 介面的埠8500。

-p 53/udp繫結udp 埠53(預設 DNS埠)在 Docker0 bridge 地址上。

-v /opt/test/data/consul:/data  這個把consul的資料檔案目錄掛載到宿主機上,這樣萬一容器重啟,資料就不會丟失。

3.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

3.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叢集服務已經安裝完成,進入10.2.0.80啟動的consul容器檢視一下consul的狀態

3.4、進入consul 容器

Docker exec -it d638539891e7 bash

#consul info   //檢視consul狀態,看到leader = true和server=true說明整叢集狀態已經正常了。

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叢集已檢測到3臺server了,並且狀態都正常。

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

#現在就可以看到consul的web平臺了,http://10.2.0.80:8500/ui/#/dc1/services。

四、安裝swarm、shipyard管理平臺

4.1、新增master:10.2.0.80節點

4.1.1、啟動容器shipyard-rethinkdb

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

引數解釋:

-v /opt/test/data:data把rethinkdb的資料目錄掛載到宿主機的/opt/test/data目錄下,這樣rethinkdb容器如果重啟,資料不會丟失。

-p 8080:8080 對映rethinkdb的 web UI埠,這樣可以看到rethinkdb的web視覺化資源管理平臺。

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

4.1.2、啟動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

4.1.3、啟動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

4.1.4、啟動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

4.1.5、啟動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

4.2、新增slave1:10.2.0.77節點

4.2.1、啟動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

4.2.2、啟動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

4.2.3、新增registrator

registrator 是基於 Docker 的 sock 檔案來做服務發現的一個第三方的方案,有實力的公司也可以自已開發服務註冊agent。

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

引數解釋:

-v /var/run/docker.sock:/tmp/docker.sock對映 Docker 的 socket 到 container 中的對應位置,這樣 registration 就能監控有哪些服務啟動了。

registration 所屬的主機 IP, 一定要設定此屬性, 否則服務IP會顯示為127.0.0.1

consul://localhost:8500consul 繫結到本地的 consul 介面上。

4.3、新增slave1:10.2.0.134節點

4.3.1、啟動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

4.3.2、啟動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

4.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

以上服務都啟動後就可以訪問shipyard的管理