1. 程式人生 > >Docker學習筆記八:Swarm

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