Docker Swarm
- Swarm的一些關鍵概念
- 什么是Swarm
- 阿里云搭建Swarm集群
- 準備作業
- 阿里云鏡像加速
- 創建主節點
- Raft協議
- 集群里部署專案(擴縮容)
- 概念總結
- Swarm的特點
- 服務副本與全域服務
- Docker Stack
Swarm的一些關鍵概念
什么是Swarm
-
使用Swarm構建嵌入在Docker引擎中的集群管理和編排功能,Swarm是一個單獨的專案,實作了Docker的業務流程層,并能夠直接在Docker中使用,
-
一個群集由多個Docker主機組成,這些Docker主機以群集模式運行,并充當管理節點(用于管理成員資格和委派)和作業節點(用于運行 群集服務),一個Docker主機可以是管理員,作業人員,或同時擔任這兩個角色,創建服務時,需要定義容器的最佳狀態(可用副本,網路和存盤資源的數量,服務向外界公開的埠等),Docker致力于維持高可用,例如,如果作業節點不可用,Docker會在其他節點上安排該節點的任務,一個運行的容器是一個群服務的一部分,并通過管理節點管理,而不是一個獨立的容器,
-
與獨立容器相比,群集服務的主要優勢之一是,可以修改服務的配置,包括它所連接的網路和卷,而無需手動重新啟動服務,Docker將更新配置,使用過期的配置停止服務任務,并創建與所需配置匹配的新任務,
-
當Docker以swarm模式運行時,仍然可以在參與該swarm的任何Docker主機以及swarm服務上運行獨立容器,獨立容器和群集服務之間的主要區別在于,只有群集管理器可以管理群集,而獨立容器可以在任何守護程式上啟動,Docker守護程式可以是管理節點,作業節點或兩者兼有的形式參與,
-
與可以使用Docker Compose定義和運行容器的方式相同,可以定義和運行Swarm服務堆疊,
阿里云搭建Swarm集群
準備作業
4臺機器安裝 Docker
# 安裝gcc相關環境
yum install -y gcc gcc-c++
# 安裝需要的軟體包
yum install -y yum-utils
# 安裝國內源倉庫
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 更新yum軟體包索引
yum makecache fast
# 安裝 Docker CE
yum install -y docker-ce docker-ce-cli containerd.io
# 啟動Docker
systemctl start docker
# 測驗命令
docker version
docker run hello-world
docker images
阿里云鏡像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
創建主節點
查看ip
ip a
inet 192.168.188.80/25
docker swarm init --advertise-addr 192.168.188.80
Swarm initialized: current node (w9souqryc62xwcptuv3zs63cq) is now a manager.
這個地址已經加入到了swarm里面 可以使用下面的命令讓其他節點加入進來
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-5n0et0tehpffvcvgwa7270nl2bo3onw9n4h44k92ynpyd58o9t-58uthrjhxif4bo54txvvb7zg9 192.168.188.80:2377
如果你想添加一個管理節點,你可以使用 docker swarm join-token manager
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instruct
ions.
初始化節點`docker swarm init`
docker swarm join 加入一個節點
# 獲取令牌
docker swarm join-token manager
docker swarm join-token worker
在主節點獲取令牌
[root@swarm1 ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-5n0et0tehpffvcvgwa7270nl2bo3onw9n4h44k92ynpyd58o9t-9uftr1s3e4mbvay8gsnea0r7x 192.168.188.80:2377
在另外一臺服務器上通過令牌加入集群
[root@swarm2 ~]# docker swarm join --token SWMTKN-1-5n0et0tehpffvcvgwa7270nl2bo3onw9n4h44k92ynpyd58o9t-58uthrjhxif4bo54txvvb7z
g9 192.168.188.80:2377This node joined a swarm as a worker.
查看節點資訊
[root@swarm1 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
w9souqryc62xwcptuv3zs63cq * swarm1 Ready Active Leader 20.10.6
jk3fylomxksvus1nmuai2f1ad swarm2 Ready Active 20.10.6
將第三臺服務器也加入集群
[root@swarm3 ~]# docker swarm join --token SWMTKN-1-5n0et0tehpffvcvgwa7270nl2bo3onw9n4h44k92ynpyd58o9t-58uthrjhxif4bo54txvvb7
zg9 192.168.188.80:2377This node joined a swarm as a worker.
將第四臺服務器作為主節點
先生成令牌
[root@swarm1 ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-5n0et0tehpffvcvgwa7270nl2bo3onw9n4h44k92ynpyd58o9t-9uftr1s3e4mbvay8gsnea0r7x 192.168.188.80:2377
[root@swarm4 ~]# docker swarm join --token SWMTKN-1-5n0et0tehpffvcvgwa7270nl2bo3onw9n4h44k92ynpyd58o9t-9uftr1s3e4mbvay8gsnea0
r7x 192.168.188.80:2377This node joined a swarm as a manager.
[root@swarm1 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
w9souqryc62xwcptuv3zs63cq * swarm1 Ready Active Leader 20.10.6
jk3fylomxksvus1nmuai2f1ad swarm2 Ready Active 20.10.6
gmeyrsa08bs4du78ym60s1kmt swarm3 Ready Active 20.10.6
w43kyxy54egy9b6nl6mw6acyw swarm4 Ready Active Reachable 20.10.6
Reachable 就是可觸達的 Leader和swarm4是可達的
Raft協議
-
雙主雙從:假設一個節點掛了!其他節點是否可以用!
-
Raft協議:保證大多數節點存活才可以用,集群至少要大于3臺
將swarm1機器停止,宕機!
[root@swarm1 ~]# systemctl stop docker
發現另外一個管理節點也不能使用了
[root@swarm4 ~]# docker node ls
Error response from daemon: rpc error: code = Unknown desc = The swarm does not have a leader. It's possible that too few man
agers are online. Make sure more than half of the managers are online.
重啟swarm1,之后Leader變成了 swarm4
[root@swarm4 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
w9souqryc62xwcptuv3zs63cq swarm1 Ready Active Reachable 20.10.6
jk3fylomxksvus1nmuai2f1ad swarm2 Ready Active 20.10.6
gmeyrsa08bs4du78ym60s1kmt swarm3 Ready Active 20.10.6
w43kyxy54egy9b6nl6mw6acyw * swarm4 Ready Active Leader 20.10.6
將swarm3 離開集群
[root@swarm3 ~]# docker swarm leave
Node left the swarm.
swarm3狀態變成了down
[root@swarm4 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
w9souqryc62xwcptuv3zs63cq swarm1 Ready Active Reachable 20.10.6
jk3fylomxksvus1nmuai2f1ad swarm2 Ready Active 20.10.6
gmeyrsa08bs4du78ym60s1kmt swarm3 Down Active 20.10.6
w43kyxy54egy9b6nl6mw6acyw * swarm4 Ready Active Leader 20.10.6
將swarm3也加入作為管理節點
[root@swarm3 ~]# docker swarm join --token SWMTKN-1-5n0et0tehpffvcvgwa7270nl2bo3onw9n4h44k92ynpyd58o9t-9uftr1s3e4mbvay8gsnea0
r7x 192.168.188.83:2377This node joined a swarm as a manager.
[root@swarm4 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
w9souqryc62xwcptuv3zs63cq swarm1 Ready Active Reachable 20.10.6
jk3fylomxksvus1nmuai2f1ad swarm2 Ready Active 20.10.6
gmeyrsa08bs4du78ym60s1kmt swarm3 Down Active 20.10.6
q3e1ffi6ouolqymbv4nnql62m swarm3 Ready Active Reachable 20.10.6
w43kyxy54egy9b6nl6mw6acyw * swarm4 Ready Active Leader 20.10.6
目前3臺機器設定為了管理節點
之前兩臺管理節點 掛一臺另一臺就不能使用了
但是現在有三臺管理節點,再來做一次測驗
停止第一臺
[root@swarm1 ~]# systemctl stop docker
Warning: Stopping docker.service, but it can still be activated by:
docker.socket
但是另外兩臺管理節點仍然可使用
[root@swarm3 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
w9souqryc62xwcptuv3zs63cq swarm1 Down Active Unreachable 20.10.6
jk3fylomxksvus1nmuai2f1ad swarm2 Ready Active 20.10.6
gmeyrsa08bs4du78ym60s1kmt swarm3 Down Active 20.10.6
q3e1ffi6ouolqymbv4nnql62m * swarm3 Ready Active Reachable 20.10.6
w43kyxy54egy9b6nl6mw6acyw swarm4 Ready Active Leader 20.10.6
[root@swarm4 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
w9souqryc62xwcptuv3zs63cq swarm1 Down Active Unreachable 20.10.6
jk3fylomxksvus1nmuai2f1ad swarm2 Ready Active 20.10.6
gmeyrsa08bs4du78ym60s1kmt swarm3 Down Active 20.10.6
q3e1ffi6ouolqymbv4nnql62m swarm3 Ready Active Reachable 20.10.6
w43kyxy54egy9b6nl6mw6acyw * swarm4 Ready Active Leader 20.10.6
-
因此集群要保證高可用,必須至少3個主節點,大于1臺管理節點存活
-
Raft協議:保證大多數節點存活,才可以使用,高可用!
集群里部署專案(擴縮容)
創建一個service
docker service
[root@swarm1 ~]# docker service create -p 8888:80 --name my-nginx nginx
rmb0sgq07hh72wq0zzeqm3iad
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
docker run 容器啟動 不具有擴縮容
docker service 服務!具有擴縮容 滾動更新
查看服務
docker service ls
[root@swarm1 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
rmb0sgq07hh7 my-nginx replicated 1/1 nginx:latest *:8888->80/tcp
[root@swarm1 ~]# docker service ps my-nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
vnnxrxob201n my-nginx.1 nginx:latest swarm2 Running Running about a minute ago
查看詳細資訊
docker service inspect my-nginx
副本是啟動在swarm2上
[root@swarm2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f50871234197 nginx:latest "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 80/tcp my-nginx.1.vnnxrxob201nsm0el
a9v54snr
動態擴縮容
[root@swarm1 ~]# docker service update --replicas 3 my-nginx
my-nginx
overall progress: 3 out of 3 tasks
1/3: running [==================================================>]
2/3: running [==================================================>]
3/3: running [==================================================>]
verify: Service converged

訪問四臺服務器的ip都可以訪問
注意:埠號需要在阿里云安全組放行
動態擴縮容 開啟10個服務
[root@swarm4 ~]# docker service update --replicas 10 my-nginx
my-nginx
overall progress: 10 out of 10 tasks
1/10: running [==================================================>]
2/10: running [==================================================>]
3/10: running [==================================================>]
4/10: running [==================================================>]
5/10: running [==================================================>]
6/10: running [==================================================>]
7/10: running [==================================================>]
8/10: running [==================================================>]
9/10: running [==================================================>]
10/10: running [==================================================>]
verify: Service converged
在每臺服務器上docker ps 查看容器,正好10個
不僅可以擴容 還可以縮小
docker service update --replicas 1 my-nginx
[root@swarm4 ~]# docker service update --replicas 1 my-nginx
my-nginx
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
還有一個命令 scale
scale 也是動態擴縮容 和update一樣
[root@swarm4 ~]# docker service scale my-nginx=5
my-nginx scaled to 5
overall progress: 5 out of 5 tasks
1/5: running [==================================================>]
2/5: running [==================================================>]
3/5: running [==================================================>]
4/5: running [==================================================>]
5/5: running [==================================================>]
verify: Service converged
[root@swarm4 ~]# docker service scale my-nginx=2
my-nginx scaled to 2
overall progress: 2 out of 2 tasks
1/2: running [==================================================>]
2/2: running [==================================================>]
verify: Service converged
移除服務
[root@swarm4 ~]# docker service rm my-nginx
my-nginx
[root@swarm4 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
概念總結
-
swarm
- 集群的管理和編排是使用嵌入docker引擎的SwarmKit,可用在docker初始化時啟動swarm模式或者加入已存在的swarm(作為管理、作業者)
-
Node
- 一個節點是docker引擎集群的一個實體,可以將其視為Docker節點,還可以在單個物理計算機或云服務器上運行一個或多個節點,但生產群集部署通常包括分布在多個物理和云計算機上的Docker節點,
- 要將應用程式部署到swarm,請將服務定義提交給管理器節點,管理器節點將稱為任務的作業單元分派給作業節點,
- Manager節點還執行維護所需群集狀態所需的編排和集群管理功能,Manager節點選擇單個領導者來執行編排任務,
- 作業節點接收并執行從管理器節點分派的任務,默認情況下,管理器節點還將服務作為作業節點運行,但您可以將它們配置為僅運行管理器任務并且是僅管理器節點,代理程式在每個作業程式球點上運行,并報告分配給它的任務,作業節點向管理器節點通知其分配的任務的當前狀態,以便管理器可以維持每個作業者的期望狀態,
-
Service
- 一個服務是任務的定義,管理機或作業節點上執行,它是群體系統的中心結構,是用戶與群體互動的主要根源,創建服務時,你需要指定要使用的容器鏡像
-
Task
- 任務是docker容器中執行的命令,Manager節點根據指定數量的任務副本分配任務給worker節點
-
docker swarm:集群管理,子命令有
init,join,leave,update(docker swarm --help 來查看幫助) -
docker service:子命令有
create,inspect,update,remove,tasks,(docker service --help 查看幫助) -
docker node:節點管理,子命令有
accept,promote,demote,inspect,update,tasks,ls,rm(docker node --help查看幫助)
Swarm的特點
- Docker Engine集成集群管理
使用Docker Engine CLl創建一個Docker Engine的Swarm模式,在集群中部署應用程式服務, - 去中心化設計
Swarm角色分為Manager和Worker節點,Manager節點故障不影回應用使用, - 擴容縮容
可以宣告每個服務運行的容器數量,通過添加或洗掉容器數自動調整期望的狀態, - 期望狀態協調
Swarm Manager節點不斷監視集群狀態,并調整當前狀態與期望狀態之間的差異,例如,設定一個服務運行10個副本容器,如果兩個副本的服務器節點崩潰,Manager將創建兩個新的副本替代崩潰的副本,并將新的副本分配到可用的worker節點, - 多主機網路
可以為服務指定overlay網路,當初始化或更新應用程式時,Swarm manager會自動為overlay網路上的容器分配IP地址, - 服務發現
Swarm manager節點為集群中的每個服務分配唯一的DNS記錄和負載均衡VIP,可以通過Swarm內置的DNS服務器查詢集群中每個運行的容器, - 負載均衡
實作服務副本負載均衡,提供入口訪問,也可以將服務入口暴露給外部負載均衡器再次負載均衡, - 安全傳輸
Swarm中的每個節點使用TLS相互驗證和加密,確保安全的其他節點通信, - 滾動更新
升級時,逐步將應用服務更新到節點,如果出現問題,可以將任務回滾到先前版本
服務副本與全域服務

調整service以什么方式運行
--mode string
Service mode (replicated or global) (default "replicated")
docker service create --mode replicated --name mytom tomcat:7 默認的
docker service create --mode global --name haha alpine ping baidu.com
# 場景 日志收集
每一個節點有自己的日志收集器,過濾,把所有日志最終再傳給日志中心
服務監控,狀態性能
[root@swarm4 ~]# docker service create -p 8888:80 --name my-nginx nginx
查看網路資訊
docker service inspect my-nginx
動態擴縮容
docker service scale my-nginx=5
再次查看網路
docker service inspect my-nginx
網路模式:"PublishMode":"ingress"
ingress: 特殊的Overlay網路,具有負載均衡的功能
docker network inspect ingress
雖然docker在4臺機器上,實際網路是同一個!ingress網路,是一個特殊的Overlay網路
網路變成了一個整體!
Docker Stack
-
docker-compose 是單機部署專案
-
Docker Stack部署 是集群部署
# 單機
docker-compose up -d wordpress.yml
# 集群
docker stack deploy wordpress.yml
# docker-compose 檔案
version: '3.4'
services:
mongo:
image: mongo
restart: always
networks:
- mongo_network
deploy:
restart_policy:
condition: on-failure
replicas: 2
mongo-express:
image: mongo-express
restart: always
networks:
- mongo_network
ports:
- target: 8081
published: 80
protocol: tcp
mode: ingress
environment:
ME_CONFIG_MONGODB_SERVER: mongo
ME_CONFIG_MONGODB_PORT: 27017
deploy:
restart_policy:
condition: on-failure
replicas: 1
networks:
mongo_network:
external: true
案例:
[root@DockerSwarm ~]# vim docker-compose.yml
version: "3"
services:
nginx:
image: nginx:alpine
ports:
- 80:80
deploy:
mode: replicated
replicas: 4
visualizer:
image: dockersamples/visualizer
ports:
- "8000:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
replicas: 1
placement:
constraints: [node.role == manager]
portainer:
image: portainer/portainer
ports:
- "9000:6000"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
replicas: 1
placement:
constraints: [node.role == manager]
[root@DockerSwarm ~]# docker stack deploy -c docker-compose.yml stack-demo
[root@DockerSwarm ~]# docker stack ls
NAME SERVICES ORCHESTRATOR
stack-demo 3 Swarm

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/281215.html
標籤:其他
