docker run


在新容器中运行命令

Usage

$ docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

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

Description

docker run命令首先在指定的镜像上creates一个可写的容器层,然后使用指定的命令starts它. 也就是说, docker run等价于 API /containers/create然后/containers/(id)/start . 可以使用docker start重新启动已停止的容器,而其之前的所有更改都完好无损. 查看docker ps -a查看所有容器的列表.

docker run命令可以与docker commit结合使用来更改容器运行的命令. 在Docker 运行参考中有更多关于docker run的详细信息.

有关将容器连接到网络的信息,请参阅" Docker 网络概述" .

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

Options

名称,简写 Default Description
--add-host 添加自定义主机到 IP 映射 (host:ip)
--attach , -a 连接到 STDIN、STDOUT 或 STDERR
--blkio-weight 块 IO(相对权重),介于 10 和 1000 之间,或 0 禁用(默认 0)
--blkio-weight-device 块 IO 权重(相对设备权重)
--cap-add 添加 Linux 功能
--cap-drop 放弃 Linux 功能
--cgroup-parent 容器的可选父 cgroup
--cgroupns API 1.41+
cgroup namespace to use (host|private) 'host':在 Docker 主机的 cgroup 命名空间中运行容器 'private':在它自己的私有 cgroup 命名空间中运行容器 '':使用由 default-cgroupns- 配置的 cgroup 命名空间守护程序上的模式选项(默认)
--cidfile 将容器 ID 写入文件
--cpu-count CPU 计数(仅限 Windows)
--cpu-percent CPU 百分比(仅限 Windows)
--cpu-period 限制 CPU CFS(完全公平调度器)周期
--cpu-quota 限制 CPU CFS(完全公平调度器)配额
--cpu-rt-period 以微秒为单位限制 CPU 实时周期
--cpu-rt-runtime 以微秒为单位限制 CPU 实时运行时间
--cpu-shares , -c CPU 份额(相对权重)
--cpus CPU 数量
--cpuset-cpus 允许执行的 CPU (0-3, 0,1)
--cpuset-mems 允许执行的 MEM (0-3, 0,1)
--detach , -d 在后台运行容器并打印容器 ID
--detach-keys 覆盖用于分离容器的键序列
--device 将主机设备添加到容器
--device-cgroup-rule 将规则添加到 cgroup 允许的设备列表
--device-read-bps 限制设备的读取速率(每秒字节数)
--device-read-iops 限制设备的读取速率(每秒 IO)
--device-write-bps 限制设备的写入速率(每秒字节数)
--device-write-iops 限制设备的写入速率(每秒 IO)
--disable-content-trust true 跳过图像验证
--dns 设置自定义 DNS 服务器
--dns-opt 设置 DNS 选项
--dns-option 设置 DNS 选项
--dns-search 设置自定义 DNS 搜索域
--domainname 容器 NIS 域名
--entrypoint 覆盖图像的默认入口点
--env , -e 设置环境变量
--env-file 读入环境变量文件
--expose 公开一个端口或一系列端口
--gpus API 1.40+
要添加到容器中的 GPU 设备("全部"以传递所有 GPU)
--group-add 添加其他组以加入
--health-cmd 运行以检查运行状况的命令
--health-interval 运行检查之间的时间 (ms|s|m|h) (默认 0s)
--health-retries 需要报告不健康的连续失败
--health-start-period 开始健康重试倒计时之前容器初始化的开始时间(ms|s|m|h)(默认 0s)
--health-timeout 允许运行一项检查的最长时间 (ms|s|m|h) (默认 0s)
--help 打印使用
--hostname , -h 容器主机名
--init 在容器内运行一个 init 来转发信号并收获进程
--interactive , -i 即使没有连接,也保持 STDIN 打开
--io-maxbandwidth 系统驱动器的最大 IO 带宽限制(仅限 Windows)
--io-maxiops 系统驱动器的最大 IOps 限制(仅限 Windows)
--ip IPv4 地址(例如,172.30.100.104)
--ip6 IPv6 地址(例如,2001:db8::33)
--ipc 要使用的 IPC 模式
--isolation 容器隔离技术
--kernel-memory 内核内存限制
--label , -l Set meta data on a container
--label-file 读入以行分隔的标签文件
--link 添加到另一个容器的链接
--link-local-ip 容器 IPv4/IPv6 链路本地地址
--log-driver 容器的日志记录驱动程序
--log-opt 日志驱动程序选项
--mac-address 容器 MAC 地址(例如,92:d0:c6:0a:29:33)
--memory , -m 内存限制
--memory-reservation 内存软限制
--memory-swap 交换限制等于内存加上交换:'-1' 启用无限交换
--memory-swappiness -1 调整容器内存交换(0 到 100)
--mount 将文件系统挂载附加到容器
--name 为容器分配名称
--net 将容器连接到网络
--net-alias 为容器添加网络范围的别名
--network 将容器连接到网络
--network-alias 为容器添加网络范围的别名
--no-healthcheck 禁用任何容器指定的 HEALTHCHECK
--oom-kill-disable 禁用 OOM 杀手
--oom-score-adj 调整主机的 OOM 首选项(-1000 到 1000)
--pid 要使用的 PID 命名空间
--pids-limit 调整容器 pids 限制(设置 -1 表示无限制)
--platform 如果服务器支持多平台,则设置平台
--privileged 授予此容器扩展权限
--publish , -p 将容器的端口发布到主机
--publish-all , -P 将所有暴露的端口发布到随机端口
--pull missing Pull image before running ("always"|"missing"|"never")
--read-only 将容器的根文件系统挂载为只读
--restart no 容器退出时应用的重启策略
--rm 容器退出时自动移除
--runtime 用于此容器的运行时
--security-opt 安全选项
--shm-size /dev/shm 的大小
--sig-proxy true 代理接收到的信号给进程
--stop-signal SIGTERM 停止容器的信号
--stop-timeout 停止容器的超时(以秒为单位)
--storage-opt 容器的存储驱动程序选项
--sysctl Sysctl 选项
--tmpfs 挂载 tmpfs 目录
--tty , -t 分配一个伪 TTY
--ulimit 限制选项
--user , -u 用户名或 UID(格式:<name|uid>[:<group|gid>])
--userns 要使用的用户命名空间
--uts 要使用的 UTS 命名空间
--volume , -v Bind mount a volume
--volume-driver 容器的可选卷驱动程序
--volumes-from 从指定容器挂载卷
--workdir , -w 容器内的工作目录

Examples

Assign name and allocate pseudo-TTY (--name, -it)

$ docker run --name test -it debian

root@d6c0fe130dba:/# exit 13
$ echo $?
13
$ docker ps -a | grep test
d6c0fe130dba        debian:7            "/bin/bash"         26 seconds ago      Exited (13) 17 seconds ago                         test

This example runs a container named test using the debian:latest image. The -it instructs Docker to allocate a pseudo-TTY connected to the container’s stdin; creating an interactive bash shell in the container. In the example, the bash shell is quit by entering exit 13. This exit code is passed on to the caller of docker run, and is recorded in the test container’s metadata.

Capture container ID (--cidfile)

$ docker run --cidfile /tmp/docker_test.cid ubuntu echo "test"

这将创建一个容器并将test打印到控制台. cidfile标志使 Docker 尝试创建一个新文件并将容器 ID 写入其中. 如果文件已经存在,Docker 将返回错误. 当docker run退出时,Docker 将关闭此文件.

Full container capabilities (--privileged)

$ docker run -t -i --rm ubuntu bash
root@bc338942ef20:/# mount -t tmpfs none /mnt
mount: permission denied

这是行不通的,因为默认情况下,大多数潜在危险的内核功能都会被丢弃; 包括cap_sys_admin (挂载文件系统所必需的). 但是, --privileged标志将允许它运行:

$ docker run -t -i --privileged ubuntu bash
root@50e3f57e16e6:/# mount -t tmpfs none /mnt
root@50e3f57e16e6:/# df -h
Filesystem      Size  Used Avail Use% Mounted on
none            1.9G     0  1.9G   0% /mnt

--privileged标志为容器提供了所有功能,它还解除了device cgroup 控制器实施的所有限制. 换句话说,容器几乎可以做主机可以做的所有事情. 存在此标志以允许特殊用例,例如在 Docker 中运行 Docker.

Set working directory (-w)

$ docker  run -w /path/to/dir/ -i -t  ubuntu pwd

-w让命令在给定的目录中执行,这里是/path/to/dir/ . 如果路径不存在,则在容器内创建.

Set storage driver options per container

$ docker run -it --storage-opt size=120G fedora /bin/bash

这个(大小)将允许在创建时将容器 rootfs 大小设置为 120G. 此选项仅适用于devicemapperbtrfsoverlay2windowsfilterzfs图形驱动程序. 对于devicemapperbtrfswindowsfilterzfs图形驱动程序,用户不能传递小于默认 BaseFS 大小的大小. 对于overlay2存储驱动程序,size 选项仅在支持 fs 是xfs并使用pquota挂载选项挂载时可用. 在这些条件下,用户可以传递小于支持 fs 大小的任何大小.

Mount tmpfs (--tmpfs)

$ docker run -d --tmpfs /run:rw,noexec,nosuid,size=65536k my_image

--tmpfs标志使用rwnoexecnosuidsize=65536k选项将空 tmpfs 挂载到容器中.

Mount volume (-v, --read-only)

$ docker  run  -v `pwd`:`pwd` -w `pwd` -i -t  ubuntu pwd

-v标志将当前工作目录挂载到容器中. -w通过将目录更改为pwd返回的值,让命令在当前工作目录中执行. 所以这个组合使用容器执行命令,但是在当前工作目录中.

$ docker run -v /doesnt/exist:/foo -w /foo -i -t ubuntu bash

当绑定挂载的卷的主机目录不存在时,Docker 会自动为您在主机上创建该目录. 在上面的示例中,Docker 将在启动容器之前创建/doesnt/exist文件夹.

$ docker run --read-only -v /icanwrite busybox touch /icanwrite/here

卷可以与--read-only结合使用来控制容器写入文件的位置. --read-only标志将容器的根文件系统挂载为只读,禁止写入到容器的指定卷以外的位置.

$ docker run -t -i -v /var/run/docker.sock:/var/run/docker.sock -v /path/to/static-docker-binary:/usr/bin/docker busybox sh

通过绑定挂载 docker unix 套接字和静态链接的 docker 二进制文件(请参阅获取 linux 二进制文件),您可以为容器提供创建和操作主机的 Docker 守护程序的完全访问权限.

在 Windows 上,必须使用 Windows 样式的语义指定路径.

PS C:\> docker run -v c:\foo:c:\dest microsoft/nanoserver cmd /s /c type c:\dest\somefile.txt
Contents of file

PS C:\> docker run -v c:\foo:d: microsoft/nanoserver cmd /s /c type d:\somefile.txt
Contents of file

以下示例在使用基于 Windows 的容器时将失败,因为容器内的卷或绑定挂载的目标必须是以下之一:不存在或空目录; 或 C: 以外的驱动器. 此外,绑定挂载的源必须是本地目录,而不是文件.

net use z: \\remotemachine\share
docker run -v z:\foo:c:\dest ...
docker run -v \\uncpath\to\directory:c:\dest ...
docker run -v c:\foo\somefile.txt:c:\dest ...
docker run -v c:\foo:c: ...
docker run -v c:\foo:c:\existing-directory-with-contents ...

有关卷的详细信息,请参阅管理容器中的数据

Add bind mounts or volumes using the --mount flag

--mount标志允许您在容器中挂载卷、主机目录和tmpfs挂载.

--mount标志支持-v--volume标志支持的大多数选项,但使用不同的语法. 有关--mount标志的详细信息以及--volume--mount之间的比较,请参阅服务创建命令参考.

尽管没有计划弃用--volume ,但建议使用--mount .

Examples:

$ docker run --read-only --mount type=volume,target=/icanwrite busybox touch /icanwrite/here
$ docker run -t -i --mount type=bind,src=/data,dst=/data busybox sh

Publish or expose port (-p, --expose)

$ docker run -p 127.0.0.1:80:8080/tcp ubuntu bash

这会将容器的8080端口绑定到主机127.0.0.1上的 TCP 端口80 . 您还可以指定udpsctp端口. Docker 用户指南详细解释了如何在 Docker 中操作端口.

请注意,未绑定到主机的端口(即-p 80:80而不是-p 127.0.0.1:80:80 )将从外部访问. 如果您将 UFW 配置为阻止此特定端口,这也适用,因为 Docker 管理自己的 iptables 规则. 阅读更多

$ docker run --expose 80 ubuntu bash

这会暴露容器的80端口,而不会将端口发布到主机系统的接口.

Set the pull policy (--pull)

在创建(和运行)容器时使用--pull标志设置镜像拉取策略.

--pull标志可以采用以下值之一:

Value Description
missing (default) 如果在图像缓存中找不到图像,则拉取图像,否则使用缓存的图像.
never 即使图像丢失,也不要拉取图像,如果图像缓存中不存在图像,则会产生错误.
always Always perform a pull before creating the container.

从镜像创建(和运行)容器时,守护进程会检查镜像是否存在于本地镜像缓存中. 如果图像丢失,则会向 cli 返回错误,允许它启动拉取.

默认( missing )是仅在守护程序的图像缓存中不存在图像时才提取图像. 此默认设置允许您运行仅存在于本地的镜像(例如,您从 Dockerfile 构建但尚未推送到注册表的镜像),并减少了网络连接.

always选项总是在创建容器之前启动拉取. 此选项可确保图像是最新的,并防止您使用过时的图像,但可能不适合您想要在推送之前测试本地构建的图像的情况(因为拉取图像会覆盖现有图像)图像缓存).

never选项在创建容器时禁用(隐式)提取图像,并且仅使用图像缓存中可用的图像. 如果找不到指定的镜像,则会产生错误,并且不会创建容器. 此选项在网络不可用的情况下很有用,或者在创建容器时防止图像被隐式拉取.

以下示例显示了带有--pull=never选项集的 docker docker run ,由于图像缓存中缺少图像,这会产生 en 错误:

$ docker run --pull=never hello-world
docker: Error response from daemon: No such image: hello-world:latest.

Set environment variables (-e, --env, --env-file)

$ docker run -e MYVAR1 --env MYVAR2=foo --env-file ./env.list ubuntu bash

使用-e--env--env-file标志在您正在运行的容器中设置简单(非数组)环境变量,或覆盖在您正在运行的映像的 Dockerfile 中定义的变量.

您可以在运行容器时定义变量及其值:

$ docker run --env VAR1=value1 --env VAR2=value2 ubuntu env | grep VAR
VAR1=value1
VAR2=value2

您还可以使用已导出到本地环境的变量:

export VAR1=value1
export VAR2=value2

$ docker run --env VAR1 --env VAR2 ubuntu env | grep VAR
VAR1=value1
VAR2=value2

运行该命令时,Docker CLI 客户端会检查变量在本地环境中的值并将其传递给容器. 如果未提供=并且该变量未在本地环境中导出,则不会在容器中设置该变量.

您还可以从文件加载环境变量. 此文件应使用语法<variable>=value (将变量设置为给定值)或<variable> (从本地环境中获取值),并使用#表示注释.

$ cat env.list
# This is a comment
VAR1=value1
VAR2=value2
USER

$ docker run --env-file env.list ubuntu env | grep -E 'VAR|USER'
VAR1=value1
VAR2=value2
USER=jonzeolla

Set metadata on container (-l, --label, --label-file)

标签是将元数据应用于容器的key=value对. 用两个标签标记一个容器:

$ docker run -l my-label --label com.example.foo=bar ubuntu bash

my-label键未指定值,因此标签默认为空字符串 ( "" ). 要添加多个标签,请重复标签标志( -l--label ).

key=value必须是唯一的,以避免覆盖标签值. 如果您指定具有相同键但值不同的标签,则每个后续值都会覆盖前一个值. Docker 使用您提供的最后一个key=value .

使用--label-file标志从文件加载多个标签. 用 EOL 标记分隔文件中的每个标签. 下面的示例从当前目录中的标签文件加载标签:

$ docker run --label-file ./labels ubuntu bash

标签文件格式类似于加载环境变量的格式. (与环境变量不同,标签对容器内运行的进程不可见.)以下示例说明了标签文件格式:

com.example.label1="a label"

# this is a comment
com.example.label2=another\ label
com.example.label3

您可以通过提供多个--label-file标志来加载多个标签文件.

有关使用标签的更多信息,请参阅 Docker 用户指南中的标签 - Docker 中的自定义元数据.

Connect a container to a network (--network)

启动容器时,使用--network标志将其连接到网络. 这会将busybox容器添加到my-net网络.

$ docker run -itd --network=my-net busybox

当您在用户定义的网络上启动容器时,您还可以使用--ip6 --ip为容器选择 IP 地址.

$ docker run -itd --network=my-net --ip=10.10.9.75 busybox

如果要将正在运行的容器添加到网络,请使用docker network connect子命令.

您可以将多个容器连接到同一个网络. 连接后,容器可以仅使用另一个容器的 IP 地址或名称轻松通信. 对于支持多主机连接的overlay网络或自定义插件,连接到同一个多主机网络但从不同引擎启动的容器也可以通过这种方式进行通信.

Note

服务发现在默认桥接网络上不可用. 默认情况下,容器可以通过其 IP 地址进行通信. 要通过名称进行通信,它们必须被链接.

您可以使用docker network disconnect命令断开容器与网络的连接.

Mount volumes from container (--volumes-from)

$ docker run --volumes-from 777f7dc92da7 --volumes-from ba8c0c54f0f2:ro -i -t ubuntu pwd

--volumes-from标志从引用的容器挂载所有定义的卷. 可以通过重复--volumes-from参数来指定容器. 容器 ID 可以选择后缀:ro:rw以分别以只读或读写模式安装卷. 默认情况下,卷以与引用容器相同的模式(读写或只读)挂载.

像 SELinux 这样的标签系统要求在安装到容器中的卷内容上放置适当的标签. 如果没有标签,安全系统可能会阻止在容器内运行的进程使用内容. 默认情况下,Docker 不会更改操作系统设置的标签.

要更改容器上下文中的标签,您可以将两个后缀:z:Z添加到卷挂载中. 这些后缀告诉 Docker 重新标记共享卷上的文件对象. z选项告诉 Docker 两个容器共享卷内容. 因此,Docker 使用共享内容标签来标记内容. 共享卷标允许所有容器读/写内容. Z选项告诉 Docker 使用私有非共享标签标记内容. 只有当前容器可以使用私有卷.

Attach to STDIN/STDOUT/STDERR (-a)

-a标志告诉docker run绑定到容器的STDINSTDOUTSTDERR . 这使得可以根据需要操纵输出和输入.

$ echo "test" | docker run -i -a stdin ubuntu cat -

这会将数据通过管道传输到容器中,并通过仅附加到容器的STDIN来打印容器的 ID.

$ docker run -a stderr ubuntu echo test

This isn’t going to print anything unless there’s an error because we’ve only attached to the STDERR of the container. The container’s logs still store what’s been written to STDERR and STDOUT.

$ cat somefile | docker run -i -a stdin mybuilder dobuild

这就是如何将文件传送到容器中以进行构建. 构建完成后将打印容器的 ID,并且可以使用docker logs检索构建日志. 如果您需要将文件或其他内容通过管道传输到容器中并在容器完成运行后检索容器的 ID,这将非常有用.

Add host device to container (--device)

$ docker run --device=/dev/sdc:/dev/xvdc \
             --device=/dev/sdd --device=/dev/zero:/dev/nulo \
             -i -t \
             ubuntu ls -l /dev/{xvdc,sdd,nulo}

brw-rw---- 1 root disk 8, 2 Feb  9 16:05 /dev/xvdc
brw-rw---- 1 root disk 8, 3 Feb  9 16:05 /dev/sdd
crw-rw-rw- 1 root root 1, 5 Feb  9 16:05 /dev/nulo

通常需要将设备直接暴露给容器. --device选项可以实现这一点. 例如,可以将特定的块存储设备或循环设备或音频设备添加到其他非特权容器(没有--privileged标志)并让应用程序直接访问它.

默认情况下,容器将能够readwritemknod这些设备. 这可以使用每个--device标志的第三组:rwm选项来覆盖. 如果容器以特权模式运行,则指定的权限将被忽略.

$ docker run --device=/dev/sda:/dev/xvdc --rm -it ubuntu fdisk  /dev/xvdc

Command (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:rw --rm -it ubuntu fdisk  /dev/xvdc

Command (m for help): q

$ docker run --device=/dev/sda:/dev/xvdc:m --rm -it ubuntu fdisk  /dev/xvdc
fdisk: unable to open /dev/xvdc: Operation not permitted

Note

--device选项不能安全地与临时设备一起使用. 不应使用--device将可能被删除的块设备添加到不受信任的容器中.

对于 Windows,传递给--device选项的字符串格式为--device=<IdType>/<Id>的形式. 从 Windows Server 2019 和 Windows 2018 年 10 月 10 日更新开始,Windows 仅支持 IdType class和 Id 作为设备接口类 GUID . 有关容器支持的设备接口类 GUID 的列表,请参阅Windows 容器文档中定义的表.

如果为进程隔离的 Windows 容器指定此选项,则所有实现请求的设备接口类 GUID 的设备在容器中都可用. 例如,下面的命令使主机上的所有 COM 端口在容器中可见.

PS C:\> docker run --device=class/86E0D1E0-8089-11D0-9CE4-08003E301F73 mcr.microsoft.com/windows/servercore:ltsc2019

Note

--device选项仅在进程隔离的 Windows 容器上受支持. 如果容器隔离为hyperv或在 Windows 上运行 Linux 容器 (LCOW),此选项将失败.

Using dynamically created devices (--device-cgroup-rule)

容器可用的设备是在创建时分配的. 分配的设备都将添加到 cgroup.allow 文件中,并在运行后创建到容器中. 当需要将新设备添加到正在运行的容器中时,这会带来问题.

解决方案之一是向容器添加更宽松的规则,允许其访问更广泛的设备. 例如,假设我们的容器需要访问具有42主要和任意数量的次要编号的字符设备(随着新设备的出现而添加),将添加以下规则:

$ docker run -d --device-cgroup-rule='c 42:* rmw' -name my-container my-image

然后,用户可以要求udev执行一个脚本,该脚本将docker exec my-container mknod newDevX c 42 <minor>添加所需的设备.

注意:最初存在的设备仍需要显式添加到docker run / docker create命令.

Access an NVIDIA GPU

--gpus标志允许您访问 NVIDIA GPU 资源. 首先,您需要安装nvidia-container-runtime . 访问指定容器的资源以获取更多信息.

要使用--gpus ,请指定要使用的 GPU(或全部). 如果未提供任何值,则使用所有可用的 GPU. 下面的示例公开了所有可用的 GPU.

$ docker run -it --rm --gpus all ubuntu nvidia-smi

使用device选项指定 GPU. 下面的示例公开了一个特定的 GPU.

$ docker run -it --rm --gpus device=GPU-3a23c669-1f69-c64e-cf85-44e9b07e7a2a ubuntu nvidia-smi

下面的示例公开了第一个和第三个 GPU.

$ docker run -it --rm --gpus '"device=0,2"' nvidia-smi

Restart policies (--restart)

使用 Docker 的--restart来指定容器的重启策略. 重启策略控制 Docker 守护进程是否在退出后重启容器. Docker 支持以下重启策略:

Policy Result
no 容器退出时不要自动重启. 这是默认设置.
on-failure[:max-retries] 仅当容器以非零退出状态退出时才重新启动. (可选)限制 Docker 守护程序尝试重新启动的次数.
unless-stopped 除非明确停止或 Docker 本身停止或重新启动,否则重新启动容器.
always 无论退出状态如何,始终重新启动容器. 当您指定 always 时,Docker 守护程序将尝试无限期地重新启动容器. 无论容器的当前状态如何,容器也将始终在守护程序启动时启动.
$ docker run --restart=always redis

这将以always的重启策略运行redis容器,这样如果容器退出,Docker 将重启它.

有关重启策略的更多详细信息,请参阅 Docker 运行参考页面的重启策略 (--restart)部分.

Add entries to container hosts file (--add-host)

您可以使用一个或多个--add-host标志将其他主机添加到容器的/etc/hosts文件中. 此示例为名为docker的主机添加静态地址:

$ docker run --add-host=docker:93.184.216.34 --rm -it alpine

/ # ping docker
PING docker (93.184.216.34): 56 data bytes
64 bytes from 93.184.216.34: seq=0 ttl=37 time=93.052 ms
64 bytes from 93.184.216.34: seq=1 ttl=37 time=92.467 ms
64 bytes from 93.184.216.34: seq=2 ttl=37 time=92.252 ms
^C
--- docker ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 92.209/92.495/93.052 ms

有时您需要从容器内连接到 Docker 主机. 要启用此功能,请使用--add-host标志将 Docker 主机的 IP 地址传递给容器. 要查找主机的地址,请使用ip addr show命令.

您传递给ip addr show的标志取决于您在容器中使用的是 IPv4 还是 IPv6 网络. 使用以下标志检索名为eth0的网络设备的 IPv4 地址:

$ HOSTIP=`ip -4 addr show scope global dev eth0 | grep inet | awk '{print $2}' | cut -d / -f 1 | sed -n 1p`
$ docker run  --add-host=docker:${HOSTIP} --rm -it debian

对于 IPv6,使用-6标志而不是-4标志. 对于其他网络设备,将eth0替换为正确的设备名称(例如docker0用于桥接设备).

Set ulimits in container (--ulimit)

由于在容器中设置ulimit设置需要在默认容器中不可用的额外权限,因此您可以使用--ulimit标志设置这些权限. --ulimit指定了软和硬限制,如下所示: <type>=<soft limit>[:<hard limit>] ,例如:

$ docker run --ulimit nofile=1024:1024 --rm debian sh -c "ulimit -n"
1024

Note

如果您不提供hard limit ,则soft limit将用于这两个值. 如果未设置ulimits ,则它们继承自守护程序上设置的默认ulimits . as选项现在被禁用. 换句话说,不支持以下脚本:

$ docker run -it --ulimit as=1024 fedora /bin/bash

这些值在设置时被发送到适当的syscall . Docker 不执行任何字节转换. 设置值时要考虑到这一点.

For nproc usage

使用ulimit标志设置nproc时要小心,因为nproc是由 Linux 设计的,用于设置用户可用的最大进程数,而不是容器. 例如,使用daemon用户启动四个容器:

$ docker run -d -u daemon --ulimit nproc=3 busybox top

$ docker run -d -u daemon --ulimit nproc=3 busybox top

$ docker run -d -u daemon --ulimit nproc=3 busybox top

$ docker run -d -u daemon --ulimit nproc=3 busybox top

第 4 个容器失败并报告"[8] 系统错误:资源暂时不可用"错误. 这失败了,因为调用者设置nproc=3导致前三个容器用完为daemon用户设置的三个进程配额.

Stop container with signal (--stop-signal)

--stop-signal标志设置将发送到容器以退出的系统调用信号. 该信号可以是格式为SIG<NAME>的信号名称,例如SIGKILL ,也可以是匹配内核系统调用表中某个位置的无符号数字,例如9 .

如果未指定,则默认为SIGTERM .

Optional security options (--security-opt)

在 Windows 上,此标志可用于指定credentialspec选项. credentialspec必须采用file://spec.txtregistry://keyname格式.

Stop container with timeout (--stop-timeout)

--stop-timeout标志设置在发送预定义(参见--stop-signal )系统调用信号后等待容器停止的秒数. 如果超时后容器没有退出,则会使用SIGKILL信号强制将其杀死.

如果--stop-timeout设置为-1 ,则不应用超时,并且守护程序将无限期地等待容器退出.

默认值由守护程序确定,Linux 容器为 10 秒,Windows 容器为 30 秒.

Specify isolation technology for container (--isolation)

此选项在您在 Windows 上运行 Docker 容器的情况下很有用. --isolation=<value>选项设置容器的隔离技术. 在 Linux 上,唯一支持的是使用 Linux 命名空间的default选项. 这两个命令在 Linux 上是等价的:

$ docker run -d busybox top
$ docker run -d --isolation default busybox top

在 Windows 上, --isolation可以采用以下值之一:

Value Description
default 使用 Docker 守护程序的--exec-opt或系统默认值指定的值(见下文).
process 共享内核命名空间隔离.
hyperv Hyper-V 管理程序基于分区的隔离.

The default isolation on Windows server operating systems is process, and hyperv on Windows client operating systems, such as Windows 10. Process isolation is more performant, but requires the image to

在 Windows 服务器上,假设默认配置,这些命令是等效的并导致process隔离:

PS C:\> docker run -d microsoft/nanoserver powershell echo process
PS C:\> docker run -d --isolation default microsoft/nanoserver powershell echo process
PS C:\> docker run -d --isolation process microsoft/nanoserver powershell echo process

如果您在 Docker daemon上设置了--exec-opt isolation=hyperv选项,或者正在针对基于 Windows 客户端的守护程序运行,则这些命令是等效的并导致hyperv隔离:

PS C:\> docker run -d microsoft/nanoserver powershell echo hyperv
PS C:\> docker run -d --isolation default microsoft/nanoserver powershell echo hyperv
PS C:\> docker run -d --isolation hyperv microsoft/nanoserver powershell echo hyperv

Specify hard limits on memory available to containers (-m, --memory)

这些参数总是设置容器可用内存的上限. 在 Linux 上,这是在 cgroup 上设置的,容器中的应用程序可以在/sys/fs/cgroup/memory/memory.limit_in_bytes查询它.

在 Windows 上,这将对容器产生不同的影响,具体取决于使用的隔离类型.

  • 通过process隔离,Windows 将报告宿主系统的完整内存,而不是限制在容器内运行的应用程序

      PS C:\> docker run -it -m 2GB --isolation=process microsoft/nanoserver powershell Get-ComputerInfo *memory*
    
      CsTotalPhysicalMemory      : 17064509440
      CsPhyicallyInstalledMemory : 16777216
      OsTotalVisibleMemorySize   : 16664560
      OsFreePhysicalMemory       : 14646720
      OsTotalVirtualMemorySize   : 19154928
      OsFreeVirtualMemory        : 17197440
      OsInUseVirtualMemory       : 1957488
      OsMaxProcessMemorySize     : 137438953344
    
  • 通过hyperv隔离,Windows 将创建一个足以容纳内存限制的实用程序 VM,以及托管容器所需的最小操作系统. 该大小报告为"总物理内存".

      PS C:\> docker run -it -m 2GB --isolation=hyperv microsoft/nanoserver powershell Get-ComputerInfo *memory*
    
      CsTotalPhysicalMemory      : 2683355136
      CsPhyicallyInstalledMemory :
      OsTotalVisibleMemorySize   : 2620464
      OsFreePhysicalMemory       : 2306552
      OsTotalVirtualMemorySize   : 2620464
      OsFreeVirtualMemory        : 2356692
      OsInUseVirtualMemory       : 263772
      OsMaxProcessMemorySize     : 137438953344
    

Configure namespaced kernel parameters (sysctls) at runtime

--sysctl在容器中设置命名空间内核参数 (sysctls). 例如,要在容器网络命名空间中打开 IP 转发,请运行以下命令:

$ docker run --sysctl net.ipv4.ip_forward=1 someimage

Note

并非所有的 sysctl 都是命名空间的. Docker 不支持更改容器内的 sysctls 也会修改主机系统. 随着内核的发展,我们期望看到更多的 sysctl 成为命名空间.

Currently supported sysctls

IPC 命名空间:

  • kernel.msgmax, kernel.msgmnb, kernel.msgmni, kernel.sem, kernel.shmall, kernel.shmmax, kernel.shmmni, kernel.shm_rmid_forced.
  • fs.mqueue.*开头的 Sysctls
  • 如果您使用--ipc=host选项,则不允许使用这些 sysctl.

网络命名空间:

  • net.*开头的 Sysctls
  • 如果您使用--network=host选项,则不允许使用这些 sysctl.

by  icopy.site