Docker学习笔记八:Swarm

来源:互联网 发布:单片机系统可靠性 编辑:程序博客网 时间:2024/06/08 12:39

创建一个swarm

1、登录管理节点manager1执行如下命令创建一个新的swarm:

$ docker swarm init --advertise-addr 192.168.99.100Swarm 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:2377To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

2、执行docker state查看swarm的当前状态:

$ docker infoContainers: 2Running: 0Paused: 0Stopped: 2  ...snip...Swarm: active  NodeID: dxn1zf6l61qsb1josjja83ngz  Is Manager: true  Managers: 1  Nodes: 1  ...snip...

3、执行docker node ls查看节点信息:

$ docker node lsID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUSdxn1zf6l61qsb1josjja83ngz *  manager1  Ready   Active        Leader

节点ID旁边的*表示当前连接在此节点上。

向swarm添加节点

1、登录想要运行工作节点的机器worker1,执行如下命令:

$ docker swarm join \  --token  SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \  192.168.99.100:2377This node joined a swarm as a worker.

此命令出现在创建swarm时执行的docker swarm init...的输出中,如果忘记此命令,可以在管理节点上执行一下命令:

$ docker swarm join-token workerTo add a worker to this swarm, run the following command:    docker swarm join \    --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \    192.168.99.100:2377

2、依次添加worker2主机,在管理节点查看添加的节点:

$ docker node lsID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS03g1y59jwfg7cf99w4lt0f662    worker2   Ready   Active9j68exjopxe7wfl6yuxml7a7j    worker1   Ready   Activedxn1zf6l61qsb1josjja83ngz *  manager1  Ready   Active        Leader

Swarm的管理类命令像docker node ls只能在管理节点上执行。

向swarm部署一个服务

1、登录管理节点manager1,执行以下命令:

$ docker service create --replicas 1 --name helloworld alpine ping docker.com9uk4639qpg7npwf3fn2aasksr
  • docker service create命令创建一个服务
  • --name标识服务名为helloworld
  • --replicas指定运行服务的数量
  • 参数alpine ping docker.com将服务定义Alpine Linux容器执行命令ping docker.com

2、运行docker service ls查看运行的服务列表:

$ docker service lsID            NAME        SCALE  IMAGE   COMMAND9uk4639qpg7n  helloworld  1/1    alpine  ping docker.com

检查swarm的服务

1、登录管理节点manager1,执行docker service inspect --pretty <SERVICE-ID>以简单易读的格式显示服务的详情:

$ docker service inspect --pretty helloworldID:     9uk4639qpg7npwf3fn2aasksrName:       helloworldMode:       REPLICATED Replicas:      1Placement:UpdateConfig: Parallelism:   1ContainerSpec: Image:     alpine Args:  ping docker.com

执行不带--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": {}    }}]

2、执行docker service ps <SERVICE-ID>查看哪个节点在运行服务:

$ docker service ps helloworldID                         NAME          SERVICE     IMAGE   LAST STATE         DESIRED STATE  NODE8p1vev3fq5zm0mi8g0as41w35  helloworld.1  helloworld  alpine  Running 3 minutes  Running        worker2

默认情况下,swarm中的节点可以像工作节点一样执行任务。

3、在运行任务的节点上执行docker ps命令查看有关该任务的容器的详细信息:

$docker psCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMESe609dde94e47        alpine:latest       "ping docker.com"   3 minutes ago       Up 3 minutes                            helloworld.1.8p1vev3fq5zm0mi8g0as41w35

在swarm中缩放服务

1、登录管理节点,执行docker service scale <SERVICE-ID>=<NUMBER-OF-TASKS>改变在swarm中期望服务的运行的状态:

$ docker service scale helloworld=5helloworld scaled to 5

2、执行docker service ps <SERVICE-ID>命令查看更新的任务列表:

$ docker service ps helloworldID                         NAME          SERVICE     IMAGE   LAST STATE          DESIRED STATE  NODE8p1vev3fq5zm0mi8g0as41w35  helloworld.1  helloworld  alpine  Running 7 minutes   Running        worker2c7a7tcdq5s0uk3qr88mf8xco6  helloworld.2  helloworld  alpine  Running 24 seconds  Running        worker16crl09vdcalvtfehfh69ogfb1  helloworld.3  helloworld  alpine  Running 24 seconds  Running        worker1auky6trawmdlcne8ad8phb0f1  helloworld.4  helloworld  alpine  Running 24 seconds  Accepted       manager1ba19kca06l18zujfwxyc5lkyn  helloworld.5  helloworld  alpine  Running 24 seconds  Running        worker2

删除在swarm中运行的服务

1、登录管理节点,执行以下命令删除服务:

$ docker service rm helloworldhelloworld

2、执行docker service inpect <SERVICE-ID>命令验证swarm管理员删除了服务。终端返回服务没有找到的消息:

$ docker service inspect helloworld[]Error: no such service: helloworld

将滚动更新应用于服务

1、在swarm中部署Redis 3.0.6,并配置swarm延迟10秒更新(即UpdateConfig):

$ docker service create \  --replicas 3 \  --name redis \  --update-delay 10s \  redis:3.0.60u6a4s31ybk7yw2wyvtikmu50
  • –update-delay 更新一个服务任务或者任务集合的延迟时间,10m30s意味着十分钟三十秒的延迟
  • 默认调度器一次更新一个任务,可以通过--update-parallelism标识配置并行更新的最大数量
  • 默人,当对单个任务的更新返回RUNNING状态时,调度程序会调度另外一个任务进行更行,直到所有任务都更新。如果在更新期间的任何事件返回FAILED,则调度程序停止更新。可以通过使用--update-failure-action标识控制docker创建服务或者docker更新服务的行为。

2、检测redis服务:

$ docker service inspect --pretty redisID:             0u6a4s31ybk7yw2wyvtikmu50Name:           redisMode:           Replicated Replicas:      3Placement: Strategy:      SpreadUpdateConfig: Parallelism:   1 Delay:         10sContainerSpec: Image:         redis:3.0.6Resources:

3、更新redis的容器镜像,swarm管理器会通过UpdateConfig策略实施更新:

$ docker service update --image redis:3.0.7 redisredis

调度程序默认按照如下过程应用滚动更新:

  • 停止第一个任务
  • 为停止的任务调度更新
  • 为更新后的任务启动容器
  • 如果任务的更新返回RUNNING,等待指定的延迟时间间隔,然后停止下一个任务
  • 如果在更新过程中的任何时间,一个任务返回FAILED,暂停更新

4、运行docker service inspect --pretty redis查看期望状态下的新镜像:

$ docker service inspect --pretty redisID:             0u6a4s31ybk7yw2wyvtikmu50Name:           redisMode:           Replicated Replicas:      3Placement: Strategy:      SpreadUpdateConfig: Parallelism:   1 Delay:         10sContainerSpec: Image:         redis:3.0.7Resources:

如果因为失败导致更新暂停,service inspect显示如下输出:

$ docker service inspect --pretty redisID:             0u6a4s31ybk7yw2wyvtikmu50Name:           redis...snip...Update status: State:      paused Started:    11 seconds ago Message:    update paused due to failure or early termination of task 9p7ith557h8ndf0ui9s0q951b...snip...

要重启暂停的更新,运行docker service update <SERVICE-ID>,例如:

docker service update redis

为了避免重复某些更新失败,可能需要向docker service update传递标识重新配置服务

6、运行docker service ps <SERVICE-ID>查看滚动更新:

$ docker service ps redisID                         NAME         IMAGE        NODE       DESIRED STATE  CURRENT STATE            ERRORdos1zffgeofhagnve8w864fco  redis.1      redis:3.0.7  worker1    Running        Running 37 seconds88rdo6pa52ki8oqx6dogf04fh   \_ redis.1  redis:3.0.6  worker2    Shutdown       Shutdown 56 seconds ago9l3i4j85517skba5o7tn5m8g0  redis.2      redis:3.0.7  worker2    Running        Running About a minute66k185wilg8ele7ntu8f6nj6i   \_ redis.2  redis:3.0.6  worker1    Shutdown       Shutdown 2 minutes agoegiuiqpzrdbxks3wxgn8qib1g  redis.3      redis:3.0.7  worker1    Running        Running 48 secondsctzktfddb2tepkr45qcmqln04   \_ redis.3  redis:3.0.6  mmanager1  Shutdown       Shutdown 2 minutes ago

在swarm上架空(DRAIN)一个节点

将节点设置为DRAIN可以防止节点从swarm管理器接收新的任务,也意味着管理器停止运行在这个节点的任务,并在一个ACTIVE的节点上复制一个任务。

1、登录管理服务器manager1,查看所有的节点为激活的状态:

$ docker node lsID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS1bcef6utixb0l0ca7gxuivsj0    worker2   Ready   Active38ciaotwjuritcdtn9npbnkuz    worker1   Ready   Activee216jshn25ckzbvmwlnh5jr3g *  manager1  Ready   Active        Leader

2、运行docker node update --availability drain <NODE-ID>以排空已分配任务节点的任务:

docker node update --availability drain worker1worker1

3、检查节点的可用性:

$ docker node inspect --pretty worker1ID:         38ciaotwjuritcdtn9npbnkuzHostname:       worker1Status: State:         Ready Availability:      Drain...snip...

4、运行docker service ps redis查看swarm管理器如何更新redis服务的任务分配:

$ docker service ps redisID                         NAME          IMAGE        NODE      DESIRED STATE  CURRENT STATE           ERROR7q92v0nr1hcgts2amcjyqg3pq  redis.1       redis:3.0.6  manager1  Running        Running 4 minutesb4hovzed7id8irg1to42egue8  redis.2       redis:3.0.6  worker2   Running        Running About a minute7h2l8h3q3wqy5f66hlv9ddmi6   \_ redis.2   redis:3.0.6  worker1   Shutdown       Shutdown 2 minutes ago9bg7cezvedmkgg6c8yzvbhwsd  redis.3       redis:3.0.6  worker2   Running        Running 4 minutes

5、运行docker node update --availability active <NODE-ID>将架空的节点返回到激活状态:

$ docker node update --availability active worker1worker1

6、检查节点,查看更新后的状态:

$ docker node inspect --pretty worker1ID:         38ciaotwjuritcdtn9npbnkuzHostname:       worker1Status:State:          ReadyAvailability:       Active...snip...

当节点回到激活状态,它可以接收新的任务:

  • 在一个服务扩展期间
  • 滚动更新期间
  • 将另外一个节点设置成Drain可用性
  • 当一个任务在另外的节点失败
0 0
原创粉丝点击