Swarm是Docker公司自研發的容器集羣管理系統,Swarm在早期是做爲一個獨立服務存在,在Docker Engine v1.12中集成了Swarm的集羣管理和編排功能。能夠經過初始化Swarm或加入現有Swarm來啓用Docker引擎的Swarm模式。html
Docker Engine CLI和API包括了管理Swarm節點命令,好比添加,刪除節點,以及在Swarm中部署和編排服務。也增長了服務棧(Stack),服務(Service),任務(Task)概念。node
使用Docker Engine CLI 建立一個Docker Engine的Swarm模式,在集羣中部署應用程序服務linux
Swarm角色分爲Manager和Worker節點,Manager節點故障不影響應用使用。nginx
能夠聲明每一個服務運行的容器數量,經過添加或刪除容器數自動調整指望的狀態。web
Swarm Manager節點不斷監視集羣狀態,並調整當前狀態與指望狀態之間的差別。docker
能夠爲服務指定overlay網絡。但初始化或更新應用程序時,Swarm manager會自動爲overlay網絡上的容器分配IP地址。json
Swarm manager節點爲集羣中的每一個服務分配惟一的DNS記錄和負載均衡VIP。能夠經過Swarm內置的DNS服務器查詢集羣中每一個運行的容器。vim
實現服務副本負載均衡,提供入口訪問。centos
Swarm中的每一個節點使用TLS相互驗證和加密,確保安全的其餘節點通訊安全
升級時,逐步將應用服務更新到節點,若是出現問題,能夠將任務回滾到向前版本。
Docker版本1.12+
集羣節點之間保證TCP 2377 (集羣管理),TCP/UDP 7946 (容器網絡發現)和UDP 4789 (Overlay網絡)端口通訊
1.#系統環境
2.[root@docker-client ~]# cat /etc/redhat-release
3.CentOS Linux release 7.5.1804 (Core)
4.[root@docker-client ~]# uname -r
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工做節點 |
yum -y install yum-utils device-mapper-persistent-data lvm2
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
yum -y install docker-ce
systemctl start docker #啓動docker
systemctl enable docker #添加開機啓動
docker version #查看docker版本
在開始學習docker以前,咱們首先要更改一下docker的默認源鏡像下載地址(默認是從國外下載,很慢),咱們須要添加國內的源地址
vim /etc/docker/daemon.json
cat /etc/docker/daemon.json
{
"registry-mirrors":[ "https://registry.docker-cn.com" ]
}
systemctl daemon-reload
systemctl restart docker
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
在Manager端進行以下操做
docker swarm init --advertise-addr 192.168.200.113
Swarm initialized: current node (sdib4e7xtr487nacdd12uc08h) is now a manager. #集羣初始化:當前節點是一個管理節點
To add a worker to this swarm, run the following command: #若要向該集羣添加工做節點,請運行如下命令:
docker swarm join --token SWMTKN-1-0rf33ext1xpauiyga7igrrru2acjp92rglgc3xyklu8cbfnv0q-15r4lcy1qm342clqps0hizfnu 192.168.200.113:2377 #docker swarm添加集羣工做節點的命令字符串
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
在兩個工做節點進行以下操做
docker swarm join --token SWMTKN-1-0rf33ext1xpauiyga7igrrru2acjp92rglgc3xyklu8cbfnv0q-15r4lcy1qm342clqps0hizfnu 192.168.200.113:2377
docker swarm join --token SWMTKN-1-0rf33ext1xpauiyga7igrrru2acjp92rglgc3xyklu8cbfnv0q-15r4lcy1qm342clqps0hizfnu 192.168.200.113:2377
docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
njawag7xglmaziwf8o3rg4nbu * manager Ready Active Leader 18.09.1
0u5cb5jt9n1n31bq7uhbzrcj1 worker01 Ready Active 18.09.1
73h26e9b9ngwxmwtj0lc5r7jb worker02 Ready Active 18.09.1
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime --->時區亞洲
date +%F-%H-%M-%S --->查看時間
docker service --help
Usage: docker service COMMAND
Manage services
Commands:
create Create a new service #建立一個新服務
inspect Display detailed information on one or more services #查看服務詳細信息
logs Fetch the logs of a service or task #查看服務的日誌
ls List services #查看服務列表
ps List the tasks of one or more services #查看服務的任務狀況
rm Remove one or more services #刪除一個服務
rollback Revert changes to a services configuration #服務配置回滾
scale Scale one or multiple replicated services #調整服務副本數
update Update a service #更新一個服務的副本資源
docker service create --replicas 2 --name test centos ping www.baidu.com
命令說明
--replicas 2 :啓動兩個服務的副本容器
--name test :服務的名字叫作test
centos:啓動的鏡像的名字(本地沒有會自動下載)
ping www.baidu.com :副本里最後啓動的命令進程
docker service ls
docker service ps test
docker service inspect --pretty test
docker service scale test=3
docker service ls
docker service ps test
docker service inspect --pretty test
docker service update --limit-cpu=0.5 test
docker service update --limit-memory 500M test
docker service inspect --pretty test
docker service ps test
docker service ps -f 'desired-state=running' test
docker service create --replicas 3 --name nginx-test nginx
docker service ps nginx-test
docker service ls
docker service update --image nginx:1.12 nginx-test
docker service ls
docker service ps nginx-test
docker service update --rollback nginx-test
docker service ls
docker service ps nginx-test
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
命令說明
docker service create \
--name my_web \ #服務的名字
--replicas 10 \ #一共啓動10個服務副本
--update-delay 10s \ #更新時10s間隔
--update-parallelism 2 \ #更新時一次性更新兩個任務
--update-failure-action continue \ #更新失敗時繼續更新下一個
--rollback-parallelism 2 \ #回滾時一次性更新兩個任務
--rollback-monitor 20s \ #回滾監控20s
--rollback-max-failure-ratio .2 \ #回滾失敗率20%
nginx:1.12
docker service ls
docker service ps my_web
docker service ls
docker service update --image nginx:1.13 my_web
docker service ls
docker service ls
docker service update --rollback my_web
docker service ls
docker service ls
docker service rm my_web
docker ps -a
docker ps -a
docker ps -a
docker service create --mount type=volume,src=nginx-vol,dst=/usr/share/nginx/html --replicas 3 --name test01 nginx
docker volume ls
local nginx-vol #數據卷有了
docker service ls
ll -d /var/lib/docker/volumes/nginx-vol
mkdir -p /app/www --->三臺都須要建立目錄
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
echo "xin" > /app/www/xin
docker ps -a
docker exec c28 ls /usr/share/nginx/html
yum -y install nfs-utils --->三臺都須要安裝
mkdir -p /data/ --->work02上建立
echo "welcome to yunjisuan" > /data/index.html --->work02建立網頁文件
vim /etc/exports
/data 192.168.200.0/24(rw,no_root_squash)
cat /etc/exports
systemctl start nfs
netstat -antup | grep rpcbind
showmount -e localhost
showmount -e 192.168.200.115
docker service ls
docker service rm test01
docker service rm test02
docker volume ls
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
特別提示:給用一個沒有建立過的卷(web-vol),要不會失敗
docker service ps test01
docker volume ls
df -hT | grep data
docker ps
docker exec 030 ls /usr/share/nginx/html
docker exec 030 cat /usr/share/nginx/html/index.html
docker service ps test01
docker service scale test01=3
docker service ps test01
以自動掛載NFS共享存儲的方式啓動swarm集羣容器,type類型只能是volume,卷的名字須要在啓動時建立(啓動前沒有這個卷),所以建立volume的同時進行nfs共享掛載的話,須要同時建立一個opts.json的支持文件
ls /var/lib/docker/volumes/web-vol/
_data opts.json #就是這個文件
ls /var/lib/docker/volumes/nginx-vol/
_data #而以前建立好的volume卷沒有這個文件
在以前咱們所啓動的全部容器,若是想要訪問,那麼只能經過docker exec進去看。並不能如同生產環境中一下,讓用戶從外部訪問,那麼swarm的集羣服務,若是發佈能讓用戶從外部訪問的容器呢?
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
ss -antup | grep 88
docker service ls
curl 192.168.200.113:88
curl 192.168.200.114:88
curl 192.168.200.115:88
vim nginx.conf
cat nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name www.yunjisuan.com;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
}
docker config ls
docker config create nginx.conf nginx.conf
docker config ls
docker service create --name nginx --replicas 3 --config source=nginx.conf,target=/etc/nginx/nginx.conf -p 8080:80 nginx
docker service ls
docker ps
docker exec c5c cat /etc/nginx/nginx.conf
docker service ls
docker service rm nginx
vim index.html
cat index.html
hello world!
docker config create index.html index.html
docker config ls
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
docker config ls
docker config rm index.html
docker config rm nginx.conf