如果文章內容看不懂,最後有個小實驗可以瞭解一下
docker swarm集羣:三劍客之一
準備:
docker01 | docker02 | docker03 |
---|---|---|
192.168.1.10 | 192.168.1.20 | 192.168.1.30 |
myvisualizer.tar | nginx.tar | nginx.tar |
nginx.tar |
關閉防火牆,禁用selinux,3臺dockerhost區別主機名,時間同步
[root@docker01 ~]# systemctl stop firewalld
[root@docker01 ~]# systemctl disable firewalld
[root@docker01 ~]# setenforce 0
時間同步:
mv /etc/localtime/etc/localtime. bk
cp /usr/share/zoneinfo/Asia/Shanghai/etc/localtime
docker版本必須是:v1.12版本開始。
[root@docker01 ~]# docker -v
Docker version 18.09.0, build 4d60db4
每臺添加域名解析:
[root@docker01 ~]# vim /etc/hosts
192.168.1.10 docker01
192.168.1.20 docker02
192.168.1.30 docker03
Swarm:作用運行docker engin(引擎)的多個主機組成的集羣。
node:每一個docker engin都是一個(node)節點,分爲manager和worker。
manager node:負責執行編排和集羣的管理工作,保持並維護swarm處於期望的狀態。swram可以有多個manager node,他們會自動協商並選舉一個Leader執行編排任務。但相反,不能沒有manager node。
worker node:接受並執行manager node派發的任務,並且默認manager node也是一個worker node,不過可以將它設置爲manager-only node,讓它只負責編排和管理工作。
service:用來定義worker上執行的命令。
1)初始化集羣
docker初始化:
[root@docker01 ~]# docker swarm init --advertise-addr 192.168.1.10
//--advertis-addr:指定其他node通信的地址。
上面返回的結果告訴我們:初始化成功,並且,如果想要添加work節點運行下面的命令
docker swarm join --token SWMTKN-1-0tx0cf540mq3stxknq8xlv2183ymeeld9zvxen7x1tepw1z2un-e6onamnuj4nck4bw8k294ujnn 192.168.1.10:2377
PS:這裏注意,token只有24小時的有效期。
如果想要添加manager節點,運行下邊的命令:
docker swarm join-token manager
docker02和docker03運行:
[root@docker02 ~]# docker swarm join --token SWMTKN-1-0tx0cf540mq3stxknq8xlv2183ymeeld9zvxen7x1tepw1z2un-e6onamnuj4nck4bw8k294ujnn 192.168.1.10:2377
當其他兩個節點加入成功之後,我們可以用 docker node ls查看節點信息
docker01查看:
[root@docker01 ~]# docker node ls
PS:
*:當前所在終端
Ready:準備報,可以進行工作
Active:正在運行中
dokcer02和docker03操作:
docker swarm leave :申請離開一個集羣(自動離職),之後查看節點狀態會變成down,然後可以通過manager node將其刪除。
自動離職:
[root@docker02 ~]# docker swarm leave
Node left the swarm.
docker01上操作:
docker node rm xxx:刪除某個節點(開除)。
開除:
[root@docker01 ~]# docker node rm docker02
docker02
[root@docker01 ~]# docker node rm docker03
docker03
基本操作命令:
docker swarm join-token [manager| worker]:生成令牌,可以是manager身份或worker身份。
[root@docker01 ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-0tx0cf540mq3stxknq8xlv2183ymeeld9zvxen7x1tepw1z2un-ca100vimkqxp3d2ka30o2y0fi 192.168.1.10:2377
docker02和docker03上操作:
[root@docker03 ~]# docker swarm join --token SWMTKN-1-0tx0cf540mq3stxknq8xlv2183ymeeld9zvxen7x1tepw1z2un-ca100vimkqxp3d2ka30o2y0fi 192.168.1.10:2377
This node joined a swarm as a manager.
docker node demote (降職):將此swram節點的manager
降級爲work.
docker node promote (升職):將swarm節點的work升級爲manager.
docker01上操作:
[root@docker01 ~]# docker node demote docker02
Manager docker02 demoted in the swarm.
[root@docker01 ~]# docker node demote docker03
Manager docker03 demoted in the swarm.
[root@docker01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
kzwsrnrij3gauh9kkzio2ktab * docker01 Ready Active Leader 18.09.0
c39620kukfj2lgjm53yw7srq5 docker02 Ready Active 18.09.0
mtghji5h1muwrxrb1j174u66p docker03 Ready Active 18.09.0
2)部署docker swarm集羣網絡
overlay:覆蓋型網絡。
docker01操作:
[root@docker01 ~]# docker network create -d overlay --attachable docker
sfot05jf5hkjjdx1el56ffc9e
//attachble:這個參數必須要加,否則不能用於容器。
在創建網絡的時候,我們並沒有部署一個存儲服務,比如consul,那是因爲docker swarm自帶存儲。
3)部署一個圖形化webUI界面。
docker01導入myvisualizer.tar鏡像
[root@docker01 ~]# docker load < myvisualizer.tar
[root@docker01 ~]# docker run -d -p 8080:8080 -e HOST=192.168.1.10 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock --name visualizer dockersamples/visualizer
然後可以通過瀏覽器訪問驗證:
如果網頁訪問不到,需要開啓路由轉發:
[root@docker01 ~]# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
[root@docker01 ~]# sysctl -p
net.ipv4.ip_forward = 1
4)創建service
三臺docker都操作
[root@docker01 ~]# docker service create --replicas 1 --network docker --name web1 -p 80 nginx:latest
//--replicas:副本數量。
大概可以理解爲:一個副本等於一個容器。
//查看service:
[root@docker01 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
ivihvmk98bz5 web1 replicated 1/1 nginx:latest *:80->80/tcp
//查看service信息:
[root@docker01 ~]# docker service ps web1
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
w9u7bun0cg1f web1.1 nginx:latest docker03 Running Running 4 minutes ago
//創建5個容器:
[root@docker01 ~]# docker service create --replicas 5 --network docker --name web -p 80 nginx:latest
將docker02掛起後:
將docker03掛起後:都到docker01上
但是當docker02和docker03啓動後,工作也回不去
//刪除容器:
[root@docker01 ~]# docker service rm web1
web1
//增加或減少容器:
[root@docker01 ~]# docker service scale web=8
//設置manager node不參加工作:
[root@docker01 ~]# docker node update --availability drain docker01
docker01
小實驗:
3臺docker:
docker01 docker02 docker03
192.168.1.10 192.168.1.20 192.168.1.30
193.
部署一個swarm集羣,要求3臺dockerhost,docker01爲manager node,02和03爲worker node.
三臺docker都做:
DNS域名解析
[root@docker01 ~]# vim /etc/hosts
192.168.1.10 docker01
192.168.1.20 docker02
192.168.1.30 docker03
初始化:
[root@docker01 ~]# docker swarm init --advertise-addr 192.168.1.10
docker02加入羣集:
[root@docker02 ~]# docker swarm join --token SWMTKN-1-3rtvbfgl70u9fndd02kazcne3ib7zqzfhrx7v1ty2ebmod4ex6-2xe4chwto2m04mcwcn601zn54 192.168.1.10:2377
docker03加入羣集:
[root@docker03 ~]# docker swarm join --token SWMTKN-1-3rtvbfgl70u9fndd02kazcne3ib7zqzfhrx7v1ty2ebmod4ex6-2xe4chwto2m04mcwcn601zn54 192.168.1.10:2377
[root@docker01 ~]# docker node ls
需要myvisualizer.tar鏡像,可以從網上找
將myvisualizer.tar導入docker鏡像:
[root@docker01 ~]# docker load < myvisualizer.tar
運行myvisualizer.tar
[root@docker01 ~]# docker run -d -p 8080:8080 -e HOST=192.168.1.10 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock --name visualizer dockersamples/visualizer
訪問驗證:
部署一個servcie服務,要求使用httpd鏡像,名稱爲test.要求8個副本數量。並且swarm集羣要求:manager 節點不參加工作。
需要httpd.tar包,可從網上下載
將httpd.tar導入docker鏡像:
[root@docker01 ~]# docker load < httpd.tar
創建一個名叫docker,網卡類型爲overlay的網卡:
[root@docker01 ~]# docker network create -d overlay --attachable docker
使用httpd鏡像創建8臺網卡爲docker的test容器:
[root@docker01 ~]# docker service create --replicas 8 --network docker --name test -p 80 httpd:latest
驗證
使docker01不參加工作
[root@docker01 ~]# docker node update --availability drain docker01
docker01
驗證: