Docker學習筆記八:Swarm
建立一個swarm
1、登入管理節點manager1
執行如下命令建立一個新的swarm:
$ docker swarm init --advertise-addr 192.168.99.100
Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
192.168.99.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
2、執行檢視swarm的當前狀態:
$ docker info
Containers: 2
Running: 0
Paused: 0
Stopped: 2
...snip...
Swarm: active
NodeID: dxn1zf6l61qsb1josjja83ngz
Is Manager: true
Managers: 1
Nodes: 1
...snip...
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
3、執行docker node ls
檢視節點資訊:
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
dxn1zf6l61qsb1josjja83ngz * manager1 Ready Active Leader
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
節點ID旁邊的*表示當前連線在此節點上。
向swarm新增節點
1、登入想要執行工作節點的機器worker1
$ docker swarm join \
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
192.168.99.100:2377
This node joined a swarm as a worker.
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
此命令出現在建立swarm時執行的docker swarm init...
的輸出中,如果忘記此命令,可以在管理節點上執行一下命令:
$ docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
192.168.99.100:2377
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
2、依次新增worker2
主機,在管理節點檢視新增的節點:
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
03g1y59jwfg7cf99w4lt0f662 worker2 Ready Active
9j68exjopxe7wfl6yuxml7a7j worker1 Ready Active
dxn1zf6l61qsb1josjja83ngz * manager1 Ready Active Leader
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
Swarm的管理類命令像docker node ls
只能在管理節點上執行。
向swarm部署一個服務
1、登入管理節點manager1
,執行以下命令:
$ docker service create --replicas 1 --name helloworld alpine ping docker.com
9uk4639qpg7npwf3fn2aasksr
- 1
- 2
- 3
- 1
- 2
- 3
docker service create
命令建立一個服務--name
標識服務名為helloworld
--replicas
指定執行服務的數量- 引數
alpine ping docker.com
將服務定義Alpine Linux
容器執行命令ping docker.com
2、執行docker service ls
檢視執行的服務列表:
$ docker service ls
ID NAME SCALE IMAGE COMMAND
9uk4639qpg7n helloworld 1/1 alpine ping docker.com
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
檢查swarm的服務
1、登入管理節點manager1
,執行docker
service inspect --pretty <SERVICE-ID>
以簡單易讀的格式顯示服務的詳情:
$ docker service inspect --pretty helloworld
ID: 9uk4639qpg7npwf3fn2aasksr
Name: helloworld
Mode: REPLICATED
Replicas: 1
Placement:
UpdateConfig:
Parallelism: 1
ContainerSpec:
Image: alpine
Args: ping docker.com
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
執行不帶--pretty
的命令返回json格式的服務的詳情:
$ docker service inspect helloworld
[
{
"ID": "9uk4639qpg7npwf3fn2aasksr",
"Version": {
"Index": 418
},
"CreatedAt": "2016-06-16T21:57:11.622222327Z",
"UpdatedAt": "2016-06-16T21:57:11.622222327Z",
"Spec": {
"Name": "helloworld",
"TaskTemplate": {
"ContainerSpec": {
"Image": "alpine",
"Args": [
"ping",
"docker.com"
]
},
"Resources": {
"Limits": {},
"Reservations": {}
},
"RestartPolicy": {
"Condition": "any",
"MaxAttempts": 0
},
"Placement": {}
},
"Mode": {
"Replicated": {
"Replicas": 1
}
},
"UpdateConfig": {
"Parallelism": 1
},
"EndpointSpec": {
"Mode": "vip"
}
},
"Endpoint": {
"Spec": {}
}
}
]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
2、執行docker service ps <SERVICE-ID>
檢視哪個節點在執行服務:
$ docker service ps helloworld
ID NAME SERVICE IMAGE LAST STATE DESIRED STATE NODE
8p1vev3fq5zm0mi8g0as41w35 helloworld.1 helloworld alpine Running 3 minutes Running worker2
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
預設情況下,swarm中的節點可以像工作節點一樣執行任務。
3、在執行任務的節點上執行docker ps
命令檢視有關該任務的容器的詳細資訊:
$docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e609dde94e47 alpine:latest "ping docker.com" 3 minutes ago Up 3 minutes helloworld.1.8p1vev3fq5zm0mi8g0as41w35
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
在swarm中縮放服務
1、登入管理節點,執行docker service scale <SERVICE-ID>=<NUMBER-OF-TASKS>
改變在swarm中期望服務的執行的狀態:
$ docker service scale helloworld=5
helloworld scaled to 5
- 1
- 2
- 3
- 1
- 2
- 3
2、執行docker service ps <SERVICE-ID>
命令檢視更新的任務列表:
$ docker service ps helloworld
ID NAME SERVICE IMAGE LAST STATE DESIRED STATE NODE
8p1vev3fq5zm0mi8g0as41w35 helloworld.1 helloworld alpine Running 7 minutes Running worker2
c7a7tcdq5s0uk3qr88mf8xco6 helloworld.2 helloworld alpine Running 24 seconds Running worker1
6crl09vdcalvtfehfh69ogfb1 helloworld.3 helloworld alpine Running 24 seconds Running worker1
auky6trawmdlcne8ad8phb0f1 helloworld.4 helloworld alpine Running 24 seconds Accepted manager1
ba19kca06l18zujfwxyc5lkyn helloworld.5 helloworld alpine Running 24 seconds Running worker2
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
刪除在swarm中執行的服務
1、登入管理節點,執行以下命令刪除服務:
$ docker service rm helloworld
helloworld
- 1
- 2
- 3
- 1
- 2
- 3
2、執行docker service inpect <SERVICE-ID>
命令驗證swarm管理員刪除了服務。終端返回服務沒有找到的訊息:
$ docker service inspect helloworld
[]
Error: no such service: helloworld
- 1
- 2
- 3
- 1
- 2
- 3
將滾動更新應用於服務
1、在swarm中部署Redis 3.0.6,並配置swarm延遲10秒更新(即UpdateConfig):
$ docker service create \
--replicas 3 \
--name redis \
--update-delay 10s \
redis:3.0.6
0u6a4s31ybk7yw2wyvtikmu50
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- –update-delay 更新一個服務任務或者任務集合的延遲時間,
10m30s
意味著十分鐘三十秒的延遲 - 預設排程器一次更新一個任務,可以通過
--update-parallelism
標識配置並行更新的最大數量 - 默人,當對單個任務的更新返回
RUNNING
狀態時,排程程式會排程另外一個任務進行更行,直到所有任務都更新。如果在更新期間的任何事件返回FAILED,則排程程式停止更新。可以通過使用--update-failure-action
標識控制docker建立服務或者docker更新服務的行為。
2、檢測redis
服務:
$ docker service inspect --pretty redis
ID: 0u6a4s31ybk7yw2wyvtikmu50
Name: redis
Mode: Replicated
Replicas: 3
Placement:
Strategy: Spread
UpdateConfig:
Parallelism: 1
Delay: 10s
ContainerSpec:
Image: redis:3.0.6
Resources:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
3、更新redis
的容器映象,swarm管理器會通過UpdateConfig
策略實施更新:
$ docker service update --image redis:3.0.7 redis
redis
- 1
- 2
- 1
- 2
排程程式預設按照如下過程應用滾動更新:
- 停止第一個任務
- 為停止的任務排程更新
- 為更新後的任務啟動容器
- 如果任務的更新返回RUNNING,等待指定的延遲時間間隔,然後停止下一個任務
- 如果在更新過程中的任何時間,一個任務返回FAILED,暫停更新
4、執行docker service inspect --pretty redis
檢視期望狀態下的新映象:
$ docker service inspect --pretty redis
ID: 0u6a4s31ybk7yw2wyvtikmu50
Name: redis
Mode: Replicated
Replicas: 3
Placement:
Strategy: Spread
UpdateConfig:
Parallelism: 1
Delay: 10s
ContainerSpec:
Image: redis:3.0.7
Resources:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
如果因為失敗導致更新暫停,service inspect
顯示如下輸出:
$ docker service inspect --pretty redis
ID: 0u6a4s31ybk7yw2wyvtikmu50
Name: redis
...snip...
Update status:
State: paused
Started: 11 seconds ago
Message: update paused due to failure or early termination of task 9p7ith557h8ndf0ui9s0q951b
...snip...
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
要重啟暫停的更新,執行docker service update <SERVICE-ID>
,例如:
docker service update redis
- 1
- 1
為了避免重複某些更新失敗,可能需要向docker service update
傳遞標識重新配置服務
6、執行docker service ps <SERVICE-ID>
檢視滾動更新:
$ docker service ps redis
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
dos1zffgeofhagnve8w864fco redis.1 redis:3.0.7 worker1 Running Running 37 seconds
88rdo6pa52ki8oqx6dogf04fh \_ redis.1 redis:3.0.6 worker2 Shutdown Shutdown 56 seconds ago
9l3i4j85517skba5o7tn5m8g0 redis.2 redis:3.0.7 worker2 Running Running About a minute
66k185wilg8ele7ntu8f6nj6i \_ redis.2 redis:3.0.6 worker1 Shutdown Shutdown 2 minutes ago
egiuiqpzrdbxks3wxgn8qib1g redis.3 redis:3.0.7 worker1 Running Running 48 seconds
ctzktfddb2tepkr45qcmqln04 \_ redis.3 redis:3.0.6 mmanager1 Shutdown Shutdown 2 minutes ago
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
在swarm上架空(DRAIN)一個節點
將節點設定為DRAIN
可以防止節點從swarm管理器接收新的任務,也意味著管理器停止執行在這個節點的任務,並在一個ACTIVE
的節點上覆制一個任務。
1、登入管理伺服器manager1
,檢視所有的節點為啟用的狀態:
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
1bcef6utixb0l0ca7gxuivsj0 worker2 Ready Active
38ciaotwjuritcdtn9npbnkuz worker1 Ready Active
e216jshn25ckzbvmwlnh5jr3g * manager1 Ready Active Leader
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
2、執行docker node update --availability drain <NODE-ID>
以排空已分配任務節點的任務:
docker node update --availability drain worker1
worker1
- 1
- 2
- 3
- 1
- 2
- 3
3、檢查節點的可用性:
$ docker node inspect --pretty worker1
ID: 38ciaotwjuritcdtn9npbnkuz
Hostname: worker1
Status:
State: Ready
Availability: Drain
...snip...
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
4、執行docker service ps redis
檢視swarm管理器如何更新redis服務的任務分配:
$ docker service ps redis
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
7q92v0nr1hcgts2amcjyqg3pq redis.1 redis:3.0.6 manager1 Running Running 4 minutes
b4hovzed7id8irg1to42egue8 redis.2 redis:3.0.6 worker2 Running Running About a minute
7h2l8h3q3wqy5f66hlv9ddmi6 \_ redis.2 redis:3.0.6 worker1 Shutdown Shutdown 2 minutes ago
9bg7cezvedmkgg6c8yzvbhwsd redis.3 redis:3.0.6 worker2 Running Running 4 minutes
- 1
- 2