Docker Swarm容器集羣管理

Swarm介紹

Swarm是Docker公司自研發的容器集羣管理系統,Swarm在早期是做爲一個獨立服務存在,在Docker Engine v1.12中集成了Swarm的集羣管理和編排功能。能夠經過初始化Swarm或加入現有Swarm來啓用Docker引擎的Swarm模式。html

Docker Engine CLI和API包括了管理Swarm節點命令,好比添加,刪除節點,以及在Swarm中部署和編排服務。也增長了服務棧(Stack),服務(Service),任務(Task)概念。node

 

swarm特色

 

1.Docker Engine集成集羣管理

使用Docker Engine CLI 建立一個Docker Engine的Swarm模式,在集羣中部署應用程序服務linux

 

2.去中心化設計

Swarm角色分爲Manager和Worker節點,Manager節點故障不影響應用使用。nginx

 

3.擴容縮容

能夠聲明每一個服務運行的容器數量,經過添加或刪除容器數自動調整指望的狀態。web

 

4.指望狀態協調

Swarm Manager節點不斷監視集羣狀態,並調整當前狀態與指望狀態之間的差別。docker

 

5.多主機網絡

能夠爲服務指定overlay網絡。但初始化或更新應用程序時,Swarm manager會自動爲overlay網絡上的容器分配IP地址。json

 

6.服務發現

Swarm manager節點爲集羣中的每一個服務分配惟一的DNS記錄和負載均衡VIP。能夠經過Swarm內置的DNS服務器查詢集羣中每一個運行的容器。vim

 

7.負載均衡

實現服務副本負載均衡,提供入口訪問。centos

 

8.安全傳輸

Swarm中的每一個節點使用TLS相互驗證和加密,確保安全的其餘節點通訊安全

 

9.滾動更新

升級時,逐步將應用服務更新到節點,若是出現問題,能夠將任務回滾到向前版本。

 

集羣部署

 

環境部署要求

 

使用swarm前提

Docker版本1.12+

集羣節點之間保證TCP 2377 (集羣管理),TCP/UDP 7946 (容器網絡發現)和UDP 4789 (Overlay網絡)端口通訊

 

節點規劃

 
  1. 1.#系統環境
  2. 2.[root@docker-client ~]# cat /etc/redhat-release
  3. 3.CentOS Linux release 7.5.1804 (Core)
  4. 4.[root@docker-client ~]# uname -r
  5. 5.3.10.0-862.3.3.el7.x86_64
主機名 IP地址 用途
Manager 192.168.200.113 swarm管理節點
Worker01 192.168.200.114 swarm工做節點
Worker02 192.168.200.115 swarm工做節點
 

三臺客戶端全都安裝Docker-ce

 

安裝依賴包

yum -y install yum-utils device-mapper-persistent-data lvm2

image_1d0ua0uh3pgs1i9n1oh63gtf5e9.png-151.6kB

 

添加docker的CE版本的yum源配置文件

curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo

ll /etc/yum.repos.d/docker-ce.repo

image_1d0ua2912do88vf1mel9ul1nf11m.png-30.2kB

 

安裝CE版本的docker

yum -y install docker-ce

systemctl start docker #啓動docker

systemctl enable docker #添加開機啓動

docker version #查看docker版本

image_1d0uan31l1djd1f6v16jgc0m1lvg23.png-127.4kB

 

添加docker國內鏡像源

在開始學習docker以前,咱們首先要更改一下docker的默認源鏡像下載地址(默認是從國外下載,很慢),咱們須要添加國內的源地址

vim /etc/docker/daemon.json

cat /etc/docker/daemon.json

 
  1. {
  2. "registry-mirrors":[ "https://registry.docker-cn.com" ]
  3. }

systemctl daemon-reload

systemctl restart docker

image_1d0uap5rbrib1vub1jvunvgm672g.png-23.4kB

 

三臺都裝這幾個鏡像

docker pull centos

docker pull nginx

docker pull nginx:1.15

docker pull nginx:1.14

docker pull nginx:1.13

docker pull nginx:1.12

docker images

image_1d0uavddc11ah1mjn1l1t72gh632t.png-126kB


image_1d0uavun71vncpem130lkbn1u0p3a.png-34.4kB

 

DockerSwarm集羣初始化與工做節點成員添加

 

初始化docker swarm管理節點

在Manager端進行以下操做

docker swarm init --advertise-addr 192.168.200.113

 
  1. Swarm initialized: current node (sdib4e7xtr487nacdd12uc08h) is now a manager. #集羣初始化:當前節點是一個管理節點
  2. To add a worker to this swarm, run the following command: #若要向該集羣添加工做節點,請運行如下命令:
  3. docker swarm join --token SWMTKN-1-0rf33ext1xpauiyga7igrrru2acjp92rglgc3xyklu8cbfnv0q-15r4lcy1qm342clqps0hizfnu 192.168.200.113:2377 #docker swarm添加集羣工做節點的命令字符串
  4. To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

image_1d0ub8qlv15m315ru1dcupshm2444.png-38.3kB

 

在work01上

在兩個工做節點進行以下操做

docker swarm join --token SWMTKN-1-0rf33ext1xpauiyga7igrrru2acjp92rglgc3xyklu8cbfnv0q-15r4lcy1qm342clqps0hizfnu 192.168.200.113:2377

image_1d0ub9j8p1er9mkr1ikmruf1n5d4h.png-21.2kB

 

在work02上

docker swarm join --token SWMTKN-1-0rf33ext1xpauiyga7igrrru2acjp92rglgc3xyklu8cbfnv0q-15r4lcy1qm342clqps0hizfnu 192.168.200.113:2377

image_1d0ub9q501vdmgcv1sgu15avqrd4u.png-21.6kB

 

在Manager上查看全部節點成員信息

docker node ls

 
  1. ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
  2. njawag7xglmaziwf8o3rg4nbu * manager Ready Active Leader 18.09.1
  3. 0u5cb5jt9n1n31bq7uhbzrcj1 worker01 Ready Active 18.09.1
  4. 73h26e9b9ngwxmwtj0lc5r7jb worker02 Ready Active 18.09.1

image_1d0ubag651rcj1c0p2482n31gf35b.png-29.4kB

 

集羣服務管理

 

docker swarm集羣管理須要全部集羣節點進行時間同步

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime --->時區亞洲

date +%F-%H-%M-%S --->查看時間

image_1d0uet4vvg8jp4a9j14cj1frt5o.png-22.6kB


image_1d0uethfb19snt7019irva01hdh65.png-23.8kB


image_1d0uetphc7ambn51j3n1e3l1fnk6i.png-24.2kB

 

查看docker service幫助信息

docker service --help

 
  1. Usage: docker service COMMAND
  2. Manage services
  3. Commands:
  4. create Create a new service #建立一個新服務
  5. inspect Display detailed information on one or more services #查看服務詳細信息
  6. logs Fetch the logs of a service or task #查看服務的日誌
  7. ls List services #查看服務列表
  8. ps List the tasks of one or more services #查看服務的任務狀況
  9. rm Remove one or more services #刪除一個服務
  10. rollback Revert changes to a services configuration #服務配置回滾
  11. scale Scale one or multiple replicated services #調整服務副本數
  12. update Update a service #更新一個服務的副本資源

image_1d0ueu7lt1jvqfv2u2j1fdaokk6v.png-41.5kB

 

集羣服務的建立,查看與資源調整

 

在Manager節點上啓動服務

docker service create --replicas 2 --name test centos ping www.baidu.com

 
  1. 命令說明
  2. --replicas 2 :啓動兩個服務的副本容器
  3. --name test :服務的名字叫作test
  4. centos:啓動的鏡像的名字(本地沒有會自動下載)
  5. ping www.baidu.com :副本里最後啓動的命令進程

image_1d0ui339q1v8h1f141t8m1jd3tv57c.png-22.3kB

 

查看服務的種類列表

docker service ls

image_1d0ui3gfpkqh3i55kh18l886j7p.png-16.8kB

 

查看test服務的副本任務狀況

docker service ps test

image_1d0ui451m108a13unig1fj8d86.png-24.5kB

 

查看test服務的詳細信息--pretty test易讀的方式顯示

docker service inspect --pretty test

image_1d0ui4s9dteu14ulaj11p2p1hij8j.png-60.7kB

 

擴展服務實例數

docker service scale test=3

image_1d0ui5u7e1rl58641revvq2ghr90.png-20.8kB

 

查看服務列表

docker service ls

image_1d0ui69ouqn11bja2njlj61mn9d.png-16.7kB

 

查看具體服務副本信息

docker service ps test

image_1d0ui6tc43hij8q6f1dr91q319q.png-29kB

 

對服務的副本進行資源限制

docker service inspect --pretty test

docker service update --limit-cpu=0.5 test

docker service update --limit-memory 500M test

image_1d0ui85osr8i1nrc1r6m1iuobj6an.png-61.5kB


image_1d0ui9tfeefk1nt21efr1iav1uj9b4.png-20.9kB

 

查看test服務詳細信息

docker service inspect --pretty test

image_1d0uiailp1occ19f31ng41se95rhbh.png-79.1kB

 

查看服務的副本運行狀態

docker service ps test

image_1d0uib5ek3dpv7qmd0p911ma3bu.png-45.4kB

 

從上邊咱們發現服務的副本運行有中止的,咱們能夠經過過濾器,只查看運行狀態的副本容器

docker service ps -f 'desired-state=running' test

image_1d0uibnunm80150d12jv1atr4jkcb.png-30.6kB

 

集羣副本的更新與回滾

 

建立nginx-test服務,並啓動三個副本

docker service create --replicas 3 --name nginx-test nginx

image_1d0uif1nu2s5llq8ontdu15aaco.png-23.1kB

 

查看nginx-test服務的副本運行狀況

docker service ps nginx-test

docker service ls

image_1d0uigtkt1nk1k1q17a27gjibddi.png-44.2kB

 

將服務nginx-test的副本鏡像更新成nginx:1.12版

docker service update --image nginx:1.12 nginx-test

image_1d0uii76u28nqhn1c115ukpcddv.png-21.2kB

 

查看服務列表

docker service ls

image_1d0uiicqack856v1vtov9rdtkec.png-20.7kB

 

查看服務的副本運行信息

docker service ps nginx-test

image_1d0uija7p1bh1cnpb76f6q1jg6ep.png-45.6kB

 

將nginx-test的副本更新回滾到上一次

docker service update --rollback nginx-test

image_1d0uikctl18gs1ai31reg1154niif6.png-24.1kB

 

查看服務列表

docker service ls

image_1d0uikltu5me9tgcv6etv1t2ofj.png-21.7kB

 

查看nginx-test服務的

docker service ps nginx-test

image_1d0uilc68knn11ve14om18q61enog0.png-61.5kB

 

集羣副本的更新策略與回滾策略

 

建立服務時設定副本的更新及回滾策略

docker service create --name my_web --replicas 10 --update-delay 10s --update-parallelism 2 --update-failure-action continue --rollback-parallelism 2 --rollback-monitor 20s --rollback-max-failure-ratio .2 nginx:1.12

 
  1. 命令說明
  2. docker service create \
  3. --name my_web \ #服務的名字
  4. --replicas 10 \ #一共啓動10個服務副本
  5. --update-delay 10s \ #更新時10s間隔
  6. --update-parallelism 2 \ #更新時一次性更新兩個任務
  7. --update-failure-action continue \ #更新失敗時繼續更新下一個
  8. --rollback-parallelism 2 \ #回滾時一次性更新兩個任務
  9. --rollback-monitor 20s \ #回滾監控20s
  10. --rollback-max-failure-ratio .2 \ #回滾失敗率20%
  11. nginx:1.12

image_1d0uje72t1avevjdk138ui1pi7gd.png-52.4kB

 

查看服務列表及副本運行情況

docker service ls

docker service ps my_web

image_1d0ujer401vj71m8b1k95dss1hkigq.png-84.4kB

 

將服務my_web的副本鏡像更新到nginx:1.13版

docker service ls

docker service update --image nginx:1.13 my_web

docker service ls

image_1d0ujiqg8qabd013tn4c2eb6hn.png-73.8kB

 

將服務my_web的副本更新回滾到上一個版本

docker service ls

docker service update --rollback my_web

docker service ls

image_1d0ujknv5166h9pvg8s1sq11924i4.png-75.5kB

 

集羣服務的刪除

 

刪除集羣服務my_web

docker service ls

docker service rm my_web

docker ps -a

image_1d0ujntic1ou313ij62jj6it7cih.png-70.7kB

 

查看work01容器進程

docker ps -a

image_1d0ujo5lv1bq812o3vh1fec179aiu.png-15.6kB

 

查看work02容器進程

docker ps -a

image_1d0ujod1e11f41pgs1sqais81pqujb.png-15.8kB

 

集羣數據管理(數據持久化)

 

以volume卷掛載容器的方式啓動swarm集羣

docker service create --mount type=volume,src=nginx-vol,dst=/usr/share/nginx/html --replicas 3 --name test01 nginx

docker volume ls

 
  1. local nginx-vol #數據卷有了

docker service ls

ll -d /var/lib/docker/volumes/nginx-vol

image_1d10jvlemicj1vaohjqc4dvfq9.png-74.8kB

 

以bind掛載容器的方式啓動swarm集羣

 

在三臺機器上都建立目錄/app/www

mkdir -p /app/www --->三臺都須要建立目錄

image_1d10kfopqera1i9110k51s78ng59.png-12.6kB

 

集羣方式啓動bind掛載容器

docker service create --mount type=bind,src=/app/www,dst=/usr/share/nginx/html --replicas 3 --name test02 nginx

docker service ls

docker service ps test02

image_1d10kj2p8152jeh15ojtvv1ecfm.png-88.3kB

 

手動填寫內容,並不是交互查看容器的網頁目錄

echo "xin" > /app/www/xin

docker ps -a

docker exec c28 ls /usr/share/nginx/html

image_1d10knen1iomscjmhvplvu7513.png-54.7kB

 

以NFS掛載容器的方式啓動swarm集羣

 

三臺機器上都安裝NFS(work02做爲服務端)

yum -y install nfs-utils --->三臺都須要安裝

mkdir -p /data/ --->work02上建立

echo "welcome to yunjisuan" > /data/index.html --->work02建立網頁文件

image_1d10l5fbmqqgseg1p75nh3h0320.png-209.5kB

 

在work02上修改nfs配置文件

vim /etc/exports

 
  1. /data 192.168.200.0/24(rw,no_root_squash)

cat /etc/exports

systemctl start nfs

netstat -antup | grep rpcbind

showmount -e localhost

image_1d10la4clgj71op2fad1qg01oqa2d.png-67.4kB

 

在Manager上測試鏈接NFS

showmount -e 192.168.200.115

image_1d10lar26181t1iu3kic18p4jka2q.png-21.5kB

 

刪除以前建立的容器

docker service ls

docker service rm test01

docker service rm test02

image_1d10lrugocr3pgv1bv21gd11bvv37.png-41kB

 

以NFS掛載容器的方式啓動swarm集羣

docker volume ls

 
  1. docker service create --mount 'type=volume,src=web-vol,dst=/usr/share/nginx/html,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/data,"volume-opt=o=addr=192.168.200.115,vers=4,soft,timeo=180,bg,tcp,rw"' --name test01 nginx
  2. 特別提示:給用一個沒有建立過的卷(web-vol),要不會失敗

docker service ps test01

docker volume ls

df -hT | grep data

image_1d10oljkj1d6lnvt17jlt8s9d03k.png-93kB

 

查看以前添加的網頁文件

docker ps

docker exec 030 ls /usr/share/nginx/html

docker exec 030 cat /usr/share/nginx/html/index.html

image_1d10ot9ul1585sq21eqr10mejt4r.png-49.6kB

 

將集羣服務test01的node節點擴充到3個

docker service ps test01

docker service scale test01=3

docker service ps test01

image_1d10onhj68t1bfrp17a8dj9441.png-80kB

 

特別提示

以自動掛載NFS共享存儲的方式啓動swarm集羣容器,type類型只能是volume,卷的名字須要在啓動時建立(啓動前沒有這個卷),所以建立volume的同時進行nfs共享掛載的話,須要同時建立一個opts.json的支持文件

ls /var/lib/docker/volumes/web-vol/

 
  1. _data opts.json #就是這個文件

ls /var/lib/docker/volumes/nginx-vol/

 
  1. _data #而以前建立好的volume卷沒有這個文件

image_1d10ooc3uhkv72u1tuh1s081nga4e.png-22.5kB

 

集羣服務發佈

在以前咱們所啓動的全部容器,若是想要訪問,那麼只能經過docker exec進去看。並不能如同生產環境中一下,讓用戶從外部訪問,那麼swarm的集羣服務,若是發佈能讓用戶從外部訪問的容器呢?

image_1cv28g663194ufsg1n9a15c71ba79.png-186.2kB

 

啓動swarm集羣並暴露宿主機88端口

 
  1. docker service create --mount 'type=volume,src=web-vol,dst=/usr/share/nginx/html,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/data,"volume-opt=o=addr=192.168.200.115,vers=4,soft,timeo=180,bg,tcp,rw"' --name test01 -p 88:80 --replicas 3 nginx

image_1d10pc41211un11lt1vo212iq16q258.png-48.5kB

 

查看swarm集羣啓動狀況

ss -antup | grep 88

docker service ls

image_1d10pcvod9pa1kscvqs6trbr45l.png-41.6kB

 

進行訪問測試

curl 192.168.200.113:88

curl 192.168.200.114:88

curl 192.168.200.115:88

image_1d10pdhvqsof1hnb1ml1bf77r862.png-33kB

 

集羣統一配置管理

 

建立一個自定義的nginx.conf

vim nginx.conf

cat nginx.conf

 
  1. worker_processes 1;
  2. events {
  3. worker_connections 1024;
  4. }
  5. http {
  6. include mime.types;
  7. default_type application/octet-stream;
  8. sendfile on;
  9. keepalive_timeout 65;
  10. server {
  11. listen 80;
  12. server_name www.yunjisuan.com;
  13. location / {
  14. root /usr/share/nginx/html;
  15. index index.html index.htm;
  16. }
  17. }
  18. }

image_1d10r1v4v6ki14bf1no0g3f13bp6s.png-49kB

 

將配置文件加入docker config管理

docker config ls

docker config create nginx.conf nginx.conf

docker config ls

image_1d10r3a3m1cmrb071hn1gduuu679.png-43kB

 

啓動集羣並應用集羣配置管理保存的配置文件

docker service create --name nginx --replicas 3 --config source=nginx.conf,target=/etc/nginx/nginx.conf -p 8080:80 nginx

image_1d10r3ucj17hf79818llrub1dvs7m.png-38.1kB

 

查看集羣節點容器的配置文件應用狀況

docker service ls

docker ps

docker exec c5c cat /etc/nginx/nginx.conf

image_1d10r69ecmkt1o5ap36130g1s7c83.png-103.7kB

 

清理服務後再次進行測試。

docker service ls

docker service rm nginx

image_1d10r7lks1ipilef1c6pqmorv58g.png-42kB

 

建立一個首頁文件

vim index.html

cat index.html

 
  1. hello world!

docker config create index.html index.html

docker config ls

image_1d10r9814andtdsk85jka14cl8t.png-52.2kB

 

將docker config管理的nginx.conf和index.html都應用進集羣容器

docker service create --name nginx --replicas 3 --config source=nginx.conf,target=/etc/nginx/nginx.conf --config source=index.html,target=/usr/share/nginx/html/index.html -p 8080:80 nginx

curl 192.168.200.113:8080

curl 192.168.200.114:8080

curl 192.168.200.115:8080

image_1d10ravc61u37ohd1gdd18ao168n9a.png-65.9kB

 

清除配置管理

docker config ls

docker config rm index.html

docker config rm nginx.conf

image_1d10rd4tva731gpb1ado1e9e16n39n.png-47.9kB

 

Docker容器自動化方向最終架構圖示詳解

image_1d10qkj3l11ap1s721e1o631m3o6f.png-353.5kB

相關文章
相關標籤/搜索