Docker命令行参考(40) – docker service update更新服务

  1. Usage:  docker service update [OPTIONS] SERVICE
  2.  
  3. Update a service
  4.  
  5. Options:
  6.       –args string                    Service command args
  7.       –constraint-add value           Add or update placement constraints (default [])
  8.       –constraint-rm value            Remove a constraint (default [])
  9.       –container-label-add value      Add or update container labels (default [])
  10.       –container-label-rm value       Remove a container label by its key (default [])
  11.       –endpoint-mode string           Endpoint mode (vip or dnsrr)
  12.       –env-add value                  Add or update environment variables (default [])
  13.       –env-rm value                   Remove an environment variable (default [])
  14.       –help                           Print usage
  15.       –image string                   Service image tag
  16.       –label-add value                Add or update service labels (default [])
  17.       –label-rm value                 Remove a label by its key (default [])
  18.       –limit-cpu value                Limit CPUs (default 0.000)
  19.       –limit-memory value             Limit Memory (default 0 B)
  20.       –log-driver string              Logging driver for service
  21.       –log-opt value                  Logging driver options (default [])
  22.       –mount-add value                Add or update a mount on a service
  23.       –mount-rm value                 Remove a mount by its target path (default [])
  24.       –name string                    Service name
  25.       –publish-add value              Add or update a published port (default [])
  26.       –publish-rm value               Remove a published port by its target port (default [])
  27.       –replicas value                 Number of tasks (default none)
  28.       –reserve-cpu value              Reserve CPUs (default 0.000)
  29.       –reserve-memory value           Reserve Memory (default 0 B)
  30.       –restart-condition string       Restart when condition is met (none, on-failure, or any)
  31.       –restart-delay value            Delay between restart attempts (default none)
  32.       –restart-max-attempts value     Maximum number of restarts before giving up (default none)
  33.       –restart-window value           Window used to evaluate the restart policy (default none)
  34.       –stop-grace-period value        Time to wait before force killing a container (default none)
  35.       –update-delay duration          Delay between updates
  36.       –update-failure-action string   Action on update failure (pause|continue) (default "pause")
  37.       –update-parallelism uint        Maximum number of tasks updated simultaneously (0 to update all at once) (default 1)
  38.   -u, –user string                    Username or UID
  39.       –with-registry-auth             Send registry authentication details to Swarm agents
  40.   -w, –workdir string                 Working directory inside the container

通过指定的参数描述更新服务。这个命令必须在manager节点执行。这些参数与docker service create命令的参数一样。

示例

更新服务

  1. $ docker service update –limit-cpu 2 redis

添加和删除挂载

使用–mount-add 或 –mount-rm选项添加或删除一个服务的bind-mounts或volumes。

下面的示例创建一个服务并挂载test-data数据卷到/somewhere。下一步是更新服务添加挂载一个other-volume数据卷到/shomewhere-else,最后一步是取消/somewhere挂载点,将会删除test-data数据卷。每个命令返回服务名称。

  • –mount-add接受与service create的–mount选项一样的参数。
  • –mount-rm参数指定的是挂载点的目标路径。
    1. $ docker service create
    2.     –name=myservice
    3.     –mount
    4.       type=volume,source=test-data,target=/somewhere
    5.     nginx:alpine
    6.     myservice
    7.  
    8. myservice
    9.  
    10. $ docker service update
    11.     –mount-add
    12.       type=volume,source=other-volume,target=/somewhere-else
    13.     myservice
    14.  
    15. myservice
    16.  
    17. $ docker service update –mount-rm /somewhere myservice
    18.  
    19. myservice

    Docker命令行参考(39) – docker service scale缩放服务

    1. Usage:  docker service scale SERVICE=REPLICAS [SERVICE=REPLICAS…]
    2.  
    3. Scale one or multiple services
    4.  
    5. Options:
    6.       –help   Print usage

    示例

    缩放一个服务

    docker service scale命令可以按照期望的副本数量放大或缩小服务。命令是立即返回的,不过实际上缩放服务需要一定的时间。要停止服务的所有副本但要保持服务活跃可以设置scale为0。

    例如,下面的命令缩放frontend服务为50个任务。

    1. $ docker service scale frontend=50
    2. frontend scaled to 50

    紧接着运行docker service ls,会看到目前的副本数量。

    1. $ docker service ls –filter name=frontend
    2.  
    3. ID            NAME      REPLICAS  IMAGE         COMMAND
    4. 3pr5mlvu3fh9  frontend  15/50     nginx:alpine

    也可以使用docker service update命令缩放服务。因此下面的命令是等同的:

    1. $ docker service scale frontend=50
    2. $ docker service update –replicas=50 frontend

    缩放多个服务

    docker service scale命令可以一次性缩放多个服务。例如的示例同时缩放backend和frontend服务:

    1. $ docker service scale backend=3 frontend=5
    2. backend scaled to 3
    3. frontend scaled to 5
    4.  
    5. $ docker service ls
    6. ID            NAME      REPLICAS  IMAGE         COMMAND
    7. 3pr5mlvu3fh9  frontend  5/5       nginx:alpine
    8. 74nzcxxjv6fq  backend   3/3       redis:3.0.6

    Docker命令行参考(38) – docker service inspect显示服务详细信息

    1. Usage:  docker service inspect [OPTIONS] SERVICE [SERVICE…]
    2.  
    3. Display detailed information on one or more services
    4.  
    5. Options:
    6.   -f, –format string   Format the output using the given go template
    7.       –help            Print usage
    8.       –pretty          Print the information in a human friendly format.

    查看指定服务的信息。这个命令必须在manager节点上执行。

    默认情下,以JSON数组输出结果。如果指定了格式,就按给定的格式模板格式化每个结果。

    示例

    通过名称或ID查看服务

    例如,有如下服务:

    1. $ docker service ls
    2. ID            NAME      REPLICAS  IMAGE         COMMAND
    3. dmu1ept4cxcf  redis     3/3       redis:3.0.6

    docker service inspect redis和docker service inspect dmu1ept4cxcf都是输出同样的结果:

    1. $ docker service inspect redis
    2. [
    3.     {
    4.         "ID": "dmu1ept4cxcfe8k8lhtux3ro3",
    5.         "Version": {
    6.             "Index": 12
    7.         },
    8.         "CreatedAt": "2016-06-17T18:44:02.558012087Z",
    9.         "UpdatedAt": "2016-06-17T18:44:02.558012087Z",
    10.         "Spec": {
    11.             "Name": "redis",
    12.             "TaskTemplate": {
    13.                 "ContainerSpec": {
    14.                     "Image": "redis:3.0.6"
    15.                 },
    16.                 "Resources": {
    17.                     "Limits": {},
    18.                     "Reservations": {}
    19.                 },
    20.                 "RestartPolicy": {
    21.                     "Condition": "any",
    22.                     "MaxAttempts": 0
    23.                 },
    24.                 "Placement": {}
    25.             },
    26.             "Mode": {
    27.                 "Replicated": {
    28.                     "Replicas": 1
    29.                 }
    30.             },
    31.             "UpdateConfig": {},
    32.             "EndpointSpec": {
    33.                 "Mode": "vip"
    34.             }
    35.         },
    36.         "Endpoint": {
    37.             "Spec": {}
    38.         }
    39.     }
    40. ]
    1. $ docker service inspect dmu1ept4cxcf
    2. [
    3.     {
    4.         "ID": "dmu1ept4cxcfe8k8lhtux3ro3",
    5.         "Version": {
    6.             "Index": 12
    7.         },
    8.         …
    9.     }
    10. ]

    使用pretty-print查看服务

    可以使用–pretty选项以人类可读的格式打印输出,而不是默认的JSON格式输出。

    1. $ docker service inspect –pretty frontend
    2. ID:   c8wgl7q4ndfd52ni6qftkvnnp
    3. Name:   frontend
    4. Labels:
    5.  – org.example.projectname=demo-app
    6. Mode:   REPLICATED
    7.  Replicas:    5
    8. Placement:
    9. UpdateConfig:
    10.  Parallelism: 0
    11. ContainerSpec:
    12.  Image:   nginx:alpine
    13. Resources:
    14. Ports:
    15.  Name =
    16.  Protocol = tcp
    17.  TargetPort = 443
    18.  PublishedPort = 4443

    查找服务的任务数

    –format选项可以用来获取关于服务的指定信息。例如,下面的命令输出redis服务的副本数。

    1. $ docker service inspect –format='{{.Spec.Mode.Replicated.Replicas}}’ redis
    2. 10

    Docker命令行参考(37) – docker service create创建一个服务

    1. Usage:  docker service create [OPTIONS] IMAGE [COMMAND] [ARG…]
    2.  
    3. Create a new service
    4.  
    5. Options:
    6.       –constraint value               Placement constraints (default [])
    7.       –container-label value          Service container labels (default [])
    8.       –endpoint-mode string           Endpoint mode (vip or dnsrr)
    9.   -e, –env value                      Set environment variables (default [])
    10.       –help                           Print usage
    11.   -l, –label value                    Service labels (default [])
    12.       –limit-cpu value                Limit CPUs (default 0.000)
    13.       –limit-memory value             Limit Memory (default 0 B)
    14.       –log-driver string              Logging driver for service
    15.       –log-opt value                  Logging driver options (default [])
    16.       –mode string                    Service mode (replicated or global) (default "replicated")
    17.       –mount value                    Attach a mount to the service
    18.       –name string                    Service name
    19.       –network value                  Network attachments (default [])
    20.   -p, –publish value                  Publish a port as a node port (default [])
    21.       –replicas value                 Number of tasks (default none)
    22.       –reserve-cpu value              Reserve CPUs (default 0.000)
    23.       –reserve-memory value           Reserve Memory (default 0 B)
    24.       –restart-condition string       Restart when condition is met (none, on-failure, or any)
    25.       –restart-delay value            Delay between restart attempts (default none)
    26.       –restart-max-attempts value     Maximum number of restarts before giving up (default none)
    27.       –restart-window value           Window used to evaluate the restart policy (default none)
    28.       –stop-grace-period value        Time to wait before force killing a container (default none)
    29.       –update-delay duration          Delay between updates
    30.       –update-failure-action string   Action on update failure (pause|continue) (default "pause")
    31.       –update-parallelism uint        Maximum number of tasks updated simultaneously (0 to update all at once) (default 1)
    32.   -u, –user string                    Username or UID
    33.       –with-registry-auth             Send registry authentication details to Swarm agents
    34.   -w, –workdir string                 Working directory inside the container

    按指定参数所述创建服务。这个命令必须运行在manager节点上。

    示例

    创建一个服务

    1. $ docker service create –name redis redis:3.0.6
    2. dmu1ept4cxcfe8k8lhtux3ro3
    3.  
    4. $ docker service ls
    5. ID            NAME   REPLICAS  IMAGE        COMMAND
    6. dmu1ept4cxcf  redis  1/1       redis:3.0.6

    创建一个5个副本任务的服务(–replicas)

    使用–replicas参数设置副本服务的副本任务数。下面的命令创建一个5个副本任务的redis服务:

    1. $ docker service create –name redis –replicas=5 redis:3.0.6
    2. 4cdgfyky7ozwh3htjfw0d12qv

    上面的命令设置了服务期望的任务数。虽然命令立即返回了,实际上完成服务部署需要一定的时间。REPLICAS列显示了实际上部署的和期望部署的副本任务数。

    下面的示例中期望的副本数是5,不过副本运行的任务数是3:

    1. $ docker service ls
    2. ID            NAME    REPLICAS  IMAGE        COMMAND
    3. 4cdgfyky7ozw  redis   3/5       redis:3.0.7

    一旦创建了所有的任务且为RUNNING状态,任务的实际数量就等于期望的数量:

    1. $ docker service ls
    2. ID            NAME    REPLICAS  IMAGE        COMMAND
    3. 4cdgfyky7ozw  redis   5/5       redis:3.0.7

    指定滚动更新策略创建一个服务

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

    当执行上面的service update命令时,调度器同时更新最大2个任务,间隔更新时间为10s。

    设置环境变量(-e,–env)

    为在一个服务中的所有任务设置环境变量。例如:

    1. $ docker service create –name redis_2 –replicas 5 –env MYVAR=foo redis:3.0.6

    设置服务的metadata(-l,–label)

    一个label是key=value键值对应用到服务的元数据。要为服务设置两个labels,执行:

    1. $ docker service create
    2.   –name redis_2
    3.   –label com.example.foo="bar"
    4.   –label bar=baz
    5.   redis:3.0.6

    添加bind-mounts或volumes

    docker支持两种不同的挂载,允许容器从其他容器或主机操作系统上的文件或目录读取或写入。这些类型是data volumes和bind-mounts。

    bind-mount容器可以直接操作主机上的文件。bind-mount可以是只读或读写。例如,一个容器可能通过绑定挂载主机的/etc/resolv.conf来共享主机的DNS信息或一个容器可能写入日志到主机的/var/log/myContainerLogs目录。如果使用了bind-mounts且你的主机与容器有不同的权限概念,访问控制或其它这样的信息,你可能会遇到可移植性的问题。

    一个命名数据卷是从用于创建容器的镜像和主机分离出容器所需的持久化数据的一个机制。命名数据卷由docker创建和管理,即使当没有容器使用它时,一个命名数据卷仍然会存在。在命名数据卷的数据可以在容器和主机之间共享,也可以在多个容器之间共享。docker使用一个数据卷驱动来创建,管理和挂载数据卷。可以使用docker的相关命令备份或恢复数据卷。

    考虑这样一个情景,你有一个镜像是用来启动一个轻量级的web server的,然后你用这个镜像作为base镜像,把网站的HTML文件复制到这个镜像。每个网站有更新时,你需要更新这个镜像并重新部署容器。一个更好的解决方案是把网站存储到一个命名数据卷中,当容器启动时这个数据卷就会附着到你的web server。要更新这个网站,只需要更新命名数据卷。

    下面的表格是应用到bind-mounts和named volumes的选项:

    选项 必要 描述
    type mount的类型,可以是volume或bind。如果不指定type,默认是volume。

  • volume: 挂载一个数据卷到容器中。
  • bind: 从主机绑定挂载一个目录或文件到容器中。
  • src或source 用在当type=bind时
  • type=volume: src是指定数据卷名称的可选的一种方式(例如,src=my-volume)。如果命名数据卷不存在,则docker会自动创建它。如果没有指定src,则分配一个随机的名称给数据卷,并保证这个名称在主机上是唯一的,不过可能在集群范围不是唯一的。一个随机命名数据卷与容器有相同的生命周期,当容器被销毁时此数据卷也将销毁(销毁取决于service update或当scaling或重新负载均衡服务时)。
  • type=bind: src是必须的,并需要指定文件或目录的绝对路径(例如src=/path/on/host/)。如果文件或目录不存在将会报错。
  • dst 或 destination 或 target 容器内挂载的路径。例如/some/path/in/container/。如果在容器文件系统不存在这个路径,engine将在挂载数据卷或绑定挂载之前先创建这个目录。
    readonly 或 ro Engine挂载绑定和数据卷默认是读写的,除非设置了readonly选项。

  • true或1或no:挂载绑定或数据卷只读。
  • false或0: 挂载绑定或数据卷读写。
  • 绑定传播(Bind Propagation)

    绑定传播指的是在给定的绑定挂载或命名数据卷内创建的挂载是否可以传播到那个挂载的副本。如一个挂载点/mnt,也挂载到/tmp上。传播设置控制在/tmp/a的挂载是否也挂载到/mnt/a。每个传播设置具有递归对应点。在递归情况下,假设/tmp/a也挂载为/foo。传播设置控制/mnt/a和/或/tmp/a是否存在。

    bind-mounts和volume mounts的bind-propagation选项的默认值为rprivate,并只能对bind-mounts可设置。换句话说,命名数据卷不支持绑定传播。

  • shared: 原始挂载的子挂载暴露给副本挂载,副本挂载的子挂载也传播到原始挂载。
  • slave:与shared挂载类似,不过只有一个方向。如果原始挂载暴露一个子挂载,副本挂载可以看到。不过,如果副本挂载暴露一个子挂载,原始挂载无法看到。
  • private:挂载是私有的。在它之内的子挂载不暴露给副本挂载,且副本挂载的子挂载不暴露给原始挂载。
  • rshared:与shared一样,但传播也扩展到嵌套在任何原始或复制挂载点内的挂载点。
  • rslave:与slave相同,但是传播也延伸到嵌套在任何原始或复制挂载点内的挂载点。
  • rprivate:默认值。与private相同,意味着原始或复制挂载点内任何地方的任何挂载点都不会在任一方向传播。
  • 更多信息请查看sharedsubtree

    命名数据卷选项

    下面的选项只能用于命名数据卷(type=volume)。

    选项 描述
    volume-driver 数据卷所使用的数据卷驱动插件名称。默认为local,使用local数据卷驱动时当数据卷不存在时会自动创建。
    volume-label 创建数据卷时应用给它的一个或多个自定义元数据(“labels”)。例如,volume-label=mylabel=hello-world,my-other-label=hello-mars。
    volume-nocopy 默认下,如果附着一个空的数据卷到一个容器,在容器的挂载路径已经存在的文件或目录,Engine将复制这些文件和目录到数据卷中。设置vloume-nocopy将禁止从容器的文件系统复制文件到挂载的空数据卷。
    值是可选的:

  • true或1: 这是默认值。禁止复制。
  • false或0: 启用复制。
  • volume-opt 给定数据卷驱动的特定选项,当创建数据卷时将传递给驱动。选项格式为以逗号分隔的键/值对列表,例如volume-opt=some-option=some-value,some-other-option=some-other-value。

    “–mount”和”–volume”的异同

    –mount选项支持docker run的-v或–volume的大多数选项。除了一些重要的例外:

  • –mount标志可以为每一个数据卷指定一个数据卷驱动及其选项,而不需要提供创建好数据卷。相比之一,docker run使用–volume-driver指定一个用于所有数据卷的数据卷驱动。
  • –mount标志允许你在数据卷创建前为数据卷指定自定义的元数据(“labels”)
  • 当–mount和type=bind一起使用时,host-path必须对应到一个主机上存在的路径。不会为你自动创建路径且当路径不存在时服务创建将失败。
  • –mount标志不允许使用Z或z重新label数据卷,因为这个已经用于selinux了。
  • 使用一个命名数据卷创建服务

    下面的示例使用一个命名数据卷来创建服务:

    1. $ docker service create
    2.   –name my-service
    3.   –replicas 3
    4.   –mount type=volume,source=my-volume,destination=/path/in/container,volume-label="color=red",volume-label="shape=round"
    5.   nginx:alpine

    对于服务的每一个副本,engine从部署任务上的默认的”local”数据卷驱动请求一个名称为”my-volume”的数据卷。如果数据卷不存在,engine就创建一个新的并应用”color”和”shape” labels。

    当任务启动后,数据卷挂载到容器内的/path/in/container。

    要注意那个默认的”local”数据卷是本地范围的数据卷驱动。意思是使用哪里的驱动取决于任务部署的位置。如果运行在容器内的软件没有设计为写入数据到相同位置的并发进程,那么多个容器同时写入单个共享数据卷可能会损坏数据。同时也要考虑容器可能会被swarm编排器重新调度并部署到一个不同的节点。

    使用匿名数据卷创建服务

    下面的命令使用一个挂载到/path/in/container的匿名数据卷创建一个3个副本的服务:

    1. $ docker service create
    2.   –name my-service
    3.   –replicas 3
    4.   –mount type=volume,destination=/path/in/container
    5.   nginx:alpine

    在这个示例中,没有为数据卷指定[source],所以每个任务将创建一个新的数据卷。这保证了每个任务能得到它自己的数据卷且不会与其它任务共享数据卷。当任务被删除时,匿名数据卷同样将被删除。

    使用绑定挂载(bind-mounted)主机目录创建服务

    下面的示例在容器内的/path/in/container绑定挂载主机的目录/path/on/host:

    1. $ docker service create
    2.   –name my-service
    3.   –mount type=bind,source=/path/on/host,destination=/path/in/container
    4.   nginx:alpine

    设置服务模式

    服务模式决定着这是副本服务还是全局服务。一个副本服务指定数量的任务,而全局服务在集群中的每个活跃节点都运行任务。
    下面的命令创建了一个全局服务:

    1. $ docker service create
    2.  –name redis_2
    3.  –mode global
    4.  redis:3.0.6

    指定服务约束(–constraint)

    可以通过定义约束表达式来限制可用于任务调度的节点。多个约束查找节点时,需要满足每个表达式(AND匹配)。 约束可以匹配节点或docker engine的labels,如下:

    节点属性 匹配 示例
    node.id 节点ID node.id == 2ivku8v2gvtg4
    node.hostname 节点主机名 node.hostname != node-2
    node.role 节点角色:manager node.role == manager
    node.labels 用户定义节点labels node.labels.security == high
    engine.labels Docker Engine的labels engine.labels.operatingsystem == ubuntu 14.04

    engine.labels匹配docker engine的lables,如操作系统,驱动等。集群管理员通过使用docker node update命令来添加node.labels以更好使用节点。

    例如,下面的示例限制redis服务的任务只能部署到那么节点的label type等于queue的节点:

    1. $ docker service create
    2.   –name redis_2
    3.   –constraint ‘node.labels.type == queue’
    4.   redis:3.0.6

    添加一个服务到一个现有的网络(–network)

    可以使用overlay网络在集群内连接一个或多个服务。

    首先在manager节点上执行docker network create命令创建一个overlay网络:

    1. $ docker network create –driver overlay my-network
    2.  
    3. etjpu59cykrptrgw0z0hk5snf

    当在swarm模式中创建了一个overlay网络,那么所有的manager节点都已经在这个网络中的。

    当创建一个服务然后传递–network参数来添加服务到这个overlay网络:

    1. $ docker service create
    2.   –replicas 3
    3.   –network my-network
    4.   –name my-web
    5.   nginx
    6.  
    7. 716thylsndqma81j6kkkb5aus

    swarm则扩展my-network到运行着这个服务的每一个节点。

    发布服务端口到集群外部(-p,–publish)

    可以使用–publish参数来把服务端口发布到集群外部:

    1. $ docker service create –publish <TARGET-PORT>:<SERVICE-PORT> nginx

    例如:

    1. $ docker service create –name my_web –replicas 3 –publish 8080:80 nginx

    当发布一个服务端口时,集群路由网使服务在每个节点的目标端口可访问,不管这个运行中的节点是否有服务的任务。

    只发布一个TCP端口或UDP端口

    默认下,当发布一个端口时,它是一个TCP端口。可以指定发布一个UDP端口,而不是或额外的TCP端口。当发布TCP和UDP两个端口时,Docker 1.12.2或之前的版本需要为TCP端口添加前缀/tcp。否则它是可选的。

    TCP only

    下面两个命令是等同的。

    1. $ docker service create –name dns-cache -p 53:53 dns-cache
    2.  
    3. $ docker service create –name dns-cache -p 53:53/tcp dns-cache

    TCP和UDP

    1. $ docker service create –name dns-cache -p 53:53/tcp -p 53:53/udp dns-cache

    UDP only

    1. $ docker service create –name dns-cache -p 53:53/udp dns-cache

    Docker命令行参考(36) – docker swarm join-token管理加入令牌

    1. Usage:  docker swarm join-token [–rotate] (worker|manager)
    2.  
    3. Manage join tokens
    4.  
    5. Options:
    6.       –help     Print usage
    7.   -q, –quiet    Only display token
    8.       –rotate   Rotate join token

    Join tokens是允许一个节点加入集群的密钥。有两种可用的不同的join tokens,一个是用作worker角色,另一个是用作manager角色。在执行swarm join时使用–token来传递token。节点只在它们加入集群时才使用这个token。

    使用swarm join-token可以查看或更换join token。

    为方便起见,可以传递worker或manager到join-token来打印出完整的docker swarm join命令来加入一个新的节点到集群。

    1. $ docker swarm join-token worker
    2. To add a worker to this swarm, run the following command:
    3.  
    4.     docker swarm join
    5.     –token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx
    6.     172.17.0.2:2377
    7.  
    8. $ docker swarm join-token manager
    9. To add a manager to this swarm, run the following command:
    10.  
    11.     docker swarm join
    12.     –token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2
    13.     172.17.0.2:2377

    使用–rotate参数来为指定的角色生成一个新的join token:

    1. $ docker swarm join-token –rotate worker
    2. Succesfully rotated worker join token.
    3.  
    4. To add a worker to this swarm, run the following command:
    5.  
    6.     docker swarm join
    7.     –token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-b30ljddcqhef9b9v4rs7mel7t
    8.     172.17.0.2:2377

    使用–rotate更新token之后,只能用新的token来加入集群。

    -q或–quiet参数只打印token:

    1. $ docker swarm join-token -q worker
    2.  
    3. SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-b30ljddcqhef9b9v4rs7mel7t

    Docker命令行参考(35) – docker swarm leave脱离集群

    1. Usage:  docker swarm leave [OPTIONS]
    2.  
    3. Leave the swarm (workers only).
    4.  
    5. Options:
    6.       –force   Force this node to leave the swarm, ignoring warnings
    7.       –help    Print usage

    当在一个worker节点执行这个命令时,这个节点将脱离集群。
    可以在一个manager节点上使用–force选项来从集群删除它。不过,这不会重新配置集群来确保集群有足够的manager节点来维持一个法定仲裁人数。从一个集群删除一个manager节点的安全方法是把它降级为worker然后不使用–force来执行这个命令脱离集群。只在manager节点脱离集群后不再使用这个集群才使用–force选项,如单节点的集群。

    如下示例:

    1. $ docker node ls
    2. ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
    3. 7ln70fl22uw2dvjn2ft53m3q5    worker2   Ready   Active
    4. dkp8vy1dq1kxleu9g4u78tlag    worker1   Ready   Active
    5. dvfxp4zseq4s0rih1selh0d20 *  manager1  Ready   Active        Leader

    要删除worker2,在worker2主机上执行如下命令:

    1. $ docker swarm leave
    2. Node left the default swarm.

    Docker命令行参考(34) – docker swarm join加入一个节点到集群

    1. Usage:  docker swarm join [OPTIONS] HOST:PORT
    2.  
    3. Join a swarm as a node and/or manager
    4.  
    5. Options:
    6.       –advertise-addr value   Advertised address (format: <ip|interface>[:port])
    7.       –help                   Print usage
    8.       –listen-addr value      Listen address (format: <ip|interface>[:port)
    9.       –token string           Token for entry into the swarm

    docker swarm join用来加入一个节点到一个集群。节点加入为一个manager节点或worker节点取决于使用–token参数传递过去的token。如果传递一个manager token,这个节点以管理节点加入。如果传递一个worker token,就以worker节点加入。

    以manager身份添加节点到集群

    下面的示例演示使用manager token添加管理节点到集群。

    1. $ docker swarm join –token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2 192.168.99.121:2377
    2. This node joined a swarm as a manager.
    3. $ docker node ls
    4. ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
    5. dkp8vy1dq1kxleu9g4u78tlag *  manager2  Ready   Active        Reachable
    6. dvfxp4zseq4s0rih1selh0d20    manager1  Ready   Active        Leader

    一个集群应该最多只能有3-7个管理节点。不参与管理仲裁的节点应该以worker身份加入。manager节点应该是稳定的主机且有静态IP地址。

    以worker身份加入集群

    下面的示例演示使用worker token添加worker节点到集群。

    1. $ docker swarm join –token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx 192.168.99.121:2377
    2. This node joined a swarm as a worker.
    3. $ docker node ls
    4. ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
    5. 7ln70fl22uw2dvjn2ft53m3q5    worker2   Ready   Active
    6. dkp8vy1dq1kxleu9g4u78tlag    worker1   Ready   Active        Reachable
    7. dvfxp4zseq4s0rih1selh0d20 *  manager1  Ready   Active        Leader

    –listen-addr value

    如果节点为manager,在这个地址监听集群管理相关流量。默认是监听0.0.0.0:2377。也可以指定一个网络接口来监听这个接口的地址。例如–listen-addr eth0:2377。

    端口是可选的。如果仅指定IP地址或接口名称,端口就使用默认的2377。

    当加入的是一个已存在的集群时,这个参数一般不需要指定。

    –advertise-addr value

    指定通告给集群的节点的地址,这个地址用来给其它节点访问API和overlay网络通信。如果没有指定地址,docker将检查系统是否只有一个IP地址,如果是将使用这个地址并使用监听的端口(查看–listen-addr)。如果系统有多个IP地址,–advertise-addr就必须指定一个以便内部管理节点能够正常通信和overlay网络通信。

    也可以指定一个网络接口来通告接口的地址,例如–advertise-addr eth0:2377。

    端口是可选的。如果仅指定一个IP地址或接口名称,就使用端口2377。

    当加入的是一个已存在的集群时,这个参数一般不需要指定。

    –token string

    节点加入集群所需的密钥

    Docker命令行参考(33) – docker swarm init初始化集群

    1. Usage:  docker swarm init [OPTIONS]
    2.  
    3. Initialize a swarm
    4.  
    5. Options:
    6.       –advertise-addr value            Advertised address (format: <ip|interface>[:port])
    7.       –cert-expiry duration            Validity period for node certificates (default 2160h0m0s)
    8.       –dispatcher-heartbeat duration   Dispatcher heartbeat period (default 5s)
    9.       –external-ca value               Specifications of one or more certificate signing endpoints
    10.       –force-new-cluster               Force create a new cluster from current state.
    11.       –help                            Print usage
    12.       –listen-addr value               Listen address (format: <ip|interface>[:port])
    13.       –task-history-limit int          Task history retention limit (default 5)

    初始化一个集群。docker engine收到并执行这个命令所在的主机将成为新创建的单节点集群的管理节点。

    1. $ docker swarm init –advertise-addr 192.168.99.121
    2. Swarm initialized: current node (bvz81updecsj6wjz393c09vti) 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-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx
    8.     172.17.0.2:2377
    9.  
    10. To add a manager to this swarm, run ‘docker swarm join-token manager’ and follow the instructions.

    docker swarm init生成两个随机的tokens,一个worker token和一个manager token。当一个节点加入到这个集群时,是worker节点还是manager节点取决于传递给swarm joing的token。

    当创建集群后,可以使用swarm join-token来显示或轮换token。

    –cert-expiry

    设置节点证书有效期

    –dispatcher-heartbeat

    设置节点报告它们的健康状态间隔的时间。

    –external-ca value

    设置集群使用一个外部CA来签发节点证书。value的格式为protocol=X,url=Y。protocol指定的是发送签名请求到外部CA所使用的协议。目前只支持cfssl。URL指定的是签名请求应该提交到哪个endpoint。

    –force-new-cluster

    强制一个失去仲裁能力的集群的其中一个节点重启成为一单节点集群,而不丢失数据。

    –listen-addr value

    在这个地址监听集群管理相关流量。默认是监听0.0.0.0:2377。也可以指定一个网络接口来监听这个接口的地址。例如–listen-addr eth0:2377。

    端口是可选的。如果仅指定IP地址或接口名称,端口就使用默认的2377。

    –advertise-addr value

    指定通告给集群的节点的地址,这个地址用来给其它节点访问API和overlay网络通信。如果没有指定地址,docker将检查系统是否只有一个IP地址,如果是将使用这个地址并使用监听的端口(查看–listen-addr)。如果系统有多个IP地址,–advertise-addr就必须指定一个以便内部管理节点能够正常通信和overlay网络通信。

    也可以指定一个网络接口来通告接口的地址,例如–advertise-addr eth0:2377。

    端口是可选的。如果仅指定一个IP地址或接口名称,就使用端口2377。

    –task-history-limit

    设置任务历史记录保留限制。

    Docker命令行参考(32) – docker volume create创建数据卷

    1. Usage:  docker volume create [OPTIONS]
    2.  
    3. Create a volume
    4.  
    5. Options:
    6.   -d, –driver string   Specify volume driver name (default "local")
    7.       –help            Print usage
    8.       –label value     Set metadata for a volume (default [])
    9.       –name string     Specify volume name
    10.   -o, –opt value       Set driver specific options (default map[])

    创建一个新的数据卷,这样容器就可以往里面存储数据了。如果–name没有指定,docker就生成一个随机的名称。创建一个数据卷之后就可以配置容器使用它了,例如:

    1. $ docker volume create –name hello
    2. hello
    3.  
    4. $ docker run -d -v hello:/world busybox ls /world

    数据卷hello挂载在容器的/world目录。docker不支持容器内的挂载点使用相对路径。

    多个容器可以在相同时间段使用相同的数据卷。如果两个容器需要访问共享数据这个功能会非常有用。例如,一个容器写入数据另一个读取这个数据。

    数据卷名称必须在所有驱动之间是唯一的。意味着在两个不同的驱动之间不能使用相同的数据卷名。如果尝试使用,docker将返回一个错误:

    1. A volume named  "hello"  already exists with the "some-other" driver. Choose a different volume name.

    驱动特定的选项

    一些数据卷驱动提供了一些选项来自定义数据卷的创建。使用-o或–opt标志传递这个驱动选项:

    1. $ docker volume create –driver fake –opt tardis=blue –opt timey=wimey

    这些选项直接传递到数据卷驱动。内置的local Linux驱动接受的选项与linux mount命令类似。通过传递多次–opt标志来提供多个选项。完整的可用的mount选项在这里

    例如,下面创建了一个tmpfs数据卷,称为foo,大小为100M,uid为1000.

    1. $ docker volume create –driver local –opt type=tmpfs –opt device=tmpfs –opt o=size=100m,uid=1000 –name foo

    使用btrfs的另一个示例:

    1. $ docker volume create –driver local –opt type=btrfs –opt device=/dev/sda2 –name foo

    使用nfs从192.168.1.1挂载到/path/to/dir,模式为rw的示例:

    1. $ docker volume create –driver local –opt type=nfs –opt o=addr=192.168.1.1,rw –opt device=:/path/to/dir –name foo

    Docker命令行参考(31) – docker network ls列出网络

    1. Usage:  docker network ls [OPTIONS]
    2.  
    3. List networks
    4.  
    5. Aliases:
    6.   ls, list
    7.  
    8. Options:
    9.   -f, –filter value   Provide filter values (i.e. ‘dangling=true’) (default [])
    10.       –help           Print usage
    11.       –no-trunc       Do not truncate the output
    12.   -q, –quiet          Only display network IDs

    列出Engine daemon知道的所有网络。这包括跨集群中多个主机的网络,例如:

    1. $ sudo docker network ls
    2.     NETWORK ID          NAME                DRIVER
    3.     7fca4eb8c647        bridge              bridge
    4.     9f904ee27bf5        none                null
    5.     cf03ee007fb4        host                host
    6.     78b03ee04fc4        multi-host          overlay

    使用–no-trunc选项显示完整的网络id:

    1. docker network ls –no-trunc
    2. NETWORK ID                                                         NAME                DRIVER
    3. 18a2866682b85619a026c81b98a5e375bd33e1b0936a26cc497c283d27bae9b3   none                null
    4. c288470c46f6c8949c5f7e5099b5b7947b07eabe8d9a27d79a9cbf111adcbf47   host                host
    5. 7b369448dccbf865d397c8d2be0cda7cf7edc6b0945f77d2529912ae917a0185   bridge              bridge
    6. 95e74588f40db048e86320c6526440c504650a1ff3e9f7d60a497c4d2163e5bd   foo                 bridge
    7. 63d1ff1f77b07ca51070a8c227e962238358bd310bde1529cf62e6c307ade161   dev                 bridge

    过滤

    过滤标志(-f或–filter)格式是key=value。如果超过一个过滤,那么传递多个标志(如 –filter “foo=bar” –filter “bif=baz”)。多个过滤标志作为一个OR过滤连接。例如-f type=custom -f type=builtin返回custom和builtin网络。
    目前支持的过滤有:

  • driver
  • id (网络id)
  • label (label= 或 label==)
  • name (网络名称)
  • type (custom builtin)
  • Driver

    driver过滤器基于它们的驱动匹配网络。
    下面的示例匹配使用bridge驱动的网络:

    1. $ docker network ls –filter driver=bridge
    2. NETWORK ID          NAME                DRIVER
    3. db9db329f835        test1               bridge
    4. f6e212da9dfd        test2               bridge

    ID

    id过滤器基于完整或部分网络ID匹配网络。
    下面的示例是过滤出包含ID 63d1ff1f77b0…字符串的网络。

    1. $ docker network ls –filter id=63d1ff1f77b07ca51070a8c227e962238358bd310bde1529cf62e6c307ade161
    2. NETWORK ID          NAME                DRIVER
    3. 63d1ff1f77b0        dev                 bridge

    也可以使用ID的部分字符来匹配:

    1. $ docker network ls –filter id=95e74588f40d
    2. NETWORK ID          NAME                DRIVER
    3. 95e74588f40d        foo                 bridge
    4.  
    5. $ docker network ls –filter id=95e
    6. NETWORK ID          NAME                DRIVER
    7. 95e74588f40d        foo                 bridge

    Label

    label过滤器基于label的存在或label和其值来匹配网络。
    下面的示例过滤出有一个usage label而不管它是什么值的所有网络。

    1. $ docker network ls -f "label=usage"
    2. NETWORK ID          NAME                DRIVER
    3. db9db329f835        test1               bridge
    4. f6e212da9dfd        test2               bridge

    下面过滤出存在usage label且值为prod的网络。

    1. $ docker network ls -f "label=usage=prod"
    2. NETWORK ID          NAME                DRIVER
    3. f6e212da9dfd        test2               bridge

    Name

    name过滤器基于网络名称的全部或部分匹配网络。
    下面示例过滤出网络名称包含foobar字符中的所有网络。

    1. $ docker network ls –filter name=foobar
    2. NETWORK ID          NAME                DRIVER
    3. 06e7eef0a170        foobar              bridge

    也可以指定名称的部分匹配:

    1. $ docker network ls –filter name=foo
    2. NETWORK ID          NAME                DRIVER
    3. 95e74588f40d        foo                 bridge
    4. 06e7eef0a170        foobar              bridge

    Type

    type过滤器支持两个值;builtin显示预定义的网络(bridge,none,host),costom显示用户定义的网络。
    下面示例过滤出所有用户定义的网络:

    1. $ docker network ls –filter type=custom
    2. NETWORK ID          NAME                DRIVER
    3. 95e74588f40d        foo                 bridge
    4. 63d1ff1f77b0        dev                 bridge

    通过这个命令可以清理网络。例如,使用这个过滤可以删除所有的用户定义的网络:

    1. $ docker network rm `docker network ls –filter type=custom -q`

    当尝试删除仍然有容器连接到的网络时将出现一个waring。