docker service create


创建新服务

Swarm此命令适用于 Swarm 编排器.

Usage

$ docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]

有关此命令的可用OPTIONS的概述,请参阅选项部分.

Description

按照指定参数的描述创建服务.

Note

这是一个集群管理命令,必须在 swarm manager 节点上执行. 要了解管理器和工作器,请参阅文档中的Swarm 模式部分.

有关此命令的使用示例,请参阅下面的示例部分.

Options

名称,简写 Default Description
--cap-add API 1.41+
添加 Linux 功能
--cap-drop API 1.41+
放弃 Linux 功能
--config API 1.41+
指定要公开给服务的配置
--constraint 放置约束
--container-label 容器标签
--credential-spec 托管服务帐户的凭据规范(仅限 Windows)
--detach , -d 立即退出而不是等待服务收敛
--dns 设置自定义 DNS 服务器
--dns-option 设置 DNS 选项
--dns-search 设置自定义 DNS 搜索域
--endpoint-mode vip 端点模式(vip 或 dnsrr)
--entrypoint 覆盖图像的默认入口点
--env , -e 设置环境变量
--env-file 读入环境变量文件
--generic-resource 用户定义的资源
--group 为容器设置一个或多个补充用户组
--health-cmd 运行以检查运行状况的命令
--health-interval 运行检查之间的时间 (ms|s|m|h)
--health-retries 需要报告不健康的连续失败
--health-start-period 在计算不稳定的重试次数之前容器初始化的开始时间(ms|s|m|h)
--health-timeout 允许运行一项检查的最长时间 (ms|s|m|h)
--host 设置一个或多个自定义主机到 IP 映射 (host:ip)
--hostname 容器主机名
--init 在每个服务容器中使用一个 init 来转发信号和获取进程
--isolation 服务容器隔离模式
--label , -l 服务标签
--limit-cpu 限制 CPU
--limit-memory 限制内存
--limit-pids API 1.41+
限制最大进程数(默认 0 = 无限制)
--log-driver 服务的日志记录驱动程序
--log-opt 记录驱动程序选项
--max-concurrent API 1.41+
同时运行的作业任务数(默认等于--replicas)
--mode replicated 服务模式(复制、全局、复制作业或全局作业)
--mount 将文件系统挂载附加到服务
--name 服务名称
--network 网络附件
--no-healthcheck 禁用任何容器指定的 HEALTHCHECK
--no-resolve-image 不要查询注册表来解析图像摘要和支持的平台
--placement-pref 添加展示位置偏好
--publish , -p 将端口发布为节点端口
--quiet , -q 抑制进度输出
--read-only 将容器的根文件系统挂载为只读
--replicas 任务数
--replicas-max-per-node API 1.40+
每个节点的最大任务数(默认 0 = 无限制)
--reserve-cpu 预留 CPU
--reserve-memory Reserve Memory
--restart-condition 满足条件时重新启动 ("none"|"on-failure"|"any") (默认 "any")
--restart-delay Delay between restart attempts (ns|us|ms|s|m|h) (default 5s)
--restart-max-attempts 放弃前的最大重启次数
--restart-window 用于评估重启策略的窗口 (ns|us|ms|s|m|h)
--rollback-delay 任务回滚之间的延迟(ns|us|ms|s|m|h)(默认 0s)
--rollback-failure-action 回滚失败的操作("暂停"|"继续")(默认"暂停")
--rollback-max-failure-ratio 回滚期间容忍的失败率(默认 0)
--rollback-monitor 每个任务回滚后监控失败的持续时间(ns|us|ms|s|m|h)(默认 5s)
--rollback-order 回滚顺序("start-first"|"stop-first")(默认"stop-first")
--rollback-parallelism 1 同时回滚的最大任务数(0 一次全部回滚)
--secret 指定要公开给服务的秘密
--stop-grace-period 强制杀死容器前的等待时间 (ns|us|ms|s|m|h) (默认 10s)
--stop-signal Signal to stop the container
--sysctl API 1.40+
Sysctl 选项
--tty , -t API 1.40+
分配一个伪 TTY
--ulimit API 1.41+
限制选项
--update-delay 更新之间的延迟(ns|us|ms|s|m|h)(默认 0s)
--update-failure-action 更新失败的操作("暂停"|"继续"|"回滚")(默认"暂停")
--update-max-failure-ratio 更新期间容忍的失败率(默认 0)
--update-monitor 每次任务更新后监控失败的持续时间(ns|us|ms|s|m|h)(默认 5s)
--update-order 更新顺序("start-first"|"stop-first")(默认"stop-first")
--update-parallelism 1 同时更新的最大任务数(0 表示一次全部更新)
--user , -u 用户名或 UID(格式:<name|uid>[:<group|gid>])
--with-registry-auth 向 swarm 代理发送注册表身份验证详细信息
--workdir , -w 容器内的工作目录

Examples

Create a service

$ docker service create --name redis redis:3.0.6

dmu1ept4cxcfe8k8lhtux3ro3

$ docker service create --mode global --name redis2 redis:3.0.6

a8q9dasaafudfs8q8w32udass

$ docker service ls

ID            NAME    MODE        REPLICAS  IMAGE
dmu1ept4cxcf  redis   replicated  1/1       redis:3.0.6
a8q9dasaafud  redis2  global      1/1       redis:3.0.6

Create a service using an image on a private registry

如果您的图像在需要登录的私有注册表上可用,请在登录后将--with-registry-auth标志与docker service create一起使用.如果您的图像存储在registry.example.com上,这是一个私有注册表,使用如下命令:

$ docker login registry.example.com

$ docker service  create \
  --with-registry-auth \
  --name my_service \
  registry.example.com/acme/my_image:latest

这将使用加密的 WAL 日志将登录令牌从本地客户端传递到部署服务的 swarm 节点. 有了这些信息,节点就可以登录注册表并拉取镜像.

Create a service with 5 replica tasks (--replicas)

使用--replicas标志设置复制服务的副本任务数. 以下命令创建一个具有5副本任务的redis服务:

$ docker service create --name redis --replicas=5 redis:3.0.6

4cdgfyky7ozwh3htjfw0d12qv

上述命令为服务设置所需的任务数. 即使命令立即返回,服务的实际扩展也可能需要一些时间. REPLICAS列显示了服务的实际期望的副本任务数.

In the following example the desired state is 5 replicas, but the current number of RUNNING tasks is 3:

$ docker service ls

ID            NAME   MODE        REPLICAS  IMAGE
4cdgfyky7ozw  redis  replicated  3/5       redis:3.0.7

一旦所有任务都创建并RUNNING ,任务的实际数量等于所需的数量:

$ docker service ls

ID            NAME   MODE        REPLICAS  IMAGE
4cdgfyky7ozw  redis  replicated  5/5       redis:3.0.7

Create a service with secrets

使用--secret标志为容器提供对secret的访问权限.

创建一个指定密钥的服务:

$ docker service create --name redis --secret secret.json redis:3.0.6

4cdgfyky7ozwh3htjfw0d12qv

创建一个指定密钥、目标、用户/组 ID 和模式的服务:

$ docker service create --name redis \
    --secret source=ssh-key,target=ssh \
    --secret source=app-key,target=app,uid=1000,gid=1001,mode=0400 \
    redis:3.0.6

4cdgfyky7ozwh3htjfw0d12qv

要授予服务访问多个机密的权限,请使用多个--secret标志.

如果未指定目标,则秘密位于容器的/run/secrets中. 如果未指定目标,则将密钥的名称用作容器中的内存文件. 如果指定了目标,则将其用作文件名. 在上面的示例中,为每个指定的秘密目标创建了两个文件: /run/secrets/ssh/run/secrets/app .

Create a service with configs

使用--config标志为容器提供对config的访问权限.

使用配置创建服务. 配置将被挂载到redis-config中,由在容器内运行命令的用户(通常是root )拥有,并且文件模式0444或全球可读. 您可以将uidgid指定为数字 ID 或名称. 使用名称时,提供的组/用户名必须预先存在于容器中. mode指定为 4 位数序列,例如0755 .

$ docker service create --name=redis --config redis-conf redis:3.0.6

使用配置创建服务并指定目标位置和文件模式:

$ docker service create --name redis \
  --config source=redis-conf,target=/etc/redis/redis.conf,mode=0400 redis:3.0.6

要授予服务访问多个配置的权限,请使用多个--config标志.

Configs are located in / in the container if no target is specified. If no target is specified, the name of the config is used as the name of the file in the container. If a target is specified, that is used as the filename.

Create a service with a rolling update policy

$ docker service create \
  --replicas 10 \
  --name redis \
  --update-delay 10s \
  --update-parallelism 2 \
  redis:3.0.6

当您运行服务更新时,调度程序一次最多更新 2 个任务,更新间隔为10s . 有关详细信息,请参阅滚动更新教程.

Set environment variables (-e, --env)

这会为服务中的所有任务设置环境变量. 例如:

$ docker service create \
  --name redis_2 \
  --replicas 5 \
  --env MYVAR=foo \
  redis:3.0.6

要指定多个环境变量,请指定多个--env标志,每个标志都有一个单独的键值对.

$ docker service create \
  --name redis_2 \
  --replicas 5 \
  --env MYVAR=foo \
  --env MYVAR2=bar \
  redis:3.0.6

Create a service with specific hostname (--hostname)

此选项将 docker 服务容器主机名设置为特定字符串. 例如:

$ docker service create --name redis --hostname myredis redis:3.0.6

Set metadata on a service (-l, --label)

标签是将元数据应用于服务的key=value对. 使用两个标签标记服务:

$ docker service create \
  --name redis_2 \
  --label com.example.foo="bar"
  --label bar=baz \
  redis:3.0.6

有关标签的更多信息,请参阅应用自定义元数据.

Add bind mounts, volumes or memory filesystems

Docker 支持三种不同类型的挂载,允许容器在主机操作系统或内存文件系统上读取或写入文件或目录. 这些类型是数据卷(通常简称为卷)、绑定挂载tmpfs命名管道.

绑定挂载使主机上的文件或目录可用于挂载它的容器. 绑定挂载可以是只读的或读写的. 例如,容器可以通过绑定主机的/etc/resolv.conf来共享其主机的 DNS 信息,或者容器可以将日志写入其主机的/var/log/myContainerLogs目录. 如果您使用绑定挂载并且您的主机和容器在权限、访问控制或其他此类细节方面具有不同的概念,您将遇到可移植性问题.

命名卷是一种机制,用于将容器所需的持久数据与用于创建容器的映像和主机解耦. 命名卷由 Docker 创建和管理,即使当前没有容器在使用命名卷,它也会持续存在. 命名卷中的数据可以在容器和主机之间共享,也可以在多个容器之间共享. Docker 使用卷驱动程序来创建、管理和挂载卷. 您可以使用 Docker 命令备份或恢复卷.

一个 tmpfs 将一个tmpfs挂载在一个容器内以存储易失性数据.

npipe将命名管道从主机安装到容器中.

考虑您的图像启动轻量级 Web 服务器的情况. 您可以将该图像用作基础图像,复制到您网站的 HTML 文件中,然后将其打包到另一个图像中. 每次您的网站发生更改时,您都需要更新新映像并重新部署为您的网站服务的所有容器. 更好的解决方案是将网站存储在命名卷中,该卷在启动时附加到每个 Web 服务器容器. 要更新网站,您只需更新命名卷.

有关命名卷的更多信息,请参阅数据卷.

下表描述了适用于服务中的绑定挂载和命名卷的选项:

Option Required Description
type

挂载类型,可以是volumebindtmpfsnpipe . 如果未指定类型,则默认为音量.

  • :将托管卷安装到容器中.
  • bind :将主机中的目录或文件绑定挂载到容器中.
  • tmpfs : 在容器中挂载一个 tmpfs
  • npipe :将命名管道从主机挂载到容器中(仅限 Windows 容器).
src or source for type=bind and type=npipe
  • type=volumesrc是指定卷名称的可选方式(例如, src=my-volume ). 如果命名卷不存在,则会自动创建它. 如果未指定src ,则为卷分配一个随机名称,该名称保证在主机上是唯一的,但可能在集群范围内不是唯一的. is destroyed (which is upon service update , or when scaling or re-balancing the service)随机命名的卷与其容器具有相同的生命周期,并在被销毁时被销毁(在服务更新时,或者在扩展或重新平衡服务时)
  • type=bindsrc是必需的,并指定要绑定挂载的文件或目录的绝对路径(例如, src=/path/on/host/ ). 如果文件或目录不存在,则会产生错误.
  • type=tmpfs : 不支持src .

dst or destination or target

yes

容器内的挂载路径,例如/some/path/in/container/ . 如果容器的文件系统中不存在该路径,引擎会在挂载卷或绑定挂载之前在指定位置创建一个目录.

readonly or ro

引擎挂载绑定和卷读写,除非在挂载绑定或卷时给出只读选项. 请注意,为绑定挂载设置只读不会使其子挂载在当前 Linux 实现上为只读. 另请参见绑定非递归.

  • true1或无值:以只读方式安装绑定或卷.
  • false0 :挂载绑定或卷读写.

Options for Bind Mounts

以下选项只能用于绑定挂载( type=bind ):

Option Description
bind-propagation

请参阅绑定传播部分.

consistency

贴装的一致性要求; 之一

  • 默认值:等价于一致.
  • 一致:完全一致. 容器运行时和主机始终保持相同的挂载视图.
  • cached :主机对挂载的看法是权威的. 在主机上进行的更新在容器中可见之前可能会有延迟.
  • 委托:容器运行时的挂载视图是权威的. 在容器中所做的更新在主机上可见之前可能会有延迟.
bind-nonrecursive 默认情况下,子挂载也是递归绑定挂载的. 但是,当绑定挂载配置为只读选项时,此行为可能会令人困惑,因为子挂载不是以只读方式挂载的. 设置bind-nonrecursive以禁用递归绑定挂载.

值是可选的:

  • true1 :禁用递归绑定挂载.
  • false0 :如果您不提供值,则为默认值. 启用递归绑定挂载.
Bind propagation

绑定传播是指在给定绑定挂载或命名卷中创建的挂载是否可以传播到该挂载的副本. 考虑一个挂载点/mnt ,它也挂载在/tmp上. 传播设置控制/tmp/a上的挂载是否也可用于/mnt/a . 每个传播设置都有一个递归对位点. 在递归的情况下,考虑/tmp/a也被挂载为/foo . 传播设置控制/mnt/a和/或/tmp/a是否存在.

对于绑定挂载和卷挂载, bind-propagation选项默认为rprivate ,并且只能针对绑定挂载进行配置. 换句话说,命名卷不支持绑定传播.

  • shared :原始挂载的子挂载暴露给副本挂载,副本挂载的子挂载也传播到原始挂载.
  • slave :类似于共享挂载,但仅在一个方向上. 如果原始挂载暴露了子挂载,则副本挂载可以看到它. 但是,如果副本挂载暴露了子挂载,则原始挂载无法看到它.
  • private :挂载是私有的. 其中的子挂载不暴露给副本挂载,副本挂载的子挂载不暴露给原始挂载.
  • rshared :与 shared 相同,但传播也延伸到嵌套在任何原始或副本安装点内的安装点.
  • rslave :与slave相同,但传播也延伸到嵌套在任何原始或副本安装点内的安装点.
  • rprivate :默认值. 与private相同,这意味着原始或副本安装点内的任何安装点都不会在任一方向传播.

有关绑定传播的更多信息,请参阅共享子树的 Linux 内核文档.

Options for named volumes

以下选项只能用于命名卷 ( type=volume ):

Option Description
volume-driver

用于卷的卷驱动插件的名称. 默认为"local" ,如果卷不存在,则使用本地卷驱动程序创建卷.

volume-label 一个或多个自定义元数据("标签")在创建时应用于卷. 例如, volume-label=mylabel=hello-world,my-other-label=hello-mars . 有关标签的更多信息,请参阅应用自定义元数据.
volume-nocopy 默认情况下,如果您将空卷附加到容器,并且文件或目录已经存在于容器 ( dst ) 的挂载路径中,则引擎会将这些文件和目录复制到卷中,从而允许主机访问它们. 设置volume-nocopy以禁用将文件从容器的文件系统复制到卷并挂载空卷.

值是可选的:

  • true1 :如果您不提供值,则为默认值. 禁用复制.
  • false0 :启用复制.
volume-opt 特定于给定卷驱动程序的选项,将在创建卷时传递给驱动程序. 选项以逗号分隔的键/值对列表的形式提供,例如volume-opt=some-option=some-value,volume-opt=some-other-option=some-other-value . 有关给定驱动程序的可用选项,请参阅该驱动程序的文档.

Options for tmpfs

以下选项只能用于 tmpfs 挂载 ( type=tmpfs );

Option Description
tmpfs-size tmpfs 挂载的大小(以字节为单位). Linux 中默认无限制.
tmpfs-mode 八进制的 tmpfs 文件模式. (例如"700""0700" .)在 Linux 中默认为"1777" .

Differences between “--mount” and “--volume”

--mount标志支持 docker docker run-v--volume标志支持的大多数选项,但有一些重要的例外:

  • --mount标志允许您为每个卷指定卷驱动程序和卷驱动程序选项,而无需提前创建卷. 相反, docker run允许您使用--volume-driver标志指定由所有卷共享的单个卷驱动程序.

  • --mount标志允许您在创建卷之前为卷指定自定义元数据("标签").

  • 当您将--mounttype=bind一起使用时,主机路径必须引用主机上的现有路径. 不会为您创建路径,如果路径不存在,服务将失败并出现错误.

  • --mount标志不允许您使用Zz标志重新标记卷,这些标志用于selinux标记.

Create a service using a named volume

以下示例创建一个使用命名卷的服务:

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

对于服务的每个副本,引擎从部署任务的默认("本地")卷驱动程序请求一个名为"my-volume"的卷. 如果卷不存在,引擎会创建一个新卷并应用"颜色"和"形状"标签.

当任务启动时,卷被挂载在容器内的/path/in/container/上.

请注意,默认("本地")卷是本地范围的卷驱动程序. 这意味着根据任务的部署位置,该任务要么获得一个名为"my-volume"的卷,要么与同一服务的其他任务共享相同的"my-volume". 如果容器内运行的软件并非旨在处理写入同一位置的并发进程,则多个容器写入单个共享卷可能会导致数据损坏. 还要考虑到容器可以由 Swarm 编排器重新调度并部署在不同的节点上.

Create a service that uses an anonymous volume

以下命令在/path/in/container上创建具有三个具有匿名卷的副本的服务:

$ docker service create \
  --name my-service \
  --replicas 3 \
  --mount type=volume,destination=/path/in/container \
  nginx:alpine

在此示例中,没有为卷指定名称 ( source ),因此为每个任务创建一个新卷. 这保证了每个任务都有自己的卷,并且卷不会在任务之间共享. 匿名卷在使用它们的任务完成后被删除.

Create a service that uses a bind-mounted host directory

以下示例将主机目录绑定挂载到支持服务的容器中的/path/in/container中:

$ docker service create \
  --name my-service \
  --mount type=bind,source=/path/on/host,destination=/path/in/container \
  nginx:alpine

Set service mode (--mode)

服务模式确定这是复制服务还是全局服务. 复制服务运行指定数量的任务,而全局服务在集群中的每个活动节点上运行.

以下命令创建一个全局服务:

$ docker service create \
 --name redis_2 \
 --mode global \
 redis:3.0.6

Specify service constraints (--constraint)

您可以通过定义约束表达式来限制可以安排任务的节点集. 约束表达式可以使用匹配( == ) 或排除( != ) 规则. 多个约束找到满足每个表达式的节点(AND 匹配). 约束可以匹配节点或 Docker 引擎标签,如下所示:

节点属性 matches example
node.id 节点编号 node.id==2ivku8v2gvtg4
node.hostname 节点主机名 node.hostname!=node-2
node.role 节点角色( manager / worker node.role==manager
node.platform.os 节点操作系统 node.platform.os==windows
node.platform.arch 节点架构 node.platform.arch==x86_64
node.labels 用户定义的节点标签 node.labels.security==high
engine.labels Docker 引擎的标签 engine.labels.operatingsystem==ubuntu-14.04

engine.labels适用于 Docker Engine 标签,如操作系统、驱动程序等.Swarm 管理员使用 docker docker node update命令添加node.labels用于操作目的.

例如,以下将 redis 服务的任务限制为节点类型标签等于队列的节点:

$ docker service create \
  --name redis_2 \
  --constraint node.platform.os==linux \
  --constraint node.labels.type==queue \
  redis:3.0.6

如果服务约束排除了集群中的所有节点,则会打印一条消息,指出没有找到合适的节点,但是一旦合适的节点可用,调度程序将启动一个协调循环并部署服务.

在下面的示例中,未找到满足约束的节点,导致服务无法与所需状态协调:

$ docker service create \
  --name web \
  --constraint node.labels.region==east \
  nginx:alpine

lx1wrhhpmbbu0wuk0ybws30bc
overall progress: 0 out of 1 tasks
1/1: no suitable node (scheduling constraints not satisfied on 5 nodes)

$ docker service ls
ID                  NAME     MODE         REPLICAS   IMAGE               PORTS
b6lww17hrr4e        web      replicated   0/1        nginx:alpine

region=east标签添加到集群中的一个节点后,服务会进行协调,并部署所需数量的副本:

$ docker node update --label-add region=east yswe2dm4c5fdgtsrli1e8ya5l
yswe2dm4c5fdgtsrli1e8ya5l

$ docker service ls
ID                  NAME     MODE         REPLICAS   IMAGE               PORTS
b6lww17hrr4e        web      replicated   1/1        nginx:alpine

Specify service placement preferences (--placement-pref)

您可以设置服务以将任务平均分配到不同类别的节点上. 这可能有用的一个示例是在一组数据中心或可用区上平衡任务. 下面的示例说明了这一点:

$ docker service create \
  --replicas 9 \
  --name redis_2 \
  --placement-pref spread=node.labels.datacenter \
  redis:3.0.6

这将--placement-prefspread策略(目前唯一支持的策略)一起使用,将任务均匀地分布在datacenter节点标签的值上. 在此示例中,我们假设每个节点都附加了一个datacenter节点标签. 如果 swarm 中的节点之间存在此标签的三个不同值,则三分之一的任务将放置在与每个值关联的节点上. 即使具有一个值的节点多于另一个节点也是如此. 例如,考虑以下节点集:

  • 三个节点, node.labels.datacenter=east
  • node.labels.datacenter=south的两个节点
  • 一个节点, node.labels.datacenter=west

由于我们分散了datacenter标签的值,并且服务有 9 个副本,因此每个数据中心最终将有 3 个副本. 有三个节点与值east关联,因此每个节点都将获得为该值保留的三个副本之一. 有两个值为south的节点,该值的三个副本将在它们之间分配,一个接收两个副本,另一个只接收一个. 最后, west有一个节点,它将为west保留所有三个副本.

如果某一类别中的节点(例如,具有node.labels.datacenter=south的节点)由于约束或资源限制而无法处理其公平份额的任务,则如果可能,额外的任务将被分配给其他节点.

放置首选项支持引擎标签和节点标签. 上面的例子使用了一个节点标签,因为这个标签是用node.labels.datacenter引用的. 要扩展引擎标签的值,请使用--placement-pref spread=engine.labels.<labelname> .

可以向服务添加多个放置首选项. 这建立了偏好层次结构,因此任务首先被划分为一个类别,然后进一步划分为其他类别. 这可能有用的一个例子是在数据中心之间公平地划分任务,然后将每个数据中心内的任务分配到选择的机架上. 要添加多个放置首选项,请多次指定--placement-pref标志. 顺序很重要,并且在做出调度决策时将按照给定的顺序应用放置首选项.

以下示例设置具有多个放置首选项的服务. 任务首先分布在各个数据中心,然后分布在机架上(如各自标签所示):

$ docker service create \
  --replicas 9 \
  --name redis_2 \
  --placement-pref 'spread=node.labels.datacenter' \
  --placement-pref 'spread=node.labels.rack' \
  redis:3.0.6

使用 docker docker service update服务时, --placement-pref-add在所有现有放置首选项之后附加一个新的放置首选项. --placement-pref-rm删除与参数匹配的现有放置首选项.

Specify memory requirements and constraints for a service (--reserve-memory and --limit-memory)

如果您的服务需要最少的内存才能正确运行,您可以使用--reserve-memory指定该服务应该只安排在有这么多内存可用于保留的节点上. 如果没有满足条件的节点可用,则不安排任务,但仍处于挂起状态.

以下示例要求在安排服务在该节点上运行之前,在给定节点上可用和保留 4GB 内存.

$ docker service create --reserve-memory=4GB --name=too-big nginx:alpine

管理器不会在单个节点上调度一组容器,其组合预留超过该节点上可用的内存.

在计划并运行任务后, --reserve-memory不会强制执行内存限制. 使用--limit-memory确保任务在节点上使用的内存不超过给定数量. 此示例将任务使用的内存量限制为 4GB. 即使您的每个节点只有 2GB 内存,任务也会被调度,因为--limit-memory是一个上限.

$ docker service create --limit-memory=4GB --name=too-big nginx:alpine

使用--reserve-memory--limit-memory并不能保证 Docker 不会在您的主机上使用比您想要的更多的内存. 例如,您可以创建许多服务,其内存使用量的总和可能会耗尽可用内存.

您可以通过考虑主机上运行的其他(非容器化)软件来防止这种情况耗尽可用内存. 如果--reserve-memory大于或等于--limit-memory ,Docker 不会在没有足够内存的主机上调度服务. --limit-memory将限制服务的内存保持在该限制内,因此如果每个服务都设置了内存预留和限制,Docker 服务将不太可能使主机饱和. 直接在 Docker 主机上运行的其他非服务容器或应用程序仍可能耗尽内存.

这种方法有一个缺点. 保留内存还意味着您可能无法充分利用节点上的可用内存. 考虑一个在正常情况下使用 100MB 内存的服务,但根据负载可以"峰值"为 500MB. 为该服务保留 500MB(以保证可以为那些"峰值"保留 500MB)导致大部分时间浪费了 400MB 的内存.

简而言之,您可以采取更保守或更灵活的方法:

  • 保守:预留 500MB,限制为 500MB. 基本上,您现在将服务容器视为虚拟机,您可能会失去容器的一大优势,即每台主机的服务密度更高.

  • Flexible: limit to 500MB in the assumption that if the service requires more than 500MB, it is malfunctioning. Reserve something between the 100MB “normal” requirement and the 500MB “peak” requirement”. This assumes that when this service is at “peak”, other services or non-container workloads probably won’t be.

您采用的方法在很大程度上取决于工作负载的内存使用模式. 在确定方法之前,您应该在正常和峰值条件下进行测试.

在 Linux 上,您还可以使用cgroups或其他相关操作系统工具,在主机操作系统级别限制服务在给定主机上的总体内存占用.

Specify maximum replicas per node (--replicas-max-per-node)

使用--replicas-max-per-node标志设置可以在节点上运行的最大副本任务数. 以下命令创建一个 nginx 服务,其中包含 2 个副本任务,但每个节点只有一个副本任务.

这可能有用的一个示例是将一组数据中心上的任务与--placement-pref一起平衡,并让--replicas-max-per-node设置确保在维护或数据中心期间不会将副本迁移到另一个数据中心失败.

下面的示例说明了这一点:

$ docker service create \
  --name nginx \
  --replicas 2 \
  --replicas-max-per-node 1 \
  --placement-pref 'spread=node.labels.datacenter' \
  nginx

Attach a service to an existing network (--network)

您可以使用覆盖网络连接集群中的一项或多项服务.

首先,使用 docker network create 命令在管理器节点上创建覆盖网络:

$ docker network create --driver overlay my-network

etjpu59cykrptrgw0z0hk5snf

在 swarm 模式下创建覆盖网络后,所有管理器节点都可以访问网络.

当您创建服务并传递--network标志以将服务附加到覆盖网络时:

$ docker service create \
  --replicas 3 \
  --network my-network \
  --name my-web \
  nginx

716thylsndqma81j6kkkb5aus

swarm 将 my-network 扩展到运行服务的每个节点.

同一网络上的容器可以使用服务发现相互访问.

--network的长格式语法允许指定别名列表和驱动程序选项: --network name=my-network,alias=web1,driver-opt=field1=value1

Publish service ports externally to the swarm (-p, --publish)

您可以使用--publish标志发布服务端口以使它们在集群外部可用. --publish标志可以采用两种不同风格的参数. 短版本是定位的,允许您指定用冒号 ( : ) 分隔的发布端口和目标端口.

$ docker service create --name my_web --replicas 3 --publish 8080:80 nginx

还有一种长格式,更易于阅读,并允许您指定更多选项. 长格式是首选. 使用短格式时不能指定服务的模式. 以下是对与上述相同的服务使用长格式的示例:

$ docker service create --name my_web --replicas 3 --publish published=8080,target=80 nginx

您可以指定的选项是:

Option 短句法 长语法 Description
发布和目标端口 ——发布 8080:80 --发布已发布=8080,目标=80

容器内的目标端口和节点上将其映射到的端口,使用路由网格(入口)或主机级网络. 更多选项可用,在此表后面. 键值语法是首选,因为它有点自记录.

mode 无法使用短语法进行设置. --publish 已发布=8080,target=80,mode=host

用于绑定端口的模式,可以是ingresshost . 默认为入口以使用路由网格.

protocol --发布 8080:80/tcp --publish 已发布=8080,target=80,protocol=tcp

要使用的协议tcpudpsctp . 默认为tcp . 要为两种协议绑定端口,请指定-p--publish标志两次.

当您使用ingress模式发布服务端口时,群路由网格使服务可以在每个节点上的已发布端口上访问,无论该节点上是否有服务运行的任务. 如果使用host模式,则端口只绑定在运行服务的节点上,节点上的给定端口只能绑定一次. 您只能使用长语法设置发布模式. 有关更多信息,请参阅使用 swarm 模式路由网格.

Provide credential specs for managed service accounts (Windows only)

此选项仅用于使用 Windows 容器的服务. --credential-spec必须采用file://<filename>registry://<value-name>格式.

使用file://<filename>格式时,引用的文件必须存在于 docker 数据目录的CredentialSpecs子目录中,在 Windows 上默认为C:\ProgramData\Docker\ . 例如,指定file://spec.json加载C:\ProgramData\Docker\CredentialSpecs\spec.json .

当使用registry://<value-name>格式时,凭据规范是从守护进程主机上的 Windows 注册表中读取的. 指定的注册表值必须位于:

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Containers\CredentialSpecs

Create services using templates

您可以使用 Go 的text/template包提供的语法为service create的某些标志使用模板.

支持的标志如下:

  • --hostname
  • --mount
  • --env

下面列出了 Go 模板的有效占位符:

Placeholder Description
.Service.ID 服务编号
.Service.Name 服务名称
.Service.Labels 服务标签
.Node.ID 节点编号
.Node.Hostname 节点主机名
.Task.ID 任务编号
.Task.Name 任务名称
.Task.Slot 任务槽

Template example

在这个例子中,我们将根据服务的名称、节点的 ID 和它所在的主机名来设置创建容器的模板.

$ docker service create \
    --name hosttempl \
    --hostname="{{.Node.Hostname}}-{{.Node.ID}}-{{.Service.Name}}"\
    busybox top

va8ew30grofhjoychbr6iot8c

$ docker service ps va8ew30grofhjoychbr6iot8c

ID            NAME         IMAGE                                                                                   NODE          DESIRED STATE  CURRENT STATE               ERROR  PORTS
wo41w8hg8qan  hosttempl.1  busybox:latest@sha256:29f5d56d12684887bdfa50dcd29fc31eea4aaf4ad3bec43daf19026a7ce69912  2e7a8a9c4da2  Running        Running about a minute ago

$ docker inspect --format="{{.Config.Hostname}}" 2e7a8a9c4da2-wo41w8hg8qanxwjwsg4kxpprj-hosttempl

x3ti0erg11rjpg64m75kej2mz-hosttempl

Specify isolation mode (Windows)

默认情况下,计划在 Windows 节点上的任务使用为此特定节点配置的默认隔离模式运行. 要强制使用特定的隔离模式,您可以使用--isolation标志:

$ docker service create --name myservice --isolation=process microsoft/nanoserver

Windows 上支持的隔离模式有:

  • default :使用在运行任务的节点上指定的默认设置
  • process :使用进程隔离(仅限 Windows 服务器)
  • hyperv :使用 Hyper-V 隔离

Create services requesting Generic Resources

您可以通过使用--generic-resource标志来缩小您的任务可以登陆的节点类型(如果节点宣传这些资源):

$ docker service create \
    --name cuda \
    --generic-resource "NVIDIA-GPU=2" \
    --generic-resource "SSD=1" \
    nvidia/cuda

Running as a job

作业是一种特殊的服务,旨在将操作运行到完成然后停止,而不是运行长时间运行的守护程序. 当属于某个作业的 Task 成功退出(返回值 0)时,该 Task 被标记为"Completed",不再运行.

作业通过使用两种模式之一启动, replicated-jobglobal-job

$ docker service create --name myjob \
                        --mode replicated-job \
                        bash "true"

此命令将运行一个任务,该任务将使用bash映像执行命令true ,该命令将返回 0 然后退出.

尽管 Jobs 最终是一种不同类型的服务,但与其他服务相比,它们有几点需要注意:

  • 更新或回滚配置选项均无效. 作业可以更新,但不能推出或回滚,这使得这些配置选项没有实际意义.
  • 作业在达到Complete状态时永远不会重新启动. 这意味着对于作业,将--restart-condition设置为any与将其设置为on-failure相同.

作业在复制模式和全局模式下都可用.

Replicated Jobs

复制的作业就像复制的服务. 设置--replicas标志将指定要执行的作业的迭代总数.

默认情况下,复制作业的所有副本将立即启动. 要控制任何时候同时执行的副本总数,可以使用--max-concurrent标志:

$ docker service create \
    --name mythrottledjob \
    --mode replicated-job \
    --replicas 10 \
    --max-concurrent 2 \
    bash "true"

上面的命令将总共执行 10 个任务,但在任何给定时间只会运行其中的 2 个.

Global Jobs

全局作业类似于全局服务,因为任务在每个匹配放置约束的节点上执行一次. 全局作业由模式global-job表示.

请注意,在创建全局作业后,添加到集群的任何新节点都将在其上启动该作业的任务. 全局作业作为一个整体并没有"完成"状态,除非每个满足作业约束的节点都有一个已完成的任务.

Parent command

Command Description
码头服务 管理服务
Command Description
码头工人服务创建 创建新服务
码头工人服务检查 显示一项或多项服务的详细信息
码头工人服务日志 获取服务或任务的日志
码头工人服务 列出服务
码头工人服务ps 列出一项或多项服务的任务
码头服务区 删除一项或多项服务
docker服务回滚 恢复对服务配置的更改
docker service scale 扩展一个或多个复制服务
码头工人服务更新 更新服务

by  icopy.site