若是文章內容看不懂,最後有個小實驗能夠了解一下html
docker01 | docker02 | docker03 |
---|---|---|
192.168.1.10 | 192.168.1.20 | 192.168.1.30 |
myvisualizer.tar | nginx.tar | nginx.tar |
nginx.tar |
[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
[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
node:每個docker engin都是一個(node)節點,分爲manager和worker。linux
manager node:負責執行編排和集羣的管理工做,保持並維護swarm處於指望的狀態。swram能夠有多個manager node,他們會自動協商並選舉一個Leader執行編排任務。但相反,不能沒有manager node。nginx
worker node:接受並執行manager node派發的任務,而且默認manager node也是一個worker node,不過能夠將它設置爲manager-only node,讓它只負責編排和管理工做。web
service:用來定義worker上執行的命令。docker
[root@docker01 ~]# docker swarm init --advertise-addr 192.168.1.10
//--advertis-addr:指定其餘node通訊的地址。apache
docker swarm join --token SWMTKN-1-0tx0cf540mq3stxknq8xlv2183ymeeld9zvxen7x1tepw1z2un-e6onamnuj4nck4bw8k294ujnn 192.168.1.10:2377
PS:這裏注意,token只有24小時的有效期。vim
docker swarm join-token manager
[root@docker02 ~]# docker swarm join --token SWMTKN-1-0tx0cf540mq3stxknq8xlv2183ymeeld9zvxen7x1tepw1z2un-e6onamnuj4nck4bw8k294ujnn 192.168.1.10:2377
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
基本操做命令:
[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.
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
overlay:覆蓋型網絡。
docker01操做:
[root@docker01 ~]# docker network create -d overlay --attachable docker sfot05jf5hkjjdx1el56ffc9e
//attachble:這個參數必需要加,不然不能用於容器。
在建立網絡的時候,咱們並無部署一個存儲服務,好比consul,那是由於docker swarm自帶存儲。
[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
[root@docker01 ~]# docker service create --replicas 1 --network docker --name web1 -p 80 nginx:latest
//--replicas:副本數量。
大概能夠理解爲:一個副本等於一個容器。
[root@docker01 ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS ivihvmk98bz5 web1 replicated 1/1 nginx:latest *:80->80/tcp
[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
[root@docker01 ~]# docker service create --replicas 5 --network docker --name web -p 80 nginx:latest
[root@docker01 ~]# docker service rm web1 web1
[root@docker01 ~]# docker service scale web=8
[root@docker01 ~]# docker node update --availability drain docker01 docker01
docker pull registry:2 docker run -itd --name registry --restart=always -p 5000:5000 -v /registry:/var/lib/registry registry:2 docker pull busybox docker tag busybox:latest 192.168.1.10:5000/busybox vim /usr/lib/systemd/system/docker.service 13行: ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.10:5000 systemctl daemon-reload systemctl restart docker docker push 192.168.1.10:5000/busybox:latest
要求:基於httpd鏡像,更改主訪問界面內容,鏡像tag版本爲v1,v2,v3,對應主機面內容爲111,222,333.
[root@docker01 ~]# mkdir {v1,v2,v3} [root@docker01 v1]# cd [root@docker01 ~]# cd v1/ [root@docker01 v1]# cat index.html 1111111111111111111 ##另外v2,v3爲222 222 [root@docker01 v1]# cat Dockerfile FROM httpd ADD index.html /usr/local/apache2/htdocs/index.html [root@docker01 v1]# docker build -t 192.168.1.10:5000/httpd:v1 . [root@docker01 v1]# docker push 192.168.1.10:5000/httpd:v1
要求:副本數量爲3個。服務的名稱爲:bdqn.
[root@docker01 v1]# docker service create --replicas 3 --name bdqn -p 80:80 192.168.1.10:5000/httpd:v1
PS:到docker02和docker03用docker service ls查看一下,是否一共有三臺bdqn!!!
互聯網訪問都是這個界面:
docker02:
[root@docker02 ~]# docker exec -it 915bb2da7d43 /bin/bash root@915bb2da7d43:/usr/local/apache2# cd htdocs/ root@915bb2da7d43:/usr/local/apache2/htdocs# echo 12345 > index.html [root@docker02 ~]# curl 127.0.0.1 54321
docker03:
[root@docker03 ~]# docker exec -it bdqn.1.kaksxkdur0fhypukm8q2zms3i /bin/bash root@31c5f6af1259:/usr/local/apache2# cd htdocs/ root@31c5f6af1259:/usr/local/apache2/htdocs# echo 54321 > index.html root@31c5f6af1259:/usr/local/apache2/htdocs# exit exit [root@docker03 ~]# curl 127.0.0.1 54321
以後驗證:
[root@docker01 ~]# curl 127.0.0.1 1111111111111111111 [root@docker01 ~]# curl 127.0.0.1 12345 [root@docker01 ~]# curl 127.0.0.1 54321
默認的ingress網絡,包括建立的自定義overlay網絡,爲後端真正爲用戶提供服務的container,提供了一個統一的入口。
[root@docker01 ~]# docker service create --replicas 3 --name test -p 80 192.168.1.10:5000/httpd:v1
隨即映射端口範圍30000-32767
[root@docker01 ~]# docker service scale bdqn=6
擴容與縮容能夠直接經過scale進行設置副本數量。
[root@docker01 ~]# docker service update --image 192.168.1.10:5000/httpd:v2 bdqn
//平滑的更新。
[root@docker01 ~]# docker service update --image 192.168.1.10:5000/httpd:v3 --update-parallelism 2 --update-delay 1m bdqn
PS:默認狀況下,swarm一次只更新一個副本,而且兩個副本之間沒有等待時間,咱們能夠經過--update-parallelism設置並行更新的副本數量。
--update-delay:指定滾動更新的時間間隔。
[root@docker01 ~]# docker service rollback bdqn
PS:注意docker swarm的回滾操做,默認只能回滾到上一次操做的狀態,並不能連續回滾操做。
小實驗:
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
驗證: