Docker三劍客之docker-swarm

簡介

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 官網的這張圖片形象的展示了集群中管理節點與工作節點的關係。


Docker三劍客之docker-swarm


2、服務和任務

  • 任務 (Task)是 Swarm 中的最小的調度單位,目前來說就是一個單一的容器。
  • 服務 (Services) 是指一組任務的集合,服務定義了任務的屬性。服務有兩種模式:
  • replicated services 按照一定規則在各個工作節點上運行指定個數的任務。
  • global services 每個工作節點上運行一個任務

兩種模式通過 docker service create 的 –mode 參數指定。

來自 Docker 官網的這張圖片形象的展示了容器、任務、服務的關係。


Docker三劍客之docker-swarm


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     
leave          

update

unlock

docker node:節點管理, demote inspect ls promote rm ps

update

docker service:服務管理,

create

inspect ps ls rm scale

update

/<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 -p 

9000

:

9000

-v /

var

/run/docker.sock:/

var

/run/docker.sock portainer/portainer /<code>

瀏覽器訪問


Docker三劍客之docker-swarm


docker-swarm佈署服務

1、佈署服務前創建於個用於集群內不同主機之間容器通信的網絡

<code>$ docker network 

create

-d overlay dockernet

5

lhuzjkx36j40na59gmu400op /<code>

2、創建服務(nginx為例)

<code>$docker service 

create

klpwtncehp0vkh0d1gqqvicf6 $docker service ls

ID

NAME

MODE

REPLICAS IMAGE PORTS klpwtncehp0v nginx-cluster replicated

1

/

1

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

53

seconds

ago $ docker ps

CONTAINER

ID

IMAGE COMMAND CREATED

STATUS

PORTS

NAMES

9

a2e361f535b nginx:latest

"nginx -g 'daemon of…"

About a

minute

ago Up About a

minute

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       replicated          

5

/

5

nginx:

latest *

:

80

->

80

/tcp $ docker service update --replicas

2

nginx-cluster nginx-cluster $ docker service ls ID NAME MODE REPLICAS IMAGE PORTS klpwtncehp0v nginx-cluster replicated

2

/

2

nginx:

latest *

:

80

->

80

/tcp $ docker service update --image

nginx:

new nginx-cluster $ docker rm nginx-cluster /<code>

參考地址鏈接:

  • 容器技術|Docker三劍客之docker-swarm
  • Docker入門到實踐-Swarm


分享到:


相關文章: