管理swarm(10) – swarm实践 – 滚动更新服务

在上一篇文章中你更新了服务的实例数。在本文中,我们尝试部署一个Redis 3.0.6的容器服务。然后使用滚动更新把它升级到Redis 3.0.7。
1.登录manger1机器。
2.部署Redis 3.0.6到swarm和配置swarm为10秒更新延迟:

  1. $ docker service create
  2.   –replicas 3
  3.   –name redis
  4.   –update-delay 10s
  5.   redis:3.0.6
  6.  
  7. 0u6a4s31ybk7yw2wyvtikmu50

在服务部署时你配置了滚动更新策略。
–update-delay参数配置更新服务任务之间的延迟时间或一组任务之间的延迟时间。你可以以秒s,分m,时h单位来配置延迟时间。所以10m30s表示10分钟30秒的延迟。
默认情况下,调度程序一次执行一个更新任务。你可以传递–update-parallelism参数来配置调度程序同时执行的最大更新服务任务数。
默认情况下,当单个更新任务返回RUNNING的状态时,调度器调度继续其它任务直到所有任务更新完成。如果在更新任务期间的任何时候一个任务返回FAILED,调度器暂停更新。你可以在docker service create或docker service update时使用–update-failure-action来控制其行为。
3.查看redis服务:

  1. $ docker service inspect –pretty redis
  2.  
  3. ID:             0u6a4s31ybk7yw2wyvtikmu50
  4. Name:           redis
  5. Mode:           Replicated
  6.  Replicas:      3
  7. Placement:
  8.  Strategy:      Spread
  9. UpdateConfig:
  10.  Parallelism:   1
  11.  Delay:         10s
  12. ContainerSpec:
  13.  Image:         redis:3.0.6
  14. Resources:

4.现在开始更新redis容器。swarm管理器根据UpdateConfig策略来对节点应用更新:

  1. $ docker service update –image redis:3.0.7 redis
  2. redis

默认情况下调度器应用滚动更新的步骤如下:

  • 停止第一个任务。
  • 对已停止的任务执行更新。
  • 启动已经完成更新的容器。
  • 如果更新任务返回RUNNING,等待一个指定的延迟然后停止下一个任务。
  • 如果在任何时候任务返回FAIlED,停止更新。
  • 5.执行docker service inspect –pretty redis命令来查看当前状态:

    1. $ docker service inspect –pretty redis
    2.  
    3. ID:             0u6a4s31ybk7yw2wyvtikmu50
    4. Name:           redis
    5. Mode:           Replicated
    6.  Replicas:      3
    7. Placement:
    8.  Strategy:      Spread
    9. UpdateConfig:
    10.  Parallelism:   1
    11.  Delay:         10s
    12. ContainerSpec:
    13.  Image:         redis:3.0.7
    14. Resources:

    如果更新暂时,下面是service inspect的输出:

    1. $ docker service inspect –pretty redis
    2.  
    3. ID:             0u6a4s31ybk7yw2wyvtikmu50
    4. Name:           redis
    5. …snip…
    6. Update status:
    7.  State:      paused
    8.  Started:    11 seconds ago
    9.  Message:    update paused due to failure or early termination of task 9p7ith557h8ndf0ui9s0q951b
    10. …snip…

    执行docker service update 命令来重启已暂停的更新,例如:

    1. docker service update redis

    6.执行docker service ps 来查看滚动更新:

    1. $ docker service ps redis
    2.  
    3. ID                         NAME         IMAGE        NODE       DESIRED STATE  CURRENT STATE            ERROR
    4. dos1zffgeofhagnve8w864fco  redis.1      redis:3.0.7  worker1    Running        Running 37 seconds
    5. 88rdo6pa52ki8oqx6dogf04fh   _ redis.1  redis:3.0.6  worker2    Shutdown       Shutdown 56 seconds ago
    6. 9l3i4j85517skba5o7tn5m8g0  redis.2      redis:3.0.7  worker2    Running        Running About a minute
    7. 66k185wilg8ele7ntu8f6nj6i   _ redis.2  redis:3.0.6  worker1    Shutdown       Shutdown 2 minutes ago
    8. egiuiqpzrdbxks3wxgn8qib1g  redis.3      redis:3.0.7  worker1    Running        Running 48 seconds
    9. ctzktfddb2tepkr45qcmqln04   _ redis.3  redis:3.0.6  mmanager1  Shutdown       Shutdown 2 minutes ago

    在swarm更新完所有的任务前,你会看到有些节点运行着redis:3.0.6,而有些运行redis:3.0.7。

    管理swarm(9) – swarm实践 – 删除服务

    1.登录manager1机器。
    2.执行docker service rm helloworld来删除helloworld服务。

    1. $ docker service rm helloworld
    2.  
    3. helloworld

    3.执行docker service inspect 命令来验证swarm管理器是否已经把服务删除了。CLI会返回提示服务不存在:

    1. $ docker service inspect helloworld
    2. []
    3. Error: no such service: helloworld

    管理swarm(8) – swarm实践 – 调节服务副本数

    本文介绍如何调节服务副本数。
    1.登录manager1机器。
    2.执行如下命令来设置指定服务的副本数:

    1. $ docker service scale <SERVICE-ID>=<NUMBER-OF-TASKS>

    例如:

    1. $ docker service scale helloworld=5
    2.  
    3. helloworld scaled to 5

    3.执行docker service ps 查看更新的任务列表:

    1. $ docker service ps helloworld
    2.  
    3. ID                         NAME          SERVICE     IMAGE   LAST STATE          DESIRED STATE  NODE
    4. 8p1vev3fq5zm0mi8g0as41w35  helloworld.1  helloworld  alpine  Running 7 minutes   Running        worker2
    5. c7a7tcdq5s0uk3qr88mf8xco6  helloworld.2  helloworld  alpine  Running 24 seconds  Running        worker1
    6. 6crl09vdcalvtfehfh69ogfb1  helloworld.3  helloworld  alpine  Running 24 seconds  Running        worker1
    7. auky6trawmdlcne8ad8phb0f1  helloworld.4  helloworld  alpine  Running 24 seconds  Accepted       manager1
    8. ba19kca06l18zujfwxyc5lkyn  helloworld.5  helloworld  alpine  Running 24 seconds  Running        worker2

    你可以看到swarm已经创建了4个新任务来把Alpline Linux实例缩放到5个。这些任务分布到swarm中的三个节点。其中一个运行在manager1上。
    4.在其中一个节点运行docker ps来查看运行的容器。
    如下示例显示任务运行在manager1上:

    1. $ docker ps
    2.  
    3. CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    4. 528d68040f95        alpine:latest       "ping docker.com"   About a minute ago   Up About a minute                       helloworld.4.auky6trawmdlcne8ad8phb0f1

    管理swarm(7) – swarm实践 – 查看服务详细信息

    本文介绍如何查看运行在swarm中的服务的详情。
    1.登录manager1机器。
    2.运行docker service inspect –pretty 以便于阅读的格式显示服务的详细信息。
    查看helloworld服务的详细信息:

    1. $ docker service inspect –pretty helloworld
    2.  
    3. ID:     9uk4639qpg7npwf3fn2aasksr
    4. Name:       helloworld
    5. Mode:       REPLICATED
    6.  Replicas:      1
    7. Placement:
    8. UpdateConfig:
    9.  Parallelism:   1
    10. ContainerSpec:
    11.  Image:     alpine
    12.  Args:  ping docker.com

    要以json格式返回服务详细信息的,不带–pretty参数执行相同的命令。

    1. $ docker service inspect helloworld
    2. [
    3. {
    4.     "ID": "9uk4639qpg7npwf3fn2aasksr",
    5.     "Version": {
    6.         "Index": 418
    7.     },
    8.     "CreatedAt": "2016-06-16T21:57:11.622222327Z",
    9.     "UpdatedAt": "2016-06-16T21:57:11.622222327Z",
    10.     "Spec": {
    11.         "Name": "helloworld",
    12.         "TaskTemplate": {
    13.             "ContainerSpec": {
    14.                 "Image": "alpine",
    15.                 "Args": [
    16.                     "ping",
    17.                     "docker.com"
    18.                 ]
    19.             },
    20.             "Resources": {
    21.                 "Limits": {},
    22.                 "Reservations": {}
    23.             },
    24.             "RestartPolicy": {
    25.                 "Condition": "any",
    26.                 "MaxAttempts": 0
    27.             },
    28.             "Placement": {}
    29.         },
    30.         "Mode": {
    31.             "Replicated": {
    32.                 "Replicas": 1
    33.             }
    34.         },
    35.         "UpdateConfig": {
    36.             "Parallelism": 1
    37.         },
    38.         "EndpointSpec": {
    39.             "Mode": "vip"
    40.         }
    41.     },
    42.     "Endpoint": {
    43.         "Spec": {}
    44.     }
    45. }
    46. ]

    3.执行docker service ps 来查看哪个节点运行这个服务:
    $ docker service ps helloworld

    1. ID                         NAME          SERVICE     IMAGE   LAST STATE         DESIRED STATE  NODE
    2. 8p1vev3fq5zm0mi8g0as41w35  helloworld.1  helloworld  alpine  Running 3 minutes  Running        worker2

    在这个例子中,worker2节点运行着helloworld服务。不过你可能会看到服务运行在管理节点上。默认下,swarm中的管理节点能像worker节点一样执行任务。
    4.在运行这个服务的节点上执行docker ps来查看运行任务的容器。

    1. $docker ps
    2.  
    3. CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    4. e609dde94e47        alpine:latest       "ping docker.com"   3 minutes ago       Up 3 minutes                            helloworld.1.8p1vev3fq5zm0mi8g0as41w35

    提高在国内安装Docker和拉取镜像的速度

    最近在测试docker的各种功能,发现由于国内连接Docker相关服务的网速非常的慢,甚至是无法联通,体验非常的差。要想在国内使用docker,需要设置两步来提高使用体验。
    下面以Ubuntu 14.04为例进行设置。

    更换docker apt源

    安装docker也异常的慢,我们把docker的apt源更换为daocloud的。

    1. echo ‘deb [arch=amd64] https://get.daocloud.io/docker/apt-repo ubuntu-trusty main’ > /etc/apt/sources.list.d/docker.list
    2. apt-get update
    3. apt-get install docker-engine

    更换docker register mirror

    首先到https://www.daocloud.io/注册一个帐号(注册帐号居然要手机。。。),然后申请docker加速器。
    比如申请到的地址为http://xxx.m.daocloud.io
    打开/etc/default/docker,添加如下行:

    1. DOCKER_OPTS="$DOCKER_OPTS –registry-mirror=http://xxx.m.daocloud.io"

    然后重启docker。
    这里感谢daocloud为我们提高加速服务。

    管理swarm(6) – swarm实践 – 部署服务

    本文尝试在swarm中部署一个服务。
    1.登录到manager1机器。
    2.执行如下命令来部署服务:

    1. $ docker service create –replicas 1 –name helloworld alpine ping docker.com
    2.  
    3. 9uk4639qpg7npwf3fn2aasksr
  • docker service create命令创建服务
  • –name参数设置服务名称
  • –replicas 1指定运行一个实例
  • alpine ping docker.com参数定义alpine容器运行ping docker.com命令的服务
  • 3.执行docker service ls查看运行中的服务列表:

    1. $ docker service ls
    2.  
    3. ID            NAME        SCALE  IMAGE   COMMAND
    4. 9uk4639qpg7n  helloworld  1/1    alpine  ping docker.com

    管理swarm(5) – swarm实践 – 添加节点到swarm

    一旦你创建好带一个管理节点的swarm后,你就可以往swarm添加worker节点了。
    1.登录worker1机器。
    2.运行由前文创建swarm输出的把worker节点加入到swarm的命令:

    1. $ docker swarm join
    2.   –token  SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c
    3.   192.168.99.100:2377
    4.  
    5. This node joined a swarm as a worker.

    如果你找不到之前添加节点的命令了,可以执行如下命令来查询:

    1. $ docker swarm join-token worker
    2.  
    3. To add a worker to this swarm, run the following command:
    4.  
    5.     docker swarm join
    6.     –token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c
    7.     192.168.99.100:2377

    3.登录worker2机器。
    4.执行与第2步相同的命令把worker2添加到swarm中:

    1. $ docker swarm join
    2.   –token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c
    3.   192.168.99.100:2377
    4.  
    5. This node joined a swarm as a worker.

    5.登录manage1机器,执行docker node ls命令来查询worker节点:

    1. ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
    2. 03g1y59jwfg7cf99w4lt0f662    worker2   Ready   Active
    3. 9j68exjopxe7wfl6yuxml7a7j    worker1   Ready   Active
    4. dxn1zf6l61qsb1josjja83ngz *  manager1  Ready   Active        Leader

    管理swarm(4) – swarm实践 – 创建一个swarm

    完成上一篇文章的环境准备后,我们准备演示如何创建一个swarm。确保你主机的Docker Engine daemon运行状态。
    1.登录manager1机器
    2.运行如下命令来创建一个新的swarm:

    1. docker swarm init –advertise-addr <MANAGER-IP>

    在本实践我们在manager1来创建一个swarm:

    1. $ docker swarm init –advertise-addr 192.168.99.100
    2. Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.
    3.  
    4. To add a worker to this swarm, run the following command:
    5.  
    6.     docker swarm join
    7.     –token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c
    8.     192.168.99.100:2377
    9.  
    10. To add a manager to this swarm, run ‘docker swarm join-token manager’ and follow the instructions.

    –advertise-addr参数配置管理节点发布它的IP地址192.168.99.100。其它的节点必须能通过此IP来连接管理节点。
    上面命令的输出包含了加入新节点到swarm的命令。节点将作为manager或worker加入,具体取决于–token标志的值。
    3.运行docker info来查看目前swarm的状态:

    1. $ docker info
    2.  
    3. Containers: 2
    4. Running: 0
    5. Paused: 0
    6. Stopped: 2
    7.   …snip…
    8. Swarm: active
    9.   NodeID: dxn1zf6l61qsb1josjja83ngz
    10.   Is Manager: true
    11.   Managers: 1
    12.   Nodes: 1
    13.   …snip…

    4.执行docker node ls命令来查看节点的相关信息:

    1. $ docker node ls
    2.  
    3. ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
    4. dxn1zf6l61qsb1josjja83ngz *  manager1  Ready   Active        Leader

    管理swarm(3) – swarm实践 – 环境准备

    在我们开始试验swarm的功能时,先来搭建所需的环境。

    三个联网的主机

    swarm实践我们使用三台联网的主机来作为swarm的节点。这三台主机可以是你PC,数据中心或云服务提供商的三台虚拟机。本实践使用如下机器名:

  • manager1
  • worker1
  • worker2
  • Docker Engine 1.12或更高版本

    本实践需要每台主机的Docker Engine的版本为1.12或更高版本。
    在每台运行的主机上安装Docker Engine并验证其版本。你可以按照如下方法来获取最新版本的Docker Engine。

    在Linux主机安装Docker Engine

    如果你正在使用的是基于Linux系统的物理主机或者云提供商的主机,可以按照官方提供的Linux安装说明来安装最新版本的Docker Engine。

    在Mac或Windows主机安装Docker Engine

    或者,在一台Mac安装Docker或在一台Windows安装Docker。你可以在这台机器上测试单节点和多节点的swarm,不过你需要使用Docker Machine来测试多节点的swarm。

  • 你可以使用Docker for Mac或Docker for Windows测试swarm模式单节点的功能,包括初始化单节点的swarm,创建服务和缩放服务。
  • 目前你不能单独使用Docker for Mac或Docker for Windows测试多节点的swarm。不过你可以使用Docker Machine来创建swarm节点。
  • 管理器机器的IP地址

    必须为管理器主机的可用网卡分配一个IP地址。所有的swarm节点必须能够通过这个IP地址与管理器主机连接。
    由于其它节点通过这个IP地址与管理器节点通信,所以你应该使用固定的IP地址。
    你可以在Linux或macOS在使用ifconfig命令来查看可用的网卡列表。
    如果你用的是Docker Machine,你可以通过docker-machine ls或docker-machine ip 命令来获取管理器主机的IP。例如docker-machine ip manager1.
    本实践使用manager1 IP为192.168.99.100。

    主机间开放的端口

    主机间必须开放如下端口:

  • TCP端口2377 – 用于集群管理通信
  • TCP和UDP端口7946 – 用于各节点之间的通信
  • TCP和UDP端口4789 – 覆盖网络流量
  • 管理swarm(2) – swarm模式关键概念

    本文介绍Docker Engine 1.12的集群管理和编排功能唯一的一些概念。

    Swarm

    使用Swarmkit嵌入Docker Engine中的集群管理和编排功能。Docker Engine参与到集群时是运行在swarm模式下。你可以通过初始化一个swarm或加入一个已存在的swarm来激活Docker Engine进入swarm模式。
    一个swarm是用来部署服务的Docker Engine集群。Docker Engine CLI包括了管理swarm的命令,例如增加和删除节点。CLI也包括你部署服务到swarm和管理服务编排的命令。
    当你在swarm模式外运行Docker Engine,你执行的是容器命令。当你以swarm模式运行Engine,你执行的是编排服务的命令。

    节点

    一个节点是Docker Engine参与到swarm中的一个实例。
    为了部署你的应用到swarm,你需要提交一个服务定义到管理器节点。管理器节点将称为任务的工作单元分派给worker节点。
    管理器节点也完成编排和集群管理功能以维护swarm的期望状态。管理器节点选择单个领导节点来执行编排任务。
    Worker节点接收和执行来自管理器节点分派的任务。默认下管理器节点也是worker节点,不过你可以配置管理器节点为只管理节点。
    agent将其分配的任务的当前状态通知给管理器节点,使得管理器能够维护期望的状态。

    服务和任务

    一个服务是在worker节点执行任务的定义。它是swarm系统的中心结构和用户与swarm交互的主要根源。
    创建服务时,你可以指定要使用的容器映像以及在运行容器中执行的命令。在复制服务模型中,swarm管理器根据你在期望状态中设置的比例在节点之间分发特定数量的副本任务。对于全局服务,swarm在集群中每个可用节点上为该服务运行一个任务。一个任务携带一个Docker容器和在容器内运行的命令。它是swarm的原子调度单位。管理器节点根据服务规模中设置的副本数量将任务分配给worker节点。一旦一个任务分配给一个节点,它就不能移动到其它节点了。它只能在分配的节点上运行。

    负载均衡

    swarm管理器在入口使用负载均衡来连接你的服务。swarm管理器可以自动为服务分配一个PublishedPort或者你为服务配置一个PublishedPort。你可以指定任意可用的端口。如果你不指定,swarm管理器会在30000-32767范围为你的服务分配一个端口。外部组件(如云负载均衡器)可以访问集群中任何节点的PublishedPort上的服务,无论该节点当前是否正在运行任务。Swarm模式有一个内部DNS组件,它自动为每个服务分配一个DNS名称。swarm管理器使用内部负载均衡器,根据服务的DNS名称在集群内的服务之间分配请求。