docker服务创建
描述
创建一个新服务
API 1.24+
客户端和守护程序API都必须至少为
1.24,
才能使用此命令。docker version
在客户端上使用命令检查客户端和守护程序API版本。
Swarm此命令与Swarm协调器一起使用。
用法
$ docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]
扩展说明
按照指定的参数创建服务。
笔记
这是集群管理命令,必须在集群管理器节点上执行。要了解管理人员和工作人员,请参阅文档中的“ 群集模式”部分。
有关此命令的示例用法,请参阅下面的示例部分。
选项
名称,简写 | 默认 | 描述 |
--cap-add |
API 1.41+ 添加Linux功能 |
|
--cap-drop |
API 1.41+ Drop Linux功能 |
|
--config |
API 1.30+ 指定要向服务公开的配置 |
|
--constraint |
放置约束 | |
--container-label |
容器标签 | |
--credential-spec |
适用于托管服务帐户的API 1.29+凭据规范(仅Windows) |
|
--detach , -d |
API 1.29+ 立即退出,而不是等待服务收敛 |
|
--dns |
API 1.25+ 设置自定义DNS服务器 |
|
--dns-option |
API 1.25+ 设置DNS选项 |
|
--dns-search |
API 1.25+ 设置自定义DNS搜索域 |
|
--endpoint-mode |
vip |
端点模式(vip或dnsrr) |
--entrypoint |
覆盖图像的默认ENTRYPOINT | |
--env , -e |
设置环境变量 | |
--env-file |
读入环境变量文件 | |
--generic-resource |
用户定义的资源 | |
--group |
API 1.25+ 为容器设置一个或多个补充用户组 |
|
--health-cmd |
API 1.25+ 命令运行以检查运行状况 |
|
--health-interval |
API 1.25+ 运行检查之间的时间(ms | s | m | h) |
|
--health-retries |
需要报告API 1.25以上的API 1.25+连续故障 |
|
--health-start-period |
API 1.29+ 容器初始化的开始时间,然后计算对不稳定的重试次数(ms | s | m | h) |
|
--health-timeout |
API 1.25+ 允许执行一次检查的最长时间(ms | s | m | h) |
|
--host |
API 1.25+ 设置一个或多个自定义主机到IP的映射(host:ip) |
|
--hostname |
API 1.25+ 容器主机名 |
|
--init |
API 1.37+ 在每个服务容器中使用init来转发信号并获取进程 |
|
--isolation |
API 1.35+ 服务容器隔离模式 |
|
--label , -l |
服务标签 | |
--limit-cpu |
限制CPU | |
--limit-memory |
限制记忆 | |
--limit-pids |
API 1.41+ Swarm Limit最大进程数(默认0 =无限) |
|
--log-driver |
记录驱动程序以进行服务 | |
--log-opt |
记录驱动程序选项 | |
--max-concurrent |
API 1.41+ 要同时运行的作业任务数(默认等于--replicas) |
|
--mode |
replicated |
服务模式(复制,全局,复制作业或全局作业) |
--mount |
将文件系统挂载附加到服务 | |
--name |
服务名称 | |
--network |
网络附件 | |
--no-healthcheck |
API 1.25+ 禁用任何容器指定的健康检查 |
|
--no-resolve-image |
API 1.30+ 请勿查询注册表来解析图像摘要和支持的平台 |
|
--placement-pref |
API 1.28+ 添加展示位置偏好设置 |
|
--publish , -p |
将端口发布为节点端口 | |
--quiet , -q |
禁止进度输出 | |
--read-only |
API 1.28+ 将容器的根文件系统挂载为只读 |
|
--replicas |
任务数 | |
--replicas-max-per-node |
API 1.40+ 每个节点的最大任务数(默认0 =无限) |
|
--reserve-cpu |
备用CPU | |
--reserve-memory |
保留记忆 | |
--restart-condition |
满足条件时重新启动(“无” |“发生故障” |“任何”)(默认为“任何”) | |
--restart-delay |
重新启动尝试之间的延迟时间(ns | us | ms | s | m | h)(默认为5s) | |
--restart-max-attempts |
放弃之前的最大重新启动次数 | |
--restart-window |
用于评估重启策略的窗口(ns | us | ms | s | m | h) | |
--rollback-delay |
API 1.28+ 任务回滚之间的延迟(ns | us | ms | s | m | h)(默认为0s) |
|
--rollback-failure-action |
API 1.28+ 对回滚失败的操作(“暂停” |“继续”)(默认为“暂停”) |
|
--rollback-max-failure-ratio |
API 1.28+ 在回滚期间可以容忍的故障率(默认为0) |
|
--rollback-monitor |
API 1.28+ 每个任务回滚后监视失败的持续时间(ns | us | ms | s | m | h)(默认为5s) |
|
--rollback-order |
API 1.29+ 回滚顺序(“先启动” |“先停止”)(默认为“先停止”) |
|
--rollback-parallelism |
1 |
API 1.28+ 同时回滚的最大任务数(0一次回滚所有任务) |
--secret |
API 1.25+ 指定要公开给服务的机密 |
|
--stop-grace-period |
强制杀死容器之前等待的时间(ns | us | ms | s | m | h)(默认为10s) | |
--stop-signal |
API 1.28+ 停止容器的信号 |
|
--sysctl |
API 1.40+ Sysctl选项 |
|
--tty , -t |
API 1.25+ 分配伪TTY |
|
--ulimit |
API 1.41+ Ulimit选项 |
|
--update-delay |
更新之间的延迟(ns | us | ms | s | m | h)(默认为0s) | |
--update-failure-action |
更新失败时的操作(“暂停” |“继续” |“回滚”)(默认为“暂停”) | |
--update-max-failure-ratio |
更新期间可容忍的API 1.25+失败率(默认为0) |
|
--update-monitor |
API 1.25+ 每个任务更新后的持续时间,以监视失败(ns | us | ms | s | m | h)(默认为5s) |
|
--update-order |
API 1.29+ 更新顺序(“先启动” |“先停止”)(默认为“先停止”) |
|
--update-parallelism |
1 |
同时更新的最大任务数(一次更新为0) |
--user , -u |
用户名或UID(格式:<名称| uid> [:<组| gid>]) | |
--with-registry-auth |
将注册表身份验证详细信息发送给群集代理 | |
--workdir , -w |
容器内的工作目录 |
例子
创建服务
$ 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
使用私有注册表上的映像创建服务
如果您的映像在需要登录的私有注册表上可用,请在登录后使用--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节点。有了这些信息,节点便能够登录到注册表并提取映像。
创建具有5个副本任务(--replicas)的服务
使用该--replicas
标志设置复制服务的副本任务数。以下命令创建redis
具有5
副本任务的服务:
$ 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
为指定的每个秘密目标。
使用配置创建服务
使用该--config
标志可以使容器访问
config。
使用配置创建服务。配置将被安装到中redis-config
,由在容器内运行命令的用户所有(通常为root
),并具有文件模式0444
或世界可读性。您可以将uid
和指定gid
为数字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
标志。
/
如果未指定目标,则配置位于容器中。如果未指定目标,则将配置的名称用作容器中文件的名称。如果指定了目标,则将其用作文件名。
使用滚动更新策略创建服务
$ 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服务容器的主机名设置为特定字符串。例如:
$ 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
有关标签的更多信息,请参阅应用自定义元数据。
添加绑定挂载,卷或内存文件系统
Docker支持三种不同类型的挂载,这些挂载允许容器在主机操作系统或内存文件系统上读取或写入文件或目录。这些类型是数据卷(通常简称为卷),绑定安装,tmpfs和命名管道。
甲绑定安装使其可被安装在容器内的主机上的文件或目录。绑定安装可以是只读的也可以是读写的。例如,容器可以通过主机的绑定安装来共享其主机的DNS信息,/etc/resolv.conf
或者容器可以将日志写入其主机的/var/log/myContainerLogs
目录中。如果使用绑定安装,并且主机和容器具有不同的权限,访问控制或其他此类详细信息概念,则会遇到可移植性问题。
一个名为量是脱钩用于创建容器的图像和从主机通过你的容器需要持久性数据的机制。命名卷是由Docker创建和管理的,即使当前没有容器在使用它,命名卷也将保留。命名卷中的数据可以在容器和主机之间以及在多个容器之间共享。Docker使用卷驱动程序来创建,管理和安装卷。您可以使用Docker命令备份或还原卷。
tmpfs将tmpfs装入容器中以存储易失性数据。
一个npipe从主机到容器安装命名管道。
考虑一下您的映像启动轻量级Web服务器的情况。您可以将该图像用作基本图像,复制到网站的HTML文件中,然后将其打包到另一个图像中。每次您的网站更改时,您都需要更新新图像并重新部署为您的网站提供服务的所有容器。更好的解决方案是将网站存储在命名卷中,该卷在启动时将附加到每个Web服务器容器。要更新网站,您只需更新命名卷。
有关命名卷的更多信息,请参见 数据卷。
下表描述了适用于服务中的绑定安装和命名卷的选项:
选项 | 必需的 | 描述 |
---|---|---|
类型 |
挂载的类型可以是volume,bind,tmpfs或npipe。如果未指定类型,则默认为音量。
|
|
src或来源 | 对于type = bind和type = npipe |
|
DST或目的地或目标 |
是的 |
在容器内部安装路径,例如/ some / path / in / container /。如果该路径在容器的文件系统中不存在,则引擎在装入卷或绑定装入之前,在指定位置创建目录。 |
只读或RO |
引擎将绑定和卷以读写方式安装,除非在安装绑定或卷时给出了readonly选项。请注意,在当前Linux实现中,将绑定安装设置为只读不会使其子安装变为只读。另请参见bind-nonrecursive。
|
绑定安装的选项
以下选项只能用于绑定安装(type=bind
):
选项 | 描述 |
---|---|
绑定传播 |
请参阅绑定传播部分。 |
一致性 |
安装的一致性要求;之一
|
绑定非递归 |
默认情况下,子安装也是递归绑定安装的。但是,当使用只读选项配置绑定安装时,此行为可能会造成混淆,因为子安装不会以只读方式安装。设置bind-nonrecursive禁用递归绑定安装。 值是可选的:
|
绑定传播
绑定传播是指是否可以将在给定绑定安装或命名卷中创建的安装传播到该安装的副本。考虑一个安装点/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内核文档中的共享子树。
命名卷的选项
以下选项只能用于命名卷(type=volume
):
选项 | 描述 |
---|---|
音量驱动器 |
用于该卷的卷驱动程序插件的名称。默认为 “ local”,如果卷不存在,则使用本地卷驱动程序来创建卷。 |
体积标识 | 创建时将一个或多个自定义元数据(“标签”)应用于卷。例如, volume-label = mylabel = hello-world,my-other-label = hello-mars。有关标签的更多信息,请参阅 应用自定义元数据。 |
不复制 |
默认情况下,如果将空卷附加到容器上,并且容器(dst)的安装路径中已经存在文件或目录,则引擎会将这些文件和目录复制到该卷中,以允许主机访问它们。设置volume-nocopy以禁用将文件从容器的文件系统复制到该卷并装入空卷。 值是可选的:
|
体积选择 | 给定的卷驱动程序特定的选项,在创建卷时将传递给该驱动程序。选项以键/值对的逗号分隔列表形式提供,例如, volume-opt = some-option = some-value,volume-opt = some-other-option = some-other-value。有关给定驱动程序的可用选项,请参阅该驱动程序的文档。 |
tmpfs的选项
以下选项只能用于tmpfs挂载(type=tmpfs
);
选项 | 描述 |
---|---|
tmpfs大小 | tmpfs安装的大小(以字节为单位)。在Linux中,默认情况下不受限制。 |
tmpfs模式 | tmpfs的文件模式(八进制)。(例如“ 700”或“ 0700”。)在Linux中默认为“ 1777”。 |
“ --mount”和“ --volume”之间的区别
该--mount
标志支持由支持的大多数选项-v
或--volume
标志docker run
,有一些重要的例外情况:
-
该
--mount
标志允许您指定音量驱动器和音量驱动程序选项每卷,而无需预先创建的卷。相反,docker run
允许您使用该--volume-driver
标志指定由所有卷共享的单个卷驱动程序。 -
该
--mount
标志允许您在创建卷之前为卷指定自定义元数据(“标签”)。 -
--mount
与配合使用时type=bind
,主机路径必须引用主机上的现有 路径。如果该路径不存在,将不会为您创建该路径,并且服务将失败并显示错误。 -
该
--mount
标记不允许您使用Z
或z
标记来重新标记卷,该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”的 新卷,或者与同一服务的其他任务共享同一“ my-volume”。如果在容器中运行的软件未设计为处理写入同一位置的并发进程,则写入单个共享卷的多个容器可能会导致数据损坏。还应考虑到容器可以由Swarm协调器重新安排,并可以部署在其他节点上。
创建使用匿名卷的服务
以下命令创建一个服务,该服务具有三个副本,并且其副本在上具有一个匿名卷/path/in/container
:
$ docker service create \
--name my-service \
--replicas 3 \
--mount type=volume,destination=/path/in/container \
nginx:alpine
在此示例中,未source
为卷指定名称(),因此将为每个任务创建一个新卷。这保证了每个任务都有自己的卷,并且在任务之间不共享卷。使用匿名卷的任务完成后,将删除它们。
创建使用绑定安装的主机目录的服务
以下示例/path/in/container
在支持服务的容器中将主机目录绑定安装到:
$ docker service create \
--name my-service \
--mount type=bind,source=/path/on/host,destination=/path/in/container \
nginx:alpine
设置服务模式(--mode)
服务模式确定这是复制服务还是全局 服务。复制的服务运行指定数量的任务,而全局服务在群集中的每个活动节点上运行。
以下命令创建一个全局服务:
$ docker service create \
--name redis_2 \
--mode global \
redis:3.0.6
指定服务约束(--constraint)
您可以通过定义约束表达式来限制可以安排任务的节点集。约束表达式可以使用match(==
)或exclude(!=
)规则。多个约束会找到满足每个表达式(AND匹配)的节点。约束可以匹配节点或Docker Engine标签,如下所示:
节点属性 | 火柴 | 例子 |
---|---|---|
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的标签 | engine.labels.operatingsystem==ubuntu-14.04 |
engine.labels
应用于Docker Engine标签,例如操作系统,驱动程序等。Swarm管理员node.labels
通过使用docker node update
命令添加这些元素以用于操作目的。
例如,以下将redis服务的任务限制为节点类型标签等于queue的节点:
$ 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
指定服务放置首选项(--placef-pref)
您可以设置服务以将任务平均分配到不同类别的节点上。可能有用的一个示例是在一组数据中心或可用性区域上平衡任务。下面的示例说明了这一点:
$ docker service create \
--replicas 9 \
--name redis_2 \
--placement-pref spread=node.labels.datacenter \
redis:3.0.6
这--placement-pref
与spread
策略(当前是唯一受支持的策略)一起使用,以将任务平均分配到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
删除与参数匹配的现有展示位置偏好设置。
指定服务的内存要求和约束(--reserve-memory和--limit-memory)
如果您的服务需要最少的内存量才能正常运行,则可以使用--reserve-memory
该选项指定仅在可保留这么多内存的节点上调度该服务。如果没有满足该条件的可用节点,则该任务未安排,但仍处于挂起状态。
以下示例要求在计划将服务安排在该节点上运行之前,在给定节点上必须有4GB的内存可用。
$ docker service create --reserve-memory=4GB --name=too-big nginx:alpine
管理器不会在单个节点上安排一组容器,这些容器的组合预留量超过该节点上的可用内存。