Docker运行引用
Docker 在独立的容器中运行进程。容器是一个在主机上运行的进程。主机可能是本地或远程的。当运营商执行时docker run
,运行的容器进程是独立的,因为它拥有自己的文件系统,自己的网络以及独立于主机的独立进程树。
本页详细介绍如何使用该docker run
命令在运行时定义容器的资源。
一般形式
基本docker run
命令采用这种形式:
$ docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
该docker run
命令必须指定一个 IMAGE 以从中派生容器。图像开发人员可以定义与以下相关的图像默认值:
-
分离或前景运行
-
货柜识别
-
网络设置
-
CPU和内存的运行时间限制
随着docker run [OPTIONS]
操作者可以添加或覆盖由开发者设置的图像的默认值。此外,运算符可以覆盖 Docker 运行时自身设置的几乎所有默认值。操作员重写图像和 Docker 运行时默认值的能力是为什么run比其他docker
命令具有更多选项。
要了解如何解释类型[OPTIONS]
,请参阅选项类型。
注意:根据您的 Docker 系统配置,您可能需要使用前面的
docker run
命令sudo
。为了避免必须使用sudo
该docker
命令,系统管理员可以创建一个名为的 Unix 组docker
并向其添加用户。有关此配置的更多信息,请参阅适用于您的操作系统的 Docker 安装文档。
运营商独享选项
只有操作员(执行人员docker run
)可以设置以下选项。
-
分离与前景
-
分离(-d)
-
前景
-
容器标识
-
名称(-name)
-
PID等值
-
IPC设置(-ipc)
-
网络设置
-
重新启动策略(-restart)
-
清理(-rm)
-
运行时对资源的限制
-
运行时权限和Linux功能
分离与前景
启动 Docker 容器时,您必须先决定是否要在后台以“分离”模式或默认的前台模式运行容器:
-d=false: Detached mode: Run container in the background, print new container id
分离(-d)
要以分离模式启动容器,可以使用-d=true
或仅使用-d
选项。按照设计,当用于运行容器的根进程退出时,容器以分离模式退出,除非您还指定了该--rm
选项。如果使用-d
带--rm
,容器,当它退出删除或当守护进程退出,先发生者为准。
不要将service x start
命令传递给分离的容器。例如,该命令尝试启动该nginx
服务。
$ docker run -d -p 80:80 my_image service nginx start
这成功地启动nginx
了容器内的服务。然而,它不符合分离的容器范例,因为根进程(service nginx start
)返回并且分离的容器按设计停止。因此,该nginx
服务已启动,但无法使用。相反,要启动诸如nginx
Web服务器等进程,请执行以下操作:
$ docker run -d -p 80:80 my_image nginx -g 'daemon off;'
要使用分离的容器进行输入/输出,请使用网络连接或共享卷。这些都是必需的,因为容器不再监听docker run
运行的命令行。
要重新附加到分离的容器,请使用docker
attach 命令。
前景
在前台模式下(-d
未指定默认值时),docker run
可以在容器中启动进程并将控制台附加到进程的标准输入,输出和标准错误。它甚至可以伪装成 TTY(这是大多数命令行可执行文件所期望的)并传递信号。所有这些都是可配置的:
-a=[] : Attach to `STDIN`, `STDOUT` and/or `STDERR` -t : Allocate a pseudo-tty --sig-proxy=true: Proxy all received signals to the process (non-TTY mode only) -i : Keep STDIN open even if not attached
如果你没有指定,-a
那么 Docker 将连接到stdout和stderr。您可以指定其中三个标准流(STDIN
,STDOUT
,STDERR
)你想,而不是连接,如:
$ docker run -a stdin -a stdout -i -t ubuntu /bin/bash
对于交互式进程(如shell),必须-i -t
一起使用才能为容器进程分配tty。-i -t
通常-it
会按照后面的示例中的描述进行编写。-t
当客户端从管道接收其标准输入时,禁止指定,如下所示:
$ echo test | docker run -i busybox cat
注意:在容器中作为PID 1运行的进程会被Linux专门处理:它将忽略具有默认操作的任何信号。因此,该过程将不会终止
SIGINT
或者SIGTERM
除非它被编写这样做。
容器标识
名称(-name)
操作员可以通过三种方式识别容器:
识别类型 |
示例值 |
---|---|
UUID长标识符 |
“F78375b1c487e03c9438c729345e54db9d20cfa2ac1fc3494b6eb60872e74778” |
UUID短标识符 |
“F78375b1c487” |
Name |
“evil_ptolemy” |
UUID 标识符来自 Docker 守护进程。如果您没有为该--name
选项分配容器名称,则该守护程序会为您生成一个随机字符串名称。定义一个name
可以方便地为容器添加含义。如果您指定了一个name
,则可以在 Docker 网络中引用容器时使用它。这适用于后台和前台 Docker 容器。
注意:默认网桥网络上的容器必须链接以通过名称进行通信。
PID 等值
最后,为了帮助实现自动化,您可以让 Docker 将容器 ID 写出到您选择的文件中。这与某些程序可能会将其进程 ID 写入文件(您已将其视为 PID 文件)类似:
--cidfile="": Write the container ID to the file
图片:标签
虽然不是严格意义上的容器识别方法,但您可以通过添加image[:tag]
到命令中来指定要运行容器的图像版本。例如,docker run ubuntu:14.04
。
图片@消化
使用v2或更高版本的图像格式的图像具有称为摘要的内容可寻址标识符。只要用于生成图像的输入保持不变,摘要值是可预测和可引用的。
以下示例从包含摘要的alpine
映像运行容器sha256:9cacb71397b640eca97488cf08582ae4e4068513101088e9f96c9814bfda95e0
:
$ docker run alpine@sha256:9cacb71397b640eca97488cf08582ae4e4068513101088e9f96c9814bfda95e0 date
PID设置(-pid)
--pid="" : Set the PID (Process) Namespace mode for the container, 'container:<name|id>': joins another container's PID namespace 'host': use the host's PID namespace inside the container
默认情况下,所有容器都启用了 PID 名称空间。
PID 名称空间提供了进程的分离。PID 名称空间删除系统进程的视图,并允许重新使用进程 ID,包括 PID 1。
在某些情况下,您希望容器共享主机的进程名称空间,基本上允许容器中的进程查看系统上的所有进程。例如,你可以建立与调试工具等的容器strace
或gdb
,但要在容器内调试过程时使用这些工具。
示例:在容器中运行 htop
创建这个 Dockerfile:
FROM alpine:latest RUN apk add --update htop && rm -rf /var/cache/apk/* CMD ["htop"]
构建 Dockerfile 并将图像标记为myhtop
:
$ docker build -t myhtop .
使用以下命令htop
在容器内运行:
$ docker run -it --rm --pid=host myhtop
加入另一个容器的 pid 名称空间可用于调试该容器。
例子
启动运行 redis 服务器的容器:
$ docker run --name my-redis -d redis
通过运行另一个容器来调试 redis 容器:
$ docker run -it --pid=container:my-redis my_strace_docker_image bash $ strace -p 1
UTS设置(-uts)
--uts="" : Set the UTS namespace mode for the container, 'host': use the host's UTS namespace inside the container
UTS 命名空间用于设置在该命名空间中运行进程可见的主机名和域。默认情况下,所有容器(包括那些容器)--network=host
都有自己的 UTS 名称空间。该host
设置将导致容器使用与主机相同的 UTS 名称空间。请注意,--hostname
在host
UTS 模式下无效。
如果您希望容器的主机名随着主机的主机名更改而更改,您可能希望与主机共享 UTS 名称空间。更高级的用例将从容器中更改主机的主机名。
IPC设置(-ipc)
--ipc="" : Set the IPC mode for the container, 'container:<name|id>': reuses another container's IPC namespace 'host': use the host's IPC namespace inside the container
默认情况下,所有容器都启用了 IPC 命名空间。
IPC(POSIX / SysV IPC)命名空间提供命名共享内存段,信号量和消息队列的分离。
共享内存段用于以内存速度加速进程间通信,而不是通过管道或通过网络堆栈。共享内存通常由数据库和定制(通常为C / OpenMPI,C ++ /使用boost库)用于科学计算和金融服务行业的高性能应用程序使用。如果这些类型的应用程序分成多个容器,则可能需要共享容器的IPC机制。
网络设置
--dns=[] : Set custom dns servers for the container--network="bridge" : Connect a container to a network 'bridge': create a network stack on the default Docker bridge 'none': no networking 'container:<name|id>': reuse another container's network stack 'host': use the Docker host network stack '<network-name>|<network-id>': connect to a user-defined network--network-alias=[] : Add network-scoped alias for the container--add-host="" : Add a line to /etc/hosts (host:IP)--mac-address="" : Sets the container's Ethernet device's MAC address--ip="" : Sets the container's Ethernet device's IPv4 address--ip6="" : Sets the container's Ethernet device's IPv6 address--link-local-ip=[] : Sets one or more container's Ethernet device's link local IPv4/IPv6 addresses
默认情况下,所有容器都已启用网络连接,并且可以进行任何传出连接。运营商可以完全禁用网络docker run --network none
,禁用所有进入和离开的网络。在这样的情况下,你将I / O通过文件或执行STDIN
和STDOUT
只。
发布端口和链接到其他容器只能使用默认(桥接)。链接功能是一项传统功能。您应该始终更喜欢使用 Docker 网络驱动程序进行链接。
默认情况下,您的容器将使用与主机相同的 DNS 服务器,但您可以使用它覆盖此容器--dns
。
默认情况下,使用分配给容器的IP地址生成 MAC 地址。您可以通过--mac-address
参数(format 12:34:56:78:9a:bc
:)提供MAC地址来明确设置容器的MAC地址。请注意,Docker不会检查手动指定的MAC地址是否唯一。
支持的网络:
网络 |
描述 |
---|---|
没有 |
容器中没有网络。 |
桥(默认) |
通过veth接口将容器连接到桥。 |
主办 |
在容器内使用主机的网络堆栈。 |
容器:<名称| ID> |
使用另一个容器的网络堆栈,通过其名称或ID指定。 |
网络 |
将容器连接到用户创建的网络(使用docker network create命令) |
网络:无
与网络是none
一个容器将不能访问任何外部路由。该容器仍然loopback
在容器中启用了一个接口,但它没有任何到外部流量的路由。
网桥
将网络设置为bridge
容器将使用docker的默认网络设置。在主机上设置docker0
一个通常命名的网桥,并veth
为该容器创建一对接口。该veth
对中的一侧将保留在连接到桥的主机上,而另一侧将放置在容器的命名空间内,除了该loopback
界面。一个IP地址将被分配给桥接网络上的容器,流量将通过该桥接路由到容器。
容器默认通过 IP 地址进行通信。要通过名称进行交流,他们必须联系起来。
网络:主机
将网络设置为host
容器将共享主机的网络堆栈,并且主机的所有接口都可用于容器。容器的主机名将与主机系统上的主机名匹配。请注意,--mac-address
在host
netmode中无效。即使在host
网络模式下,默认情况下容器也有自己的UTS命名空间。因为这--hostname
是在host
网络模式下允许的,并且只会改变容器内的主机名。类似--hostname
的--add-host
,--dns
,--dns-search
,和--dns-option
选项可以用在host
网络模式。这些选项更新/etc/hosts
或/etc/resolv.conf
在容器内部。没有变化的,以制作/etc/hosts
,并/etc/resolv.conf
在主机上。
与默认bridge
模式相比,该host
模式显着提高了网络性能,因为它使用主机的本地网络堆栈,而网桥必须通过 docker 守护进程通过一级虚拟化。建议在网络性能至关重要的情况下以此模式运行容器,例如生产负载平衡器或高性能 Web 服务器。
注意:
--network="host"
给容器充分访问本地系统服务,如 D-bus,因此被认为是不安全的。
网络:容器
将网络设置为container
一个容器将共享另一个容器的网络堆栈。另一个容器的名称必须以格式提供--network container:<name|id>
。请注意,--add-host
--hostname
--dns
--dns-search
--dns-option
并且--mac-address
在container
netmode 中无效,并且在netmode --publish
--publish-all
--expose
中也无效container
。
示例使用 Redis 绑定运行 Redis 容器,localhost
然后运行该redis-cli
命令并通过localhost
接口连接到 Redis 服务器。
$ docker run -d --name redis example/redis --bind 127.0.0.1$ # use the redis container's network stack to access localhost $ docker run --rm -it --network container:redis example/redis-cli -h 127.0.0.1
用户定义的网络
您可以使用 Docker 网络驱动程序或外部网络驱动程序插件来创建网络。您可以将多个容器连接到同一个网络。一旦连接到用户定义的网络,容器就可以很容易地使用另一个容器的 IP 地址或名称进行通信。
对于overlay
支持多主机连接的网络或自定义插件,连接到相同多主机网络但从不同引擎启动的容器也可以通过这种方式进行通信。
以下示例使用内置bridge
网络驱动程序创建网络,并在创建的网络中运行容器
$ docker network create -d bridge my-net $ docker run --network=my-net -itd --name=container3 busybox
Managing /etc/hosts
您的容器将具有/etc/hosts
定义容器本身的主机名以及localhost
其他一些常见事物的行。该--add-host
标志可用于添加更多行/etc/hosts
。
$ docker run -it --add-host db-static:86.75.30.9 ubuntu cat /etc/hosts172.17.0.22 09d03f76bf2c fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters127.0.0.1 localhost::1 localhost ip6-localhost ip6-loopback86.75.30.9 db-static
如果容器连接到默认桥接网络和linked
其他容器,则/etc/hosts
使用链接容器的名称更新容器的文件。
注意由于 Docker 可能实时更新容器的
/etc/hosts
文件,因此容器中的进程最终可能会读取空的或不完整的/etc/hosts
文件。在大多数情况下,再次重试读取应解决问题。
重新启动策略(-restart)
--restart
在Docker运行中使用标志,您可以指定一个重启策略,以便在退出时应该或不应该重启容器。
当重新启动策略是活性的容器上,它将被显示为任一Up
或Restarting
在docker ps
。使用docker events
查看重启策略的效果也很有用。
Docker支持以下重启策略:
政策 |
结果 |
---|---|
没有 |
退出时不要自动重启容器。这是默认设置。 |
对故障:最大重试 |
仅在容器以非零退出状态退出时才能重新启动。或者,限制Docker守护程序尝试重新启动的次数。 |
总是 |
不管退出状态如何,始终重新启动容器。当你总是指定时,Docker守护进程将尝试无限期地重启容器。无论容器的当前状态如何,容器也将始终在守护进程启动时启动。 |
除非,停止 |
无论退出状态如何,始终重新启动容器,但如果容器之前已处于停止状态,则不要在守护进程启动时启动它。 |
在每次重新启动前添加一个不断增加的延迟(前一延迟的两倍,从100毫秒开始),以防止服务器泛滥。这意味着守护进程将等待100毫秒,然后等待200毫秒,400,800,1600等,直到on-failure
命中限制或者您docker stop
或docker rm -f
容器。
如果容器重新启动成功(容器启动并运行至少10秒钟),延迟将重置为默认值100 ms。
您可以指定 Docker 在使用故障策略时尝试重新启动容器的最大次数。默认情况下,Docker 将永远尝试重新启动容器。可以通过以下方式获取容器(尝试)重新启动的次数docker inspect
。例如,要获取容器“my-container”的重新启动次数;
$ docker inspect -f "{{ .RestartCount }}" my-container # 2
或者,为了获得最后一次容器(重新)启动;
$ docker inspect -f "{{ .State.StartedAt }}" my-container # 2015-03-04T23:47:07.691840179Z
将--restart
(重新启动策略)与--rm
(清除)标志组合会导致错误。在容器重启时,连接的客户端被断开连接 请参阅--rm
本页后面使用(清理)标志的示例。
例子
$ docker run --restart=always redis
这将运行redis
一个始终重启策略的容器,这样如果容器退出,Docker 将重新启动它。
$ docker run --restart=on-failure:10 redis
这将运行redis
容器,其重启策略为on-failure,最大重启次数为10.如果redis
容器以非零退出状态在一行中退出10次以上,Docker 将中止尝试重新启动容器。提供最大重新启动限制仅适用于故障策略。
退出状态
退出码docker run
提供了有关容器无法运行或为何退出的信息。当docker run
退出时非零码时,退出代码遵循chroot
标准,见下文:
如果错误是 Docker 守护进程本身,则为 125
$ docker run --foo busybox; echo $?# flag provided but not defined: --foo See 'docker run --help'. 125
126 如果 包含的命令不能被调用
$ docker run busybox /etc; echo $?# docker: Error response from daemon: Container command '/etc' could not be invoked. 126
127 如果 包含的命令不能被找到
$ docker run busybox foo; echo $?# docker: Error response from daemon: Container command 'foo' not found or does not exist. 127
退出代码 的 包含命令否则
$ docker run busybox /bin/sh -c 'exit 3'; echo $?# 3
清理(-rm)
即使在容器退出后,默认情况下容器的文件系统仍然存在。这使调试更容易(因为您可以检查最终状态),并且默认情况下保留所有数据。但是如果你正在运行短期的 前台 进程,这些容器文件系统可能真的堆积如山。相反,如果您希望Docker 在容器退出时自动清理容器并移除文件系统,则可以添加该--rm
标志:
--rm=false: Automatically remove the container when it exits (incompatible with -d)
注意:设置
--rm
标志时,当容器被移除时,Docker 也会删除与容器关联的卷。这与运行相似docker rm -v my-container
。只有未指定名称的卷才会被删除。例如,与docker run --rm -v /foo -v awesome:/bar busybox top
,音量/foo
将被删除,但音量/bar
不会。通过--volumes-from
相同的逻辑将继承的卷将被删除 - 如果原始卷指定了名称,则不会被删除。
安全配置
--security-opt="label=user:USER" : Set the label user for the container--security-opt="label=role:ROLE" : Set the label role for the container--security-opt="label=type:TYPE" : Set the label type for the container--security-opt="label=level:LEVEL" : Set the label level for the container--security-opt="label=disable" : Turn off label confinement for the container--security-opt="apparmor=PROFILE" : Set the apparmor profile to be applied to the container--security-opt="no-new-privileges:true|false" : Disable/enable container processes from gaining new privileges--security-opt="seccomp=unconfined" : Turn off seccomp confinement for the container--security-opt="seccomp=profile.json": White listed syscalls seccomp Json file to be used as a seccomp filter
您可以通过指定--security-opt
标志来覆盖每个容器的默认标签方案。在以下命令中指定级别允许您在容器之间共享相同的内容。
$ docker run --security-opt label=level:s0:c100,c200 -it fedora bash
注意:目前不支持自动翻译MLS标签。
要禁用此容器的安全标签而不是使用该--privileged
标志运行,请使用以下命令:
$ docker run --security-opt label=disable -it fedora bash
如果您希望容器中的进程采用更严格的安全策略,则可以为容器指定备用类型。您可以通过执行以下命令来运行只允许在Apache端口上侦听的容器:
$ docker run --security-opt label=type:svirt_apache_t -it centos bash
注意:您必须编写定义
svirt_apache_t
类型的策略。
如果你想阻止你的容器进程获得额外的权限,你可以执行下面的命令:
$ docker run --security-opt no-new-privileges -it centos bash
这意味着提升诸如su
或者sudo
将不再起作用的特权的命令。它还会导致任何 seccomp 过滤器稍后应用,权限被删除后,这可能意味着您可以拥有更多限制性的过滤器集。有关更多详细信息,请参阅内核文档。
指定一个 init 进程
您可以使用该--init
标志来指示 init 过程应该用作容器中的 PID 1。指定init进程可确保在创建的容器内执行init系统的常规职责(如收割僵尸进程)。
使用的默认 init 进程是docker-init
在 Docker 守护进程的系统路径中找到的第一个可执行文件。docker-init
包含在默认安装中的这个二进制文件由tini提供支持。
指定自定义 cgroups
使用该--cgroup-parent
标志,您可以传递特定的 cgroup 来运行容器。这允许您自行创建和管理 cgroup。您可以为这些 cgroup 定义自定义资源,并将容器放在公共父组下。
运行时对资源的限制
操作员还可以调整容器的性能参数:
选项 |
描述 |
---|---|
-m,--memory =“” |
内存限制(格式:<数字> <单位>)。数字是一个正整数。单位可以是b,k,m或g中的一个。最低为4M。 |
--memory交换=“” |
内存总量限制(内存+交换,格式:<编号> <单位>)。数字是一个正整数。单位可以是b,k,m或g中的一个。 |
--memory预约=“” |
内存软限制(格式:<编号> <单位>)。数字是一个正整数。单位可以是b,k,m或g中的一个。 |
--kernel内存=“” |
内核内存限制(格式:<数字> <单位>)。数字是一个正整数。单位可以是b,k,m或g中的一个。最低为4M。 |
-c,--cpu-shares = 0 |
CPU份额(相对重量) |
--cpus = 0.000 |
CPU数量。数字是一个小数。0.000表示没有限制。 |
--cpu周期= 0 |
限制CPU CFS(完全公平调度程序)期限 |
--cpuset-的CPU = “” |
允许执行的CPU(0-3,0,1) |
--cpuset-MEMS = “” |
在其中允许执行的内存节点(MEM)(0-3,0,1)。只对NUMA系统有效。 |
--cpu配额= 0 |
限制CPU CFS(完全公平调度程序)配额 |
--cpu-RT-周期= 0 |
限制CPU实时期限。以微秒为单位。需要设置父cgroups并且不能高于父级。另请检查rtprio ulimits。 |
--cpu-RT-运行时间= 0 |
限制CPU实时运行时间。以微秒为单位。需要设置父cgroups并且不能高于父级。另请检查rtprio ulimits。 |
--blkio重量= 0 |
块IO权重(相对权重)接受介于10和1000之间的权重值。 |
--blkio-重设备= “” |
阻止IO权重(相对设备权重,格式:DEVICE_NAME:WEIGHT) |
--device读-BPS = “” |
限制设备的读取速率(格式:<设备路径>:<编号> <单元>)。数字是一个正整数。单位可以是kb,mb或gb中的一个。 |
--device - 写 - BPS =“” |
限制写入速率到设备(格式:<device-path>:<number> <unit>)。数字是一个正整数。单位可以是kb,mb或gb中的一个。 |
--device读-IOPS = “” |
限制来自设备的读取速率(每秒IO)(格式:<device-path>:<number>)。数字是一个正整数。 |
--device - 写 - IOPS =“” |
限制写入速率(每秒IO)到设备(格式:<device-path>:<number>)。数字是一个正整数。 |
--oom杀-禁用=假 |
是否禁用容器的OOM杀手。 |
--oom分数ADJ = 0 |
调整容器的OOM首选项(-1000到1000) |
--memory-swappiness = “” |
调整容器的内存swappiness行为。接受0到100之间的整数。 |
--shm尺寸=“” |
/ dev / shm的大小。格式是<编号> <单位>。数字必须大于0.单位是可选的,可以是b(字节),k(千字节),m(兆字节)或g(千兆字节)。如果您省略了单位,系统会使用字节。如果完全忽略尺寸,则系统使用64米。 |
User memory constraints
我们有四种方法来设置用户内存使用情况:
选项 |
结果 |
---|---|
memory = inf,memory-swap = inf(默认) |
容器没有内存限制。容器可以根据需要使用尽可能多的内存。 |
内存= L <inf,内存交换= inf |
(指定内存并将内存交换设置为-1)容器不允许使用多于L字节的内存,但可以根据需要使用尽可能多的交换(如果主机支持交换内存)。 |
内存= L <inf,内存交换= 2 * L |
(指定没有内存交换的内存)容器不允许使用超过L字节的内存,swap和内存使用率是其中的两倍。 |
内存= L <inf,内存交换= S <inf,L <= S |
(指定内存和内存交换)容器不允许使用多于L字节的内存,交换加内存使用受S限制。 |
例子:
$ docker run -it ubuntu:14.04 /bin/bash
我们没有设置内存,这意味着容器中的进程可以根据需要使用尽可能多的内存和交换内存。
$ docker run -it -m 300M --memory-swap -1 ubuntu:14.04 /bin/bash
我们设置内存限制和禁用交换内存限制,这意味着容器中的进程可以使用300M内存和尽可能多的交换内存(如果主机支持交换内存)。
$ docker run -it -m 300M ubuntu:14.04 /bin/bash
我们只设置内存限制,这意味着容器中的进程可以使用300M内存和300M交换内存,默认情况下,总虚拟内存大小(-memory-swap)将被设置为内存的两倍,在这种情况下,内存+ swap 会是2 * 300M,所以进程也可以使用300M交换内存。
$ docker run -it -m 300M --memory-swap 1G ubuntu:14.04 /bin/bash
我们设置了内存和交换内存,因此容器中的进程可以使用 300M 内存和 700M 交换内存。
内存预留是一种内存软限制,允许更大的内存共享。在正常情况下,容器可以根据需要使用尽可能多的内存,并且仅受限于使用-m
/ --memory
选项设置的硬限制。当设置了内存预留时,Docker 会检测内存争用或内存不足,并强制容器将其消耗限制在预留限制内。
始终将内存预留值设置为低于硬限制,否则硬限制优先。保留0与设置不保留相同。默认情况下(没有预留设置),内存预留与硬内存限制相同。
内存预留是一项软限制功能,并不保证不会超出限制。相反,该功能会尝试确保在内存严重竞争时基于预留提示/设置分配内存。
以下示例将内存(-m
)限制为 500M,并将内存预留设置为 200M。
$ docker run -it -m 500M --memory-reservation 200M ubuntu:14.04 /bin/bash
在此配置下,当容器消耗的内存超过200M且小于500M时,下一次系统内存回收尝试将容器内存缩小到200M以下。
以下示例将内存预留设置为1G,但没有硬内存限制。
$ docker run -it --memory-reservation 1G ubuntu:14.04 /bin/bash
容器可以根据需要使用尽可能多的内存。内存预留设置可确保容器不会消耗太多内存很长时间,因为每个内存回收都会将容器的消耗量缩减到预留量。
默认情况下,如果发生内存不足(OOM)错误,内核会杀死容器中的进程。要更改此行为,请使用该--oom-kill-disable
选项。只有在您还设置-m/--memory
选项的容器上禁用 OOM 杀手。如果-m
未设置标志,则可能导致主机内存不足,并且需要杀死主机的系统进程以释放内存。
以下示例将内存限制为100M,并禁用此容器的 OOM 杀手:
$ docker run -it -m 100M --oom-kill-disable ubuntu:14.04 /bin/bash
以下示例说明了使用该标志的危险方法:
$ docker run -it --oom-kill-disable ubuntu:14.04 /bin/bash
该容器具有无限制的内存,这可能导致主机耗尽内存并需要查杀系统进程以释放内存。该--oom-score-adj
参数是可以改变的选择优先权,容器就会被杀死,当系统内存不足,负得分使他们不太可能被杀害,并积极分数的可能性较大。
内核内存限制
内核内存与用户内存根本不同,因为内核内存不能被换出。无法进行交换使得容器可能通过消耗太多内核内存来阻塞系统服务。内核内存包括:
-
堆叠页面
-
平板页面
-
插座内存压力
-
tcp 内存压力
您可以设置内核内存限制来限制这些内存。例如,每个进程都会消耗一些堆栈页面。通过限制内核内存,可以防止在内核内存使用率过高时创建新进程。
内核内存永远不会完全独立于用户内存。相反,您在用户内存限制的上下文中限制内核内存。假设“U”是用户内存限制,“K”是内核限制。有三种可能的方式来设置限制:
选项 |
结果 |
---|---|
U!= 0,K = inf(默认) |
这是使用内核内存之前已经存在的标准内存限制机制。内核内存被完全忽略。 |
U!= 0,K <U |
内核内存是用户内存的一个子集。这种设置在每个cgroup的总内存数量过量的部署中非常有用。绝对不推荐过度使用内核内存限制,因为该方框仍可能耗尽不可回收的内存。在这种情况下,您可以配置K,使所有组的总和永远不会大于总内存。然后,以系统服务质量为代价自由设置U. |
U!= 0,K> U |
由于内核内存电荷也被馈送到用户计数器,并且为这两种内存的容器触发回收。这种配置为管理员提供了统一的内存视图。对于只想跟踪内核内存使用情况的人也很有用。 |
例子:
$ docker run -it -m 500M --kernel-memory 50M ubuntu:14.04 /bin/bash
我们设置内存和内核内存,所以容器中的进程总共可以使用500M内存,在这个500M内存中,它可以是50M内核内存。
$ docker run -it --kernel-memory 50M ubuntu:14.04 /bin/bash
我们在不使用-m的情况下设置内核内存,因此容器中的进程可以使用尽可能多的内存,但它们只能使用50M内核内存。
Swappiness constraint
默认情况下,容器的内核可以换出一定比例的匿名页面。要为容器设置此百分比,请指定--memory-swappiness
介于0和100之间的值。值为0将关闭匿名页面交换。值为100将所有匿名页面设置为可交换。默认情况下,如果你不使用--memory-swappiness
,内存swappiness值将从父项继承。
例如,您可以设置:
$ docker run -it --memory-swappiness=0 ubuntu:14.04 /bin/bash
如果--memory-swappiness
要保留容器的工作集并避免交换性能处罚,设置该选项很有用。
CPU share constraint
默认情况下,所有容器都获得相同比例的CPU周期。通过相对于所有其他正在运行的容器的权重更改容器的CPU份额权重,可以修改此比例。
要从默认值1024修改比例,请使用-c
或--cpu-shares
标志将权重设置为2或更高。如果设置为0,系统将忽略该值并使用默认值1024。
该比例仅适用于 CPU 密集型进程正在运行时。当一个容器中的任务空闲时,其他容器可以使用剩余的 CPU 时间。实际的 CPU 时间量取决于系统上运行的容器数量。
例如,考虑三个容器,一个 cpu-share 为1024,另外两个 cpu-share 设置为512.当所有三个容器中的进程尝试使用100%的 CPU 时,第一个容器将获得50%的 CPU 总 CPU 时间。如果添加一个 cpu-share 为1024的第四个容器,则第一个容器只能获得33%的 CPU。剩下的容器获得 CPU 的16.5%,16.5%和33%。
在多核系统上,CPU 时间份额分布在所有 CPU 核心上。即使容器的CPU时间限制在100%以内,它也可以使用每个 CPU 内核的100%。
例如,考虑一个具有三个以上内核的系统。如果你开始一个容器{C0}
与-c=512
运行的一个过程,而另一个容器{C1}
与-c=1024
运行的两个过程,这可能会导致CPU份额如下划分:
PID container CPU CPU share100 {C0}0100% of CPU0101 {C1}1100% of CPU1102 {C1}2100% of CPU2
CPU周期约束
默认 CPU CFS(完全公平调度程序)周期为100ms。我们可以使用--cpu-period
设置 CPU 的时间段来限制容器的 CPU 使用率。通常--cpu-period
应该与--cpu-quota
。
例子:
$ docker run -it --cpu-period=50000 --cpu-quota=25000 ubuntu:14.04 /bin/bash
如果有1个 CPU,这意味着容器每50ms可以获得50%的 CPU 运行时间。
除了使用--cpu-period
和--cpu-quota
设置 CPU 周期约束外,还可以--cpus
使用浮点数指定以实现相同的目的。例如,如果有1个 CPU,--cpus=0.5
则会达到与设置--cpu-period=50000
和--cpu-quota=25000
(50% CPU)相同的结果。
--cpus
is 的默认值是0.000
,这意味着没有限制。
有关更多信息,请参阅CFS有关带宽限制的文档。
Cpuset constraint
我们可以设置允许执行容器的 cpus。
例子:
$ docker run -it --cpuset-cpus="1,3" ubuntu:14.04 /bin/bash
这意味着容器中的进程可以在 cpu 1和 cpu 3上执行。
$ docker run -it --cpuset-cpus="0-2" ubuntu:14.04 /bin/bash
这意味着容器中的进程可以在 cpu 0,cpu 1和 cpu 2上执行。
我们可以设置允许执行容器的 mems。只对 NUMA 系统有效。
例子:
$ docker run -it --cpuset-mems="1,3" ubuntu:14.04 /bin/bash
此示例将容器中的进程限制为仅使用内存节点1和3中的内存。
$ docker run -it --cpuset-mems="0-2" ubuntu:14.04 /bin/bash
此示例将容器中的进程限制为仅使用内存节点0,1和2中的内存。
CPU配额限制
该--cpu-quota
标志限制了容器的 CPU 使用率。默认的0值允许容器占用100%的 CPU 资源(1个CPU)。CFS(完全公平调度程序)为执行进程处理资源分配,并且是内核使用的默认 Linux 调度程序。将此值设置为50000以将容器限制为 CPU 资源的50%。对于多个 CPU,--cpu-quota
根据需要进行调整。有关更多信息,请参阅CFS有关带宽限制的文档。
Block IO bandwidth (Blkio) constraint
默认情况下,所有容器都获得相同比例的块 IO 带宽(blkio)。该比例为500.要修改此比例,请使用--blkio-weight
标志更改容器的 blkio 权重与所有其他正在运行的容器的权重。
注意: blkio 权重设置仅适用于直接 IO。缓冲 IO 目前不受支持。
该--blkio-weight
标志可以将权重设置为10至1000之间的值。例如,下面的命令创建两个具有不同 blkio 权重的容器:
$ docker run -it --name c1 --blkio-weight 300 ubuntu:14.04 /bin/bash $ docker run -it --name c2 --blkio-weight 600 ubuntu:14.04 /bin/bash
如果您同时在两个容器中阻止 IO,例如:
$ time dd if=/mnt/zerofile of=test.out bs=1M count=1024 oflag=direct
您会发现时间的比例与两个容器的 blkio 权重的比例相同。
该--blkio-weight-device="DEVICE_NAME:WEIGHT"
标志设置了特定的设备重量。这DEVICE_NAME:WEIGHT
是一个包含冒号分隔的设备名称和权重的字符串。例如,要将/dev/sda
设备重量设置为200
:
$ docker run -it \ --blkio-weight-device "/dev/sda:200" \ ubuntu
如果您同时指定--blkio-weight
和--blkio-weight-device
,则 Docker 将使用--blkio-weight
默认权重,并使用--blkio-weight-device
此值在特定设备上用新值覆盖此默认值。以下示例使用默认权重300
并将/dev/sda
该权重设置为以下内容时将覆盖此默认值200
:
$ docker run -it \ --blkio-weight 300 \ --blkio-weight-device "/dev/sda:200" \ ubuntu
该--device-read-bps
标志限制了设备的读取速率(每秒字节数)。例如,该命令创建一个容器并将读取速率限制为1mb
每秒从以下位置开始/dev/sda
:
$ docker run -it --device-read-bps /dev/sda:1mb ubuntu
该--device-write-bps
标志限制了设备的写入速率(每秒字节数)。例如,该命令创建一个容器并将写入速率限制为1mb
每秒的写入速率/dev/sda
:
$ docker run -it --device-write-bps /dev/sda:1mb ubuntu
两种标志都采用<device-path>:<limit>[unit]
格式限制。读取和写入速率都必须是正整数。您可以指定速率kb
(千字节),mb
(兆字节)或gb
(千兆字节)。
该--device-read-iops
标志限制了设备的读取速率(每秒 IO)。例如,该命令创建一个容器,并且限制了读出速度,以1000
从 IO 每秒/dev/sda
:
$ docker run -ti --device-read-iops /dev/sda:1000 ubuntu
该--device-write-iops
标志限制写入速率(每秒 IO)到设备。例如,该命令创建一个容器并将写入速率限制为每秒1000
IO,以便/dev/sda
:
$ docker run -ti --device-write-iops /dev/sda:1000 ubuntu
两种标志都采用<device-path>:<limit>
格式限制。读取和写入速率都必须是正整数。
其他组
--group-add: Add additional groups to run as
默认情况下,泊坞窗容器进程运行时,为指定用户查找补充组。如果你想添加更多的组,那么你可以使用这个标志:
$ docker run --rm --group-add audio --group-add nogroup --group-add 777 busybox id uid=0(root) gid=0(root) groups=10(wheel),29(audio),99(nogroup),777
运行时权限和Linux功能
--cap-add: Add Linux capabilities--cap-drop: Drop Linux capabilities--privileged=false: Give extended privileges to this container--device=[]: Allows you to run devices inside the container without the --privileged flag.
默认情况下,Docker 容器是“非特权”的,例如不能在 Docker 容器中运行 Docker 守护进程。这是因为默认情况下容器不允许访问任何设备,但“特权”容器可以访问所有设备(请参阅cgroups设备上的文档)。
当操作员执行时docker run --privileged
,Docker 将启用对主机上所有设备的访问,并在 AppArmor 或 SELinux 中设置一些配置,以允许容器几乎对主机的所有访问权限与主机上容器外运行的进程相同。有关运行的更多信息--privileged
可在Docker博客上找到。
如果你想限制访问特定的设备或设备,你可以使用该--device
标志。它允许您指定一个或多个在容器内可访问的设备。
$ docker run --device=/dev/snd:/dev/snd ...
默认情况下,容器就可以read
,write
和mknod
这些设备。这可以使用:rwm
每个--device
标志的第三组选项来覆盖:
$ docker run --device=/dev/sda:/dev/xvdc --rm -it ubuntu fdisk /dev/xvdcCommand (m for help): q $ docker run --device=/dev/sda:/dev/xvdc:r --rm -it ubuntu fdisk /dev/xvdc You will not be able to write the partition table.Command (m for help): q $ docker run --device=/dev/sda:/dev/xvdc:w --rm -it ubuntu fdisk /dev/xvdc crash....$ docker run --device=/dev/sda:/dev/xvdc:m --rm -it ubuntu fdisk /dev/xvdc fdisk: unable to open /dev/xvdc: Operation not permitted
除此之外--privileged
,操作员可以对使用--cap-add
和的能力进行细粒度控制--cap-drop
。默认情况下,Docker 具有保留的默认功能列表。下表列出了默认情况下允许并可以删除的 Linux 功能选项。
能力密钥 |
能力描述 |
---|---|
SETPCAP |
修改过程功能。 |
MKNOD |
使用mknod(2)创建特殊文件。 |
AUDIT_WRITE |
将记录写入内核审计日志。 |
CHOWN |
对文件UID和GID进行任意更改(请参见chown(2))。 |
NET_RAW |
使用RAW和PACKET套接字。 |
DAC_OVERRIDE |
绕过文件读取,写入和执行权限检查。 |
FOWNER |
对通常需要进程的文件系统UID的操作绕过权限检查以匹配文件的UID。 |
FSETID |
修改文件时,不要清除set-user-ID和set-group-ID权限位。 |
KILL |
绕过发送信号的权限检查。 |
SETGID |
任意操作进程GID和补充GID列表。 |
SETUID |
任意操作进程UID。 |
NET_BIND_SERVICE |
将套接字绑定到Internet域特权端口(端口号小于1024)。 |
SYS_CHROOT |
使用chroot(2),更改根目录。 |
SETFCAP |
设置文件功能。 |
下表显示了默认情况下未授予的功能,可以添加。
Capability Key |
Capability Description |
---|---|
SYS_MODULE |
Load and unload kernel modules. |
SYS_RAWIO |
Perform I/O port operations (iopl(2) and ioperm(2)). |
SYS_PACCT |
Use acct(2), switch process accounting on or off. |
SYS_ADMIN |
Perform a range of system administration operations. |
SYS_NICE |
Raise process nice value (nice(2), setpriority(2)) and change the nice value for arbitrary processes. |
SYS_RESOURCE |
Override resource Limits. |
SYS_TIME |
Set system clock (settimeofday(2), stime(2), adjtimex(2)); set real-time (hardware) clock. |
SYS_TTY_CONFIG |
Use vhangup(2); employ various privileged ioctl(2) operations on virtual terminals. |
AUDIT_CONTROL |
Enable and disable kernel auditing; change auditing filter rules; retrieve auditing status and filtering rules. |
MAC_OVERRIDE |
Allow MAC configuration or state changes. Implemented for the Smack LSM. |
MAC_ADMIN |
Override Mandatory Access Control (MAC). Implemented for the Smack Linux Security Module (LSM). |
NET_ADMIN |
Perform various network-related operations. |
SYSLOG |
Perform privileged syslog(2) operations. |
DAC_READ_SEARCH |
Bypass file read permission checks and directory read and execute permission checks. |
LINUX_IMMUTABLE |
Set the FS_APPEND_FL and FS_IMMUTABLE_FL i-node flags. |
NET_BROADCAST |
Make socket broadcasts, and listen to multicasts. |
IPC_LOCK |
Lock memory (mlock(2), mlockall(2), mmap(2), shmctl(2)). |
IPC_OWNER |
Bypass permission checks for operations on System V IPC objects. |
SYS_PTRACE |
Trace arbitrary processes using ptrace(2). |
SYS_BOOT |
Use reboot(2) and kexec_load(2), reboot and load a new kernel for later execution. |
LEASE |
Establish leases on arbitrary files (see fcntl(2)). |
WAKE_ALARM |
Trigger something that will wake up the system. |
BLOCK_SUSPEND |
Employ features that can block system suspend. |
Further reference information is available on the capabilities(7) - Linux man page
两个标志都支持该值ALL
,所以如果运营商想要拥有所有功能,但MKNOD
可以使用:
$ docker run --cap-add=ALL --cap-drop=MKNOD ...
为了与网络堆栈进行交互,而不是使用--privileged
它们--cap-add=NET_ADMIN
来修改网络接口。
$ docker run -it --rm ubuntu:14.04 ip link add dummy0 type dummy RTNETLINK answers: Operation not permitted $ docker run -it --rm --cap-add=NET_ADMIN ubuntu:14.04 ip link add dummy0 type dummy
要安装基于 FUSE 的文件系统,您需要将两者--cap-add
和--device
:
$ docker run --rm -it --cap-add SYS_ADMIN sshfs sshfs sven@10.10.10.20:/home/sven /mnt fuse: failed to open /dev/fuse: Operation not permitted $ docker run --rm -it --device /dev/fuse sshfs sshfs sven@10.10.10.20:/home/sven /mnt fusermount: mount failed: Operation not permitted $ docker run --rm -it --cap-add SYS_ADMIN --device /dev/fuse sshfs # sshfs sven@10.10.10.20:/home/sven /mnt The authenticity of host '10.10.10.20 (10.10.10.20)' can't be established.ECDSA key fingerprint is 25:34:85:75:25:b0:17:46:05:19:04:93:b5:dd:5f:c6.Are you sure you want to continue connecting (yes/no)? yes sven@10.10.10.20's password:root@30aa0cfaf1b5:/# ls -la /mnt/src/docker total 1516drwxrwxr-x 1 1000 1000 4096 Dec 4 06:08 .drwxrwxr-x 1 1000 1000 4096 Dec 4 11:46 ..-rw-rw-r-- 1 1000 1000 16 Oct 8 00:09 .dockerignore-rwxrwxr-x 1 1000 1000 464 Oct 8 00:09 .drone.yml drwxrwxr-x 1 1000 1000 4096 Dec 4 06:11 .git-rw-rw-r-- 1 1000 1000 461 Dec 4 06:08 .gitignore....
默认的 seccomp 配置文件将根据选定的功能进行调整,以便允许使用功能所允许的设施,因此,自 Docker 1.12以来,您无需对其进行调整。在 Docker 1.10和1.11中,这没有发生,可能需要使用自定义的 seccomp 配置文件或--security-opt seccomp=unconfined
在添加功能时使用。
Logging drivers (–log-driver)
容器可以具有与 Docker 守护程序不同的日志记录驱动程序。使用--log-driver=VALUE
with docker run
命令配置容器的日志记录驱动程序。支持以下选项:
Driver |
Description |
---|---|
none |
Disables any logging for the container. docker logs won’t be available with this driver. |
json-file |
Default logging driver for Docker. Writes JSON messages to file. No logging options are supported for this driver. |
syslog |
Syslog logging driver for Docker. Writes log messages to syslog. |
journald |
Journald logging driver for Docker. Writes log messages to journald. |
gelf |
Graylog Extended Log Format (GELF) logging driver for Docker. Writes log messages to a GELF endpoint likeGraylog or Logstash. |
fluentd |
Fluentd logging driver for Docker. Writes log messages to fluentd (forward input). |
awslogs |
Amazon CloudWatch Logs logging driver for Docker. Writes log messages to Amazon CloudWatch Logs |
splunk |
Splunk logging driver for Docker. Writes log messages to splunk using Event Http Collector. |
该docker logs
命令仅适用于json-file
和journald
日志记录驱动程序。有关使用记录驱动程序的详细信息,请参阅配置记录驱动程序。
Overriding Dockerfile image defaults
当开发人员从Dockerfile构建图像或提交时,开发人员可以设置许多默认参数,这些参数在图像作为容器启动时生效。
在 Dockerfile 命令的四个不能在运行时被覆盖:FROM
,MAINTAINER
,RUN
,和ADD
。其他的都有相应的覆盖docker run
。我们将通过开发人员在每个Dockerfile指令中设置的内容以及操作员如何覆盖该设置。
-
CMD(默认命令或选项)
-
入口点(运行时执行的默认命令)
-
EXPOSE(传入端口)
-
ENV(环境变量)
-
HEALTHCHECK
-
VOLUME(共享文件系统)
-
USER
-
WORKDIR
CMD(默认命令或选项)
回想COMMAND
Docker命令行中的可选项:
$ docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
该命令是可选的,因为创建这个命令的人IMAGE
可能已经COMMAND
使用 Dockerfile CMD
指令提供了默认值。作为操作员(从图像运行容器的人员),CMD
只需指定一个新操作即可覆盖该指令COMMAND
。
如果图片还指定了一个ENTRYPOINT
then,CMD
或者COMMAND
将其作为参数附加到ENTRYPOINT
。
ENTRYPOINT(在运行时执行的默认命令)
--entrypoint="": Overwrite the default entrypoint set by the image
该ENTRYPOINT
图像是类似COMMAND
,因为它指定了可执行文件运行容器启动时,但它是(故意)更难以覆盖。在ENTRYPOINT
给出了一个容器,它的默认性质或行为,所以,当你设置一个ENTRYPOINT
可以运行的容器,就好像它是二进制,完全使用默认选项,并且可以在通过更多的选择传球COMMAND
。但是,有时操作员可能想在容器内部运行其他内容,因此可以ENTRYPOINT
在运行时通过使用字符串来指定新的值来覆盖默认值ENTRYPOINT
。以下是如何在已经设置为自动运行其他内容(如/usr/bin/redis-server
)的容器中运行shell的示例:
$ docker run -it --entrypoint /bin/bash example/redis
或者如何将更多参数传递给该入口点的两个示例:
$ docker run -it --entrypoint /bin/bash example/redis -c ls -l $ docker run -it --entrypoint /usr/bin/redis-cli example/redis --help
您可以通过传递空字符串来重置容器入口点,例如:
$ docker run -it --entrypoint="" mysql bash
注意:传递
--entrypoint
将清除图像上设置的任何默认命令(即CMD
用于构建它的Dockerfile中的任何指令)。
EXPOSE (incoming ports)
以下run
命令选项适用于容器网络:
--expose=[]: Expose a port or a range of ports inside the container. These are additional to those exposed by the `EXPOSE` instruction-P : Publish all exposed ports to the host interfaces-p=[] : Publish a container᾿s port or a range of ports to the host format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort Both hostPort and containerPort can be specified as a range of ports. When specifying ranges for both, the number of container ports in the range must match the number of host ports in the range, for example: -p 1234-1236:1234-1236/tcp When specifying a range for hostPort only, the containerPort must not be a range. In this case the container port is published somewhere within the specified hostPort range. (e.g., `-p 1234-1236:1234/tcp`) (use 'docker port' to see the actual mapping)--link="" : Add link to another container (<name or id>:alias or <name or id>)
除EXPOSE
指令外,图像开发人员对网络控制不够。该EXPOSE
指令定义了提供服务的初始传入端口。这些端口可用于容器内的进程。操作员可以使用该--expose
选项添加到暴露的端口。
要显示容器的内部端口,操作员可以使用-P
或-p
标志启动容器。暴露的端口可以在主机上访问,并且端口可供任何可以连接到主机的客户端使用。
该-P
选项将所有端口发布到主机接口。Docker 将每个暴露的端口绑定到主机上的随机端口。端口范围在由...定义的临时端口范围内/proc/sys/net/ipv4/ip_local_port_range
。使用该-p
标志来显式映射单个端口或端口范围。
容器(服务侦听的地方)中的端口号不需要与容器外部(客户端连接的地方)上公开的端口号相匹配。例如,在容器内,HTTP 服务正在端口80上进行侦听(因此图像开发人员EXPOSE 80
在 Dockerfile 中指定)。在运行时,端口可能会绑定到主机上的42800。要找到主机端口和外露端口之间的映射,请使用docker port
。
如果运营商--link
在默认网桥网络中启动新的客户端容器时使用,则客户端容器可以通过专用网络接口访问公开的端口。如果--link
在 Docker 网络概述中描述的在用户定义的网络中启动容器时使用,它将为要链接的容器提供一个命名别名。
ENV (environment variables)
Docker 在创建 Linux 容器时会自动设置一些环境变量。在创建 Windows 容器时,Docker 不会设置任何环境变量。
为 Linux 容器设置以下环境变量:
变量 |
值 |
---|---|
家 |
根据USER的值进行设置 |
主机名 |
与容器关联的主机名 |
路径 |
包括流行的目录,例如/ usr / local / sbin:/ usr / local / bin:/ usr / sbin:/ usr / bin:/ sbin:/ bin |
术语 |
xterm如果容器被分配了伪TTY |
另外,操作员可以通过使用一个或多个标志来设置容器中的任何环境变量-e
,甚至覆盖上面提到的那些标志,或者已经由开发人员用 Dockerfile 定义ENV
。如果操作符命名环境变量而不指定值,则命名变量的当前值会传播到容器的环境中:
$ export today=Wednesday $ docker run -e "deep=purple" -e today --rm alpine env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=d2219b854598 deep=purple today=Wednesday HOME=/root
PS C:\> docker run --rm -e "foo=bar" microsoft/nanoserver cmd /s /c setALLUSERSPROFILE=C:\ProgramData APPDATA=C:\Users\ContainerAdministrator\AppData\Roaming CommonProgramFiles=C:\Program Files\Common FilesCommonProgramFiles(x86)=C:\Program Files (x86)\Common Files CommonProgramW6432=C:\Program Files\Common Files COMPUTERNAME=C2FAEFCC8253 ComSpec=C:\Windows\system32\cmd.exe foo=bar LOCALAPPDATA=C:\Users\ContainerAdministrator\AppData\Local NUMBER_OF_PROCESSORS=8OS=Windows_NT Path=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Users\ContainerAdministrator\AppData\Local\Microsoft\WindowsApps PATHEXT=.COM;.EXE;.BAT;.CMD PROCESSOR_ARCHITECTURE=AMD64 PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 62 Stepping 4, GenuineIntel PROCESSOR_LEVEL=6PROCESSOR_REVISION=3e04ProgramData=C:\ProgramData ProgramFiles=C:\Program FilesProgramFiles(x86)=C:\Program Files (x86)ProgramW6432=C:\Program Files PROMPT=$P$G PUBLIC=C:\Users\Public SystemDrive=C:SystemRoot=C:\Windows TEMP=C:\Users\ContainerAdministrator\AppData\Local\Temp TMP=C:\Users\ContainerAdministrator\AppData\Local\Temp USERDOMAIN=User Manager USERNAME=ContainerAdministrator USERPROFILE=C:\Users\ContainerAdministrator windir=C:\Windows
同样,操作员可以设置HOSTNAME(Linux)或COMPUTERNAME(Windows)-h
。
健康检查
--health-cmd Command to run to check health --health-interval Time between running the check --health-retries Consecutive failures needed to report unhealthy --health-timeout Maximum time to allow one check to run --health-start-period Start period for the container to initialize before starting health-retries countdown --no-healthcheck Disable any container-specified HEALTHCHECK
例子:
$ docker run --name=test -d \ --health-cmd='stat /etc/passwd || exit 1' \ --health-interval=2s \ busybox sleep 1d $ sleep 2; docker inspect --format='{{.State.Health.Status}}' test healthy $ docker exec test rm /etc/passwd $ sleep 2; docker inspect --format='{{json .State.Health}}' test{ "Status": "unhealthy", "FailingStreak": 3, "Log": [ { "Start": "2016-05-25T17:22:04.635478668Z", "End": "2016-05-25T17:22:04.7272552Z", "ExitCode": 0, "Output": " File: /etc/passwd\n Size: 334 \tBlocks: 8 IO Block: 4096 regular file\nDevice: 32h/50d\tInode: 12 Links: 1\nAccess: (0664/-rw-rw-r--) Uid: ( 0/ root) Gid: ( 0/ root)\nAccess: 2015-12-05 22:05:32.000000000\nModify: 2015..." }, { "Start": "2016-05-25T17:22:06.732900633Z", "End": "2016-05-25T17:22:06.822168935Z", "ExitCode": 0, "Output": " File: /etc/passwd\n Size: 334 \tBlocks: 8 IO Block: 4096 regular file\nDevice: 32h/50d\tInode: 12 Links: 1\nAccess: (0664/-rw-rw-r--) Uid: ( 0/ root) Gid: ( 0/ root)\nAccess: 2015-12-05 22:05:32.000000000\nModify: 2015..." }, { "Start": "2016-05-25T17:22:08.823956535Z", "End": "2016-05-25T17:22:08.897359124Z", "ExitCode": 1, "Output": "stat: can't stat '/etc/passwd': No such file or directory\n" }, { "Start": "2016-05-25T17:22:10.898802931Z", "End": "2016-05-25T17:22:10.969631866Z", "ExitCode": 1, "Output": "stat: can't stat '/etc/passwd': No such file or directory\n" }, { "Start": "2016-05-25T17:22:12.971033523Z", "End": "2016-05-25T17:22:13.082015516Z", "ExitCode": 1, "Output": "stat: can't stat '/etc/passwd': No such file or directory\n" } ]}
docker ps
输出中还显示健康状况。
TMPFS (mount tmpfs filesystems)
--tmpfs=[]: Create a tmpfs mount with: container-dir[:<options>], where the options are identical to the Linux 'mount -t tmpfs -o' command.
下面的例子中安装一个空的 tmpfs 与容器rw
,noexec
,nosuid
,和size=65536k
选项。
$ docker run -d --tmpfs /run:rw,noexec,nosuid,size=65536k my_image
VOLUME (shared filesystems)
-v, --volume=[host-src:]container-dest[:<options>]: Bind mount a volume.The comma-delimited `options` are [rw|ro], [z|Z],[[r]shared|[r]slave|[r]private], and [nocopy].The 'host-src' is an absolute path or a name value.If neither 'rw' or 'ro' is specified then the volume is mounted inread-write mode.The `nocopy` modes is used to disable automatic copying requested volume path in the container to the volume storage location.For named volumes, `copy` is the default mode. Copy modes are not supportedfor bind-mounted volumes.--volumes-from="": Mount all volumes from the given container(s)
注意:当使用 systemd 管理 Docker 守护进程的启动和停止时,在 systemd 单元文件中,有一个选项可以控制 Docker 守护进程本身的挂载传播
MountFlags
。此设置的值可能会导致 Docker 无法看到挂载点在挂载点上进行的挂载传播更改。例如,如果此值为slave
,您可能无法在卷上使用shared
或rshared
传播。
卷命令足够复杂,可以在“ 管理容器中的数据”部分中拥有自己的文档。开发人员可以定义VOLUME
与图像关联的一个或多个图像,但只有操作员可以从一个容器访问另一个容器(或从容器访问主机上安装的卷)。
在container-dest
必须始终是绝对路径,例如/src/docs
。该host-src
可以是绝对路径或name
值。如果你提供了一个绝对路径host-dir
,Docker 绑定到你指定的路径。如果你提供一个name
,Docker 通过它创建一个命名的卷name
。
一个name
值必须以字母数字字符,接着启动a-z0-9
,_
(下划线), .
(周期)或-
(连字符)。绝对路径以/
(正斜杠)开头。
例如,您可以指定一个值/foo
或foo
一个host-src
值。如果你提供这个/foo
值,Docker 会创建一个绑定挂载。如果您提供foo
规范,Docker 将创建一个命名卷。
USER
root
(id = 0)是容器内的默认用户。图像开发人员可以创建更多用户。这些用户可以通过名称访问。在传递数字标识时,用户不必在容器中存在。
开发人员可以设置默认用户使用 Dockerfile USER
指令运行第一个进程。启动容器时,操作员可以USER
通过传递-u
选项来覆盖指令。
-u="", --user="": Sets the username or UID used and optionally the groupname or GID for the specified command.The followings examples are all valid:--user=[ user | user:group | uid | uid:gid | user:gid | uid:group ]
注意:如果你传递一个数字 uid,它必须在0-2147483647的范围内。
WORKDIR
在容器中运行二进制文件的默认工作目录是根目录(/
),但开发人员可以使用 Dockerfile WORKDIR
命令设置不同的默认值。操作员可以通过以下方式覆盖此项:
-w="": Working directory inside the container