簡介
Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干臺Docker主機抽象為一個整體,並且通過一個入口統一管理這些Docker主機上的各種Docker資源。Swarm和Kubernetes比較類似,但是更加輕,具有的功能也較kubernetes更少一些。
swarm集群提供給用戶管理集群內所有容器的操作接口與使用一臺Docker主機基本相同。
Swarm一些概念說明
1、節點
運行 Docker 的主機可以主動初始化一個 Swarm 集群或者加入一個已存在的 Swarm 集群,這樣這個運行 Docker 的主機就成為一個 Swarm 集群的節點 (node) 。
節點分為管理 (manager) 節點和工作 (worker) 節點。
管理節點用於 Swarm 集群的管理,docker swarm 命令基本只能在管理節點執行(節點退出集群命令 docker swarm leave 可以在工作節點執行)。一個 Swarm 集群可以有多個管理節點,但只有一個管理節點可以成為 leader,leader 通過 raft 協議實現。
工作節點是任務執行節點,管理節點將服務 (service) 下發至工作節點執行。管理節點默認也作為工作節點。你也可以通過配置讓服務只運行在管理節點。
來自 Docker 官網的這張圖片形象的展示了集群中管理節點與工作節點的關係。
2、服務和任務
- 任務 (Task)是 Swarm 中的最小的調度單位,目前來說就是一個單一的容器。
- 服務 (Services) 是指一組任務的集合,服務定義了任務的屬性。服務有兩種模式:
- replicated services 按照一定規則在各個工作節點上運行指定個數的任務。
- global services 每個工作節點上運行一個任務
兩種模式通過 docker service create 的 –mode 參數指定。
來自 Docker 官網的這張圖片形象的展示了容器、任務、服務的關係。
Swarm 調度策略
Swarm在scheduler節點(leader 節點)運行容器的時候,會根據指定的策略來計算最適合運行容器的節點,目前支持的策略有:spread, binpack, random.
1)Random
顧名思義,就是隨機選擇一個 Node 來運行容器,一般用作調試用,spread 和 binpack 策略會根據各個節點的可用的 CPU, RAM 以及正在運行的容器的數量來計算應該運行容器的節點。
2)Spread
在同等條件下,Spread 策略會選擇運行容器最少的那臺節點來運行新的容器,binpack 策略會選擇運行容器最集中的那臺機器來運行新的節點。使用 Spread 策略會使得容器會均衡的分佈在集群中的各個節點上運行,一旦一個節點掛掉了只會損失少部分的容器。
3)Binpack
Binpack 策略最大化的避免容器碎片化,就是說 binpack 策略儘可能的把還未使用的節點留給需要更大空間的容器運行,儘可能的把容器運行在一個節點上面。
Swarm命令行說明
<code>docker swarm:集群管理 init join join-token leaveupdate
unlock
docker node:節點管理, demote inspect ls promote rm psupdate
docker service:服務管理,create
inspect ps ls rm scaleupdate
/<code>
安裝佈署swarm集群服務
- manager:192.168.124.129
- node:192.168.124.132
1、修改主機名,配置hosts文件
<code>[root@manager
~]#
cat
>>/etc/hosts
192.168
.124
.129
manager
192.168
.124
.132
node1
EOF
[root@manager
~]#
tail
-3
/etc/hosts
192.168
.124
.129
manager
192.168
.124
.132
node1
/<code>
2、配置docker
編輯docker文件:
/usr/lib/systemd/system/docker.service
<code>vim
/usr/lib/systemd/system/docker.service /<code>
修改ExecStart行為下面內容
<code>ExecStart=/usr/bin
/dockerd -H tcp:/
/0.0.0.0:2375 -H unix:/
/var/run
/docker.sock \
/<code>
重新加載docker配置
<code>systemctl daemon-reload systemctl restart docker /<code>
所有節點加上上面標記的部分,開啟2375端口
3、所有節點下載swarm鏡像文件
<code>$ docker pull swarm /<code>
4、創建swarm並初始化
<code>$
docker
swarm
init
--advertise-addr
192.168
.124
.129
Swarm initialized:
current
node
(4c70fdpk3ip083rg7nnuk5stw)
is
now
a
manager.
To
add
a
worker
to
this
swarm,
run the following command:
docker
swarm
join
--token
SWMTKN-1-5jubbodkfxlp96pg2w9sihqdvtruhkdje3bls1nb9ujiig0t3n-1d9l7t4bssnglbuemx9v06r3x
192.168
.124
.129
:2377
To
add
a
manager
to
this
swarm,
run
'docker swarm join-token manager'
and
follow
the
instructions.
/<code>
5、將node1加入到集群中
在node1下執行
<code>$
docker
swarm
join
--token
SWMTKN-1-5jubbodkfxlp96pg2w9sihqdvtruhkdje3bls1nb9ujiig0t3n-1d9l7t4bssnglbuemx9v06r3x
192.168
.124
.129
:2377
This
node
joined
a
swarm
as
a
worker.
/<code>
6、管理節點查看集群節點狀態
<code>$
docker
node
ls
ID
HOSTNAME
STATUS
AVAILABILITY
MANAGER
STATUS
ENGINE
VERSION
4c70fdpk3ip083rg7nnuk5stw
*
manager
Ready
Active
Leader
18.09
.0
5viloj6u950gkilsl689aonyn
node1
Ready
Active
Reachable
18.09
.0
/<code>
7、Swarm 的Web管理
<code>$ docker run -d -p9000
:9000
-v /var
/run/docker.sock:/var
/run/docker.sock portainer/portainer /<code>
瀏覽器訪問
docker-swarm佈署服務
1、佈署服務前創建於個用於集群內不同主機之間容器通信的網絡
<code>$ docker networkcreate
-d overlay dockernet5
lhuzjkx36j40na59gmu400op /<code>
2、創建服務(nginx為例)
<code>$docker servicecreate
klpwtncehp0vkh0d1gqqvicf6 $docker service lsID
NAME
MODE
REPLICAS IMAGE PORTS klpwtncehp0v nginx-cluster replicated1
/1
nginx:latest *:80
->80
/tcp $ docker service ps nginx-clusterID
NAME
IMAGE NODE DESIRED STATECURRENT
STATEERROR
PORTS j1y2blg3pa7j nginx-cluster.1
nginx:latest manager Running Running53
seconds
ago $ docker psCONTAINER
ID
IMAGE COMMAND CREATEDSTATUS
PORTSNAMES
9
a2e361f535b nginx:latest"nginx -g 'daemon of…"
About aminute
ago Up About aminute
80
/tcp nginx-cluster.1
.j1y2blg3pa7j9mtg54e2csr7f /<code>
3、在線動態擴容服務
<code>docker
service scale nginx-cluster=5
scaled to 5
docker service ls
ID
NAME MODE REPLICAS IMAGE PORTS
klpwtncehp0v
nginx-cluster replicated 5/5 nginx:latest *:80->80/tcp
docker service ps nginx-cluster
ID
NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
j1y2blg3pa7j
nginx-cluster.1 nginx:latest manager Running Running 3 minutes ago
y5ib98y3rr5i
nginx-cluster.2 nginx:latest node1 Running Running 35 seconds ago
wpiydfv0j2w5
nginx-cluster.3 nginx:latest node1 Running Running 35 seconds ago
ibl73haatpvc
nginx-cluster.4 nginx:latest manager Running Running about a minute ago
a6oa1h83ba3c
nginx-cluster.5 nginx:latest node1 Running Running 35 seconds ago
/<code>
4、節點故障
<code>docker service ps nginx-cluster
ID
NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
j1y2blg3pa7j
nginx-cluster.1 nginx:latest manager Running Running 45 minutes ago
ugx002mtbfmp
nginx-cluster.2 nginx:latest manager Running Running 7 seconds ago
y5ib98y3rr5i
\_ nginx-cluster.2 nginx:latest node1 Shutdown Shutdown 11 seconds ago
q1f5jhhx7kcy
nginx-cluster.3 nginx:latest manager Running Running 7 seconds ago
wpiydfv0j2w5
\_ nginx-cluster.3 nginx:latest node1 Shutdown Shutdown 11 seconds ago
ibl73haatpvc
nginx-cluster.4 nginx:latest manager Running Running 43 minutes ago
a6f7zpclrpm4
nginx-cluster.5 nginx:latest manager Running Running 7 seconds ago
a6oa1h83ba3c
\_ nginx-cluster.5 nginx:latest node1 Shutdown Shutdown 11 seconds ago
/<code>
5、其它常用命令介紹
<code>$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS klpwtncehp0v nginx-cluster replicated5
/5
nginx:
latest *:
80
->80
/tcp $ docker service update --replicas2
nginx-cluster nginx-cluster $ docker service ls ID NAME MODE REPLICAS IMAGE PORTS klpwtncehp0v nginx-cluster replicated2
/2
nginx:
latest *:
80
->80
/tcp $ docker service update --imagenginx:
new nginx-cluster $ docker rm nginx-cluster /<code>
參考地址鏈接:
- 容器技術|Docker三劍客之docker-swarm
- Docker入門到實踐-Swarm