在线文档教程
Docker 17
引擎: CLI | Engine: CLI

docker service create

创建 docker service

描述

创建新服务

使用

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

备选方案

名字,简写默认描述
--config指定配置以暴露给服务
--constraint 展示位置限制
--container-label 容器标签
--credential-spec 托管服务帐户的凭证规范(仅限Windows)
--detach,-d真正立即退出,而不是等待服务收敛
--dns设置自定义DNS服务器
--dns-option 设置DNS选项
--dns-search 设置自定义DNS搜索域
--endpoint-mode 要人端点模式(vip或dnsrr)
--entrypoint 覆盖图像的默认入口点
--env,-e设置环境变量
--env-file 读入环境变量文件
--group 为容器设置一个或多个补充用户组
--health-cmd 运行以检查运行状况的命令
--health-interval 运行检查之间的时间(ms | s | m | h)
--health-retries 0需要报告不健康的连续失败
--health-start-period 在重新计数到不稳定(ms | s | m | h)之前,容器初始化的开始时间段
--health-timeout 允许一次检查运行的最长时间(ms | s | m | h)
--host 设置一个或多个自定义主机到IP映射(主机:IP)
--hostname 容器主机名
--label, -l 服务标签
--limit-CPU限制CPU
--limit-memory 0限制记忆
--log-driver 记录驱动程序的服务
--log-OPT记录驱动程序选项
--mode 复制服务模式(复制或全局)
--mount 将文件系统挂载附加到服务
--name服务名称
--network 网络附件
--no-healthcheck 禁用任何容器指定的HEALTHCHECK
--no-resolve-image 不要查询注册表来解析图像摘要和支持的平台
--placement-PREF添加展示位置首选项
--publish,-p将端口发布为节点端口
--quiet,-q抑制进度输出
--read-only 将容器的根文件系统挂载为只读
--replicas任务数量
--reserve-CPU预留CPU
--reserve-memory 0保留内存
--restart-condition 满足条件时重新启动(“none”|“on-failure”|“any”)(默认为“any”)
--restart-delay 重启尝试之间的延迟(ns | us | ms | s | m | h)(默认5秒)
--restart-max-attempts 放弃前的最大重启次数
--restart-window 用于评估重新启动策略的窗口(ns | us | ms | s | m | h)
--rollback-delay 0任务回滚之间的延迟(ns | us | ms | s | m | h)(默认值为0)
--rollback-failure-action 回滚失败的操作(“暂停”|“继续”)(默认“暂停”)
--rollback-max-failure-ratio 0在回滚期间容忍的失败率(默认0)
--rollback-monitor 0(ns | us | ms | s | m | h)(默认5秒)每个任务回滚之后的持续时间
--rollback-order 回滚顺序(“start-first”|“stop-first”)(默认“stop-first”)
--rollback-parallelism 1同时回滚的任务的最大数量(0一次全部回滚)
--secret 指定泄露给服务的秘密
--stop-grace-period 强制杀死一个容器之前等待的时间(ns | us | ms | s | m | h)(默认10秒)
--stop-signal 停止容器的信号
--tty, -t 分配一个伪TTY
--update-delay 0更新之间的延迟(ns | us | ms | s | m | h)(默认为0)
--update-failure-action 更新失败的操作(“暂停”|“继续”|“回滚”)(默认“暂停”)
--update-max-failure-ratio 0更新期间容许的失败率(默认0)
--update-monitor 0(ns | us | ms | s | m | h)(默认5秒)每个任务更新后的持续时间
--update-order 更新顺序(“start-first”|“stop-first”)(默认为“stop-first”)
--update-parallelism 1同时更新的最大任务数(0个一次全部更新)
--user,-u用户名或UID(格式:<名称| uid>:<组| gid>)
--with-registry-auth 向注册代理发送注册表认证详细信息
--workdir,-w容器内的工作目录

父命令

命令描述
docker service 管理服务

相关命令

命令描述
docker service create 创建一项新服务
docker service inspect 显示一项或多项服务的详细信息
docker service logs 获取服务或任务的日志
docker service ls 列出服务
docker service ps 列出一项或多项服务的任务
docker service rm 删除一项或多项服务
docker service scale 扩展一个或多个复制服务
docker service update 更新服务

扩展描述

创建由指定参数描述的服务。必须在管理器节点上运行此命令。

实例

创建服务

$ 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

创建一个包含5个副本任务的服务%28-副本%29

使用--replicas标志设置复制服务的副本任务数。下面的命令创建一个redis5复制任务:

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

上面的命令设置所需服务的任务数。即使命令立即返回,实际的服务扩展可能需要一些时间。大REPLICAS列显示两个实际所需服务的复制任务数。

在下面的示例中,所需的状态为5复制,但是当前的数量RUNNING任务是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

创建一个包含秘密的服务

使用该--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指定的每个秘密目标。

使用滚动更新策略创建服务

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

当你运行一个服务更新,调度程序一次最多更新2个任务,使用10s在更新之间。有关详细信息,请参阅滚动更新教程...

设置环境变量(-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

使用特定主机名(-hostname)创建服务

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

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

在服务上设置元数据(-l,-label)

标签是key=value将元数据应用于服务的对。若要将服务标记为两个标签,请执行以下操作:

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

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

添加绑定挂载或 volume

Docker 支持两种不同的安装方式,允许容器读取或写入其他容器或主机操作系统上的文件或目录。这些类型是数据卷(通常简称为volume)和绑定挂载。

另外,Docker 支持tmpfs挂载。

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

命名卷是一种机制,用于将容器所需的持久性数据与用于创建容器的映像和主机机器分离。 命名卷由Docker创建和管理,即使当前没有容器正在使用它,命名卷仍然存在。 命名卷中的数据可以在容器和主机之间共享,也可以在多个容器之间共享。 Docker使用卷驱动来创建,管理和安装卷。 您可以使用Docker命令备份或恢复卷。

tmpfs 在容器内挂载 tmpfs 以获取易失性数据。

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

有关命名卷的详细信息,请参阅数据量

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

选项需要描述
类型mount的类型可以是volume,bind或tmpfs。如果没有指定类型,则默认为音量。卷:将托管卷装入容器。bind:将主机上的目录或文件绑定到容器中。tmpfs:在容器中安装一个tmpfs
src或来源对于type = bind only>type = volume:src是指定卷名称的可选方式(例如,src = my-volume)。如果指定的卷不存在,则会自动创建。如果未指定src,则会为该卷指定一个随机名称,该名称在主机上保证是唯一的,但可能不是群集范围内唯一的。一个随机命名的卷具有与其容器相同的生命周期,并且在容器被销毁时(这是在服务更新时,或者在扩展或重新平衡服务时)被销毁。type = bind:src是必需的,并指定绝对路径到文件或目录进行绑定挂载(例如,src = / path / on / host /)。如果文件或目录不存在,则会产生错误。type = tmpfs:src不受支持。
dst或目标或目标装入容器内的路径,例如/ some / path / in / container /。如果路径不存在于容器的文件系统中,则引擎会在挂载卷或绑定挂载之前在指定位置创建一个目录。
只读或ro除非在安装绑定或卷时提供只读选项,否则引擎将挂接和卷读写。true或1或没有值:将绑定或卷装载为只读。假或0:装入绑定或卷读写。
一致性底座的一致性要求; 默认值之一:等同于一致。一致:完全一致。容器运行时和主机始终保持相同的安装视图。缓存:主机的装载视图是权威的。在主机上进行的更新在容器内可见之前可能会有延迟。委托:容器运行时的挂载视图是权威的。在容器中进行的更新可能会在主机上可见之前出现延迟。

  • 卷:安装管理量放进容器里。

  • 绑定:绑定-将一个目录或文件从主机装载到容器中。

  • tmpfs:在容器中安装tmpfs

**src** or **source** for type=bind only>

  • type = volume:src是指定卷名称的可选方式(例如,src = my-volume)。如果指定的卷不存在,则会自动创建。如果未指定 src,则会为该卷指定一个随机名称,该名称在主机上保证是唯一的,但可能不是群集范围内唯一的。随机命名卷具有相同的生命周期为容器,并且当被破坏容器被销毁(这是在服务更新,或缩放或重新平衡服务时)

  • type = bind:src 是必需的,并指定要绑定挂载的文件或目录的绝对路径(例如,src = / path / on / host /)。如果文件或目录不存在,则会产生错误。

  • type = tmpfs:src 不受支持。

**dst** or **destination** or **target** yes Mount path inside the container, for example /some/path/in/container/. If the path does not exist in the container's filesystem, the Engine creates a directory at the specified location before mounting the volume or bind-mount.

**readonly** or **ro** The Engine mounts binds and volumes read-write unless readonly option is given when mounting the bind or volume.

  • true 或1或没有值:将绑定或卷装载为只读。

  • false或0:挂载绑定或卷读写。

**consistency** The consistency requirements for the mount; one of

  • 默认值:等效于一致。

  • 一致性:完全一致。容器运行时和主机始终保持相同的挂载视图。

  • 缓存:主机的装载视图是权威的。在主机上进行的更新在容器内可见之前可能会有延迟。

  • 委托:容器运行时的挂载视图是权威的。在容器中进行的更新可能会在主机上可见之前出现延迟。

约束传播

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

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

  • shared:原始安装的子安装会暴露给副本安装,并且副安装的子安装也会传播到原始安装。

  • slave:类似于共享安装,但仅限于一个方向。如果原始安装展示了一个子安装,则副本安装可以看到它。但是,如果副本安装程序公开了子安装,则原始安装程序无法看到它。

  • private:挂载是私人的。其中的子安装不会暴露给副本安装,并且副安装的子安装不会暴露给原始安装。

  • rshared:与共享相同,但传播也扩展到嵌套在任何原始或副本安装点内的挂载点。

  • rslave*与slave,但是传播还扩展到嵌套在任何原始或复制挂载点内的挂载点。

  • rprivate*缺省值。同private,这意味着在原始或复制挂载点中的任何位置都不会向任意方向传播挂载点。

有关绑定传播的详细信息,请参阅Linux kernel documentation for shared subtree.

指定卷的选项

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

选项描述
volume-driver 用于卷的卷驱动程序插件的名称。如果该卷不存在,则默认为“本地”,以使用本地卷驱动程序创建卷。
volume-label 创建时应用于卷的一个或多个自定义元数据(“标签”)。例如,volume-label=mylabel=hello-world,my-other-label=hello-mars。有关标签的更多信息,请参阅应用自定义元数据。
volume-nocopy 默认情况下,如果您将空卷附加到容器,并且文件或目录已经存在于容器中的安装路径(dst)中,则引擎会将这些文件和目录复制到卷中,以便主机访问它们。设置volume-nocopy为禁用将容器文件系统中的文件复制到卷并挂载空卷。值是可选的:如果不提供值,则为true或1:默认值。禁用复制。假或0:启用复制。
volume-opt 特定于给定卷驱动程序的选项,将在创建卷时传递给驱动程序。选项以逗号分隔的键/值对列表形式提供,例如,volume-opt = some-option = some-value,volume-opt = some-other-option = some-other-value。有关给定驱动程序的可用选项,请参阅该驱动程序的文档。

  • 如果您没有提供值,则为 true 或1:默认值。禁用复制。

  • FALSE或0:启用复制。

**volume-opt** Options specific to a given volume driver, which will be passed to the driver when creating the volume. Options are provided as a comma-separated list of key/value pairs, for example, volume-opt=some-option=some-value,volume-opt=some-other-option=some-other-value. For available options for a given driver, refer to that driver's documentation.

tmpfs选项

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

选项描述
tmpfs的大小tmpfs的大小,以字节为单位。Linux中默认无限制。
tmpfs的模式tmpfs的八进制文件模式。(例如“700”或“0700”)。在Linux中默认为“1777”。

“-挂载”和“-卷”的区别

--mount属性支持的大多数选项。-v--volume标志docker run,除了一些重要的例外:

  • --mount标志允许您指定卷驱动程序和卷驱动程序选项。每卷,而不预先创建卷。相反,docker run允许您指定由所有卷共享的单个卷驱动程序,使用--volume-driver标志。

  • --mount标志允许您在卷创建之前指定卷的自定义元数据(“标签”)。

  • 当你使用--mount带着type=bind,主机路径必须引用现有主机上的路径。将不会为您创建路径,如果路径不存在,则服务将失败。

  • --mount标志不允许您将卷重新命名为Zz标志,用于selinux贴标签。

使用命名卷创建服务

下面的示例创建使用命名卷的服务:

$ 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” 的卷,或与同一服务的其他任务共享相同的“我的卷”。如果容器内运行的软件不是用来处理写入同一位置的并发进程的,则写入单个共享卷的多个容器可能会导致数据损坏。还要考虑到容器可以由 Swarm 协调器重调度并部署在不同的节点上。

创建使用匿名卷的服务

下面的命令创建一个带有三个副本的服务,其中包含一个匿名卷。/path/in/container*

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

在此示例中,没有source为该卷指定 name(),因此会为每个任务创建一个新卷。这可以确保每个任务都获得自己的卷,并且不会在任务之间共享卷。完成使用任务后,匿名卷将被删除。

创建使用绑定挂载主机目录的服务。

下面的示例绑定-将主机目录安装在/path/in/container在支持服务的容器中:

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

设置服务模式( - 模式)

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

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

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

指定服务约束(-constraint)

您可以通过定义约束表达式来限制可以调度任务的节点集合。多个约束找到满足每个表达式的节点(AND匹配)。约束可以与节点或Docker引擎标签匹配,如下所示:

node attributematchesexample
node.idNode IDnode.id == 2ivku8v2gvtg4
node.hostnameNode hostnamenode.hostname != node-2
node.roleNode rolenode.role == manager
node.labelsuser defined node labelsnode.labels.security == high
engine.labelsDocker Engine's labelsengine.labels.operatingsystem == ubuntu 14.04

engine.labels适用于 Docker Engine 标签,例如操作系统,驱动程序等。群集管理员node.labels通过使用该docker node update命令添加用于操作目的。

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

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

指定服务布局偏好(-placement-pref)

您可以设置该服务,以便在不同的节点类别上平均划分任务。其中一个有用的例子是在一组数据中心或可用性区域上平衡任务。下面的例子说明了这一点:

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

--placement-prefspread策略(当前唯一支持的策略)一起使用,以将任务均匀分布在datacenter节点标签的值上。在这个例子中,我们假设每个节点都datacenter附有一个节点标签。如果群体中的节点之间存在三个不同的标签值,则三分之一的任务将被放置在与每个值相关的节点上。即使有更多的节点具有一个值而不是另一个值,情况也是如此。例如,请考虑以下一组节点:

  • 三节点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 service update--placement-pref-add在所有现有展示位置偏好设置之后追加新的展示位置偏好设置。--placement-pref-rm删除与参数匹配的现有展示位置偏好设置。

将服务附加到现有网络( - 网络)

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

首先,在管理器节点上创建一个覆盖网络---docker网络创建命令:

$ docker network create --driver overlay my-network etjpu59cykrptrgw0z0hk5snf

在以群集模式创建覆盖网络之后,所有管理器节点都可以访问该网络。

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

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

群将My-Network扩展到运行服务的每个节点。

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

在群外发布服务端口(-p,-publish)

您可以发布服务端口,使它们在外部可用给群集,使用--publish

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

例如:

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

当您发布服务端口时,群路由网格使服务可以在每个节点上的目标端口上访问,而不管该节点上是否有运行该服务的任务。有关更多信息,请参阅使用群模式路由网格...

仅为tcp或udp发布端口。

默认情况下,当发布端口时,它是 TCP 端口。您可以专门发布UDP 端口,而不是 TCP 端口,也可以是 TCP 端口之外的端口。当您同时发布 TCP 和 UDP 端口时,Docker 1.12.2 和更早版本要求您添加后缀/tcp对于 TCP 端口。否则它是可选的。

仅TCP

以下两个命令是等价的。

$ docker service create --name dns-cache -p 53:53 dns-cache $ docker service create --name dns-cache -p 53:53/tcp dns-cache

TCP和UDP

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

仅UDP

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

提供托管服务帐户的凭证规格(仅限 Windows)

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

当使用file://<filename>格式时,引用的文件必须出现在CredentialSpecs在docker数据目录中的子目录,该子目录默认为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

使用模板创建服务

的一些标志可以使用模板。service create,使用Go‘s提供的语法。文本/模板包裹。

支持的标志如下:

  • --hostname

  • --mount

  • --env

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

PlaceholderDescription
.Service.IDService ID
.Service.NameService name
.Service.LabelsService labels
.Node.IDNode ID
.Task.IDTask ID
.Task.NameTask name
.Task.SlotTask slot

模板示例

在这个例子中,我们将根据服务的名称和节点的ID设置创建容器的模板。

$ docker service create --name hosttempl \ --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}}" hosttempl.1.wo41w8hg8qanxwjwsg4kxpprj x3ti0erg11rjpg64m75kej2mz-hosttempl