文章摘要(AI生成)
docker容器运行命令是用于创建和运行新容器的命令。使用该命令,可以在指定的镜像上创建一个可写容器层,并使用指定的命令启动该容器。停止的容器可以使用docker start命令重新启动。可以通过docker ps -a命令查看所有容器的列表。该命令还提供了许多选项,用于添加自定义主机映射、附加到容器的输入输出流、设置CPU和内存限制等。可以通过--add-host选项添加自定义主机映射,通过--attach选项附加到容器的输入输出流。还可以使用其他选项来设置CPU和内存限制,以及其他一些功能的添加或删除。该命令还支持使用Cgroup命名空间来运行容器。示例用法和更多详细信息可以在官方文档中找到。
docker容器运行
从镜像创建并运行新容器
用法
$ docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
说明
该docker run
命令首先creates
在指定图像上创建一个可写容器层,然后starts
使用指定命令。也就是说, docker run
相当于 API /containers/create
then /containers/(id)/start
。一个停止的容器可以使用docker start
. 查看docker ps -a
以查看所有容器的列表。
有关将容器连接到网络的信息,请参阅“ Docker 网络概述”。
有关此命令的示例用法,请参阅下面的示例部分。
选项
姓名,简写 | 默认 | 描述 |
---|---|---|
--add-host |
添加自定义主机到 IP 映射 (host:ip) | |
--attach , -a |
附加到 STDIN、STDOUT 或 STDERR | |
--blkio-weight |
Block IO(相对权重),在10到1000之间,或者0禁用(默认0) | |
--blkio-weight-device |
Block IO权重(相对设备权重) | |
--cap-add |
添加 Linux 功能 | |
--cap-drop |
放弃 Linux 功能 | |
--cgroup-parent |
容器的可选父 cgroup | |
--cgroupns |
API 1.41+ 要使用的 Cgroup 命名空间 (host|private) ‘host’:在 Docker 主机的 cgroup 命名空间中运行容器 ‘private’:在其自己的私有 cgroup 命名空间中运行容器 ‘’:使用由 default-cgroupns- 配置的 cgroup 命名空间守护进程的模式选项(默认) | |
--cidfile |
将容器ID写入文件 | |
--cpu-count |
CPU 计数(仅限 Windows) | |
--cpu-percent |
CPU 百分比(仅限 Windows) | |
--cpu-period |
限制 CPU CFS(Completely Fair Scheduler)周期 | |
--cpu-quota |
限制 CPU CFS(Completely Fair Scheduler)配额 | |
--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 |
覆盖图像的默认 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 |
在容器上设置元数据 | |
--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 |
运行前拉取镜像 ( always , missing , never ) |
--quiet , -q |
抑制拉动输出 | |
--read-only |
将容器的根文件系统挂载为只读 | |
--restart |
no |
容器退出时应用的重启策略 |
--rm |
退出时自动移除容器 | |
--runtime |
用于此容器的运行时 | |
--security-opt |
安全选项 | |
--shm-size |
/dev/shm 的大小 | |
--sig-proxy |
true |
代理接收到进程的信号 |
--stop-signal |
停止容器的信号 | |
--stop-timeout |
停止容器的超时(以秒为单位) | |
--storage-opt |
容器的存储驱动程序选项 | |
--sysctl |
系统选项 | |
--tmpfs |
挂载 tmpfs 目录 | |
--tty ,-t |
分配伪 TTY | |
--ulimit |
限制选项 | |
--user ,-u |
用户名或 UID(格式:<name|uid>[:<group|gid>]) | |
--userns |
要使用的用户命名空间 | |
--uts |
要使用的 UTS 命名空间 | |
--volume ,-v |
绑定挂载卷 | |
--volume-driver |
容器的可选卷驱动程序 | |
--volumes-from |
从指定容器装载卷 | |
--workdir ,-w |
容器内的工作目录 |
例子
分配名称并分配伪 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
test
此示例运行一个使用debian:latest
图像命名的容器。指示 Docker 分配一个连接到容器标准输入的-it
伪 TTY;在容器中创建交互式bash
shell。在示例中,bash
通过输入 退出 shell exit 13
。此退出代码传递给 的调用方 docker run
,并记录在test
容器的元数据中。
捕获容器 ID (–cidfile)
$ docker run --cidfile /tmp/docker_test.cid ubuntu echo "test"
这将创建一个容器并打印test
到控制台。该cidfile
标志使 Docker 尝试创建一个新文件并将容器 ID 写入其中。如果该文件已经存在,Docker 将返回一个错误。docker run
Docker退出时会关闭这个文件。
完整的容器功能(–特权)
$ 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。
设置工作目录 (-w, --workdir)
$ docker run -w /path/to/dir/ -i -t ubuntu pwd
-w
让命令在此处给定的目录内 执行/path/to/dir/
。如果路径不存在,它将在容器内创建。
为每个容器设置存储驱动程序选项 (–storage-opt)
$ docker run -it --storage-opt size=120G fedora /bin/bash
此(大小)将允许在创建时将容器文件系统大小设置为 120G。此选项仅适用于devicemapper
、btrfs
、overlay2
和 windowsfilter
图形zfs
驱动程序。对于devicemapper
、btrfs
和图形驱动程序windowsfilter
,zfs
用户不能传递小于默认 BaseFS 大小的大小。对于overlay2
存储驱动程序,大小选项仅在后备文件系统已xfs
安装并使用pquota
安装选项时可用。在这些条件下,用户可以传递小于支持文件系统大小的任何大小。
挂载 tmpfs (–tmpfs)
$ docker run -d --tmpfs /run:rw,noexec,nosuid,size=65536k my_image
该标志使用, , ,选项--tmpfs
将一个空的 tmpfs 安装到容器中。rw``noexec``nosuid``size=65536k
挂载卷(-v,–只读)
$ 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 ...
有关卷的深入信息,请参阅管理容器中的数据
使用 --mount 标志添加绑定挂载或卷
该--mount
标志允许您tmpfs
在容器中挂载卷、主机目录和挂载。
该--mount
标志支持-v
或 标志支持的大多数选项--volume
,但使用不同的语法。有关 --mount
标志的深入信息以及 和 之间的比较--volume
,--mount
请参阅 绑定装载。
即使没有弃用的计划--volume
,--mount
也建议使用。
例子:
$ 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
发布或公开端口 (-p, --expose)
$ docker run -p 127.0.0.1:80:8080/tcp ubuntu bash
这会将容器的端口绑定到主机的8080
TCP 端口。您还可以指定和端口。Docker 用户指南 详细解释了如何在 Docker 中操作端口。80``127.0.0.1``udp``sctp
请注意,未绑定到主机(即,-p 80:80
而不是 -p 127.0.0.1:80:80
)的端口可以从外部访问。如果您将 UFW 配置为阻止此特定端口,这也适用,因为 Docker 管理自己的 iptables 规则。阅读更多
$ docker run --expose 80 ubuntu bash
80
这会在不将端口发布到主机系统接口的情况下公开容器的端口。
设置拉取策略 (–pull)
在创建(和运行)容器时使用--pull
标志设置镜像拉取策略。
该--pull
标志可以采用以下值之一:
价值 | 描述 |
---|---|
missing (默认) |
如果在图像缓存中找不到图像,则拉取图像,否则使用缓存的图像。 |
never |
不要拉取图像,即使它丢失了,如果图像缓存中不存在图像,则会产生错误。 |
always |
在创建容器之前始终执行拉取。 |
从图像创建(和运行)容器时,守护进程会检查图像是否存在于本地图像缓存中。如果图像丢失,则会向 CLI 返回一个错误,允许它启动拉取。
默认 ( missing
) 是仅在守护进程的图像缓存中不存在图像时才拉取该图像。此默认设置允许您运行仅存在于本地的图像(例如,您从 Dockerfile 构建的图像,但尚未推送到注册表),并减少网络连接。
该always
选项始终在创建容器之前启动拉取。此选项确保图像是最新的,并防止您使用过时的图像,但可能不适合在推送之前测试本地构建图像的情况(因为拉取图像会覆盖现有图像)图片缓存)。
该never
选项在创建容器时禁用(隐式)拉取图像,并且仅使用图像缓存中可用的图像。如果找不到指定的图像,则会产生错误,并且不会创建容器。此选项在网络不可用的情况下很有用,或者可以防止在创建容器时隐式拉取图像。
以下示例显示docker run
了--pull=never
选项集,它会产生错误,因为图像缓存中缺少图像:
$ docker run --pull=never hello-world
docker: Error response from daemon: No such image: hello-world:latest.
设置环境变量(-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
在容器上设置元数据(-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 中的自定义元数据。
将容器连接到网络 (–network)
当您启动容器时,使用--network
标志将其连接到网络。以下命令创建一个名为 的网络my-net
,并向该网络添加一个busybox
容器my-net
。
$ docker network create my-net
$ docker run -itd --network=my-net busybox
--ip
当您在用户定义的网络上启动容器时,您还可以使用和--ip6
标记为容器选择 IP 地址。
$ docker run -itd --network=my-net --ip=10.10.9.75 busybox
如果要将正在运行的容器添加到网络,请使用docker network connect
子命令。
您可以将多个容器连接到同一个网络。连接后,容器只需使用另一个容器的 IP 地址或名称即可轻松进行通信。对于overlay
支持多主机连接的网络或自定义插件,连接到同一多主机网络但从不同引擎启动的容器也可以通过这种方式进行通信。
笔记
默认桥接网络只允许容器使用内部 IP 地址相互通信。用户创建的桥接网络使用容器名称在容器之间提供 DNS 解析。
您可以使用命令断开容器与网络的连接docker network disconnect
。
从容器中挂载卷 (–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 使用私有非共享标签标记内容。只有当前容器可以使用私有卷。
附加到 STDIN/STDOUT/STDERR (-a, --attach)
( --attach
or -a
) 标志告诉docker run
绑定到容器的 STDIN
, STDOUT
or STDERR
。这使得可以根据需要操纵输出和输入。
$ echo "test" | docker run -i -a stdin ubuntu cat -
这会将数据通过管道传输到容器中,并通过仅附加到容器的STDIN
.
$ docker run -a stderr ubuntu echo test
除非出现错误,否则不会打印任何内容,因为我们只附加到STDERR
容器的。容器的日志仍然存储写入的内容STDERR
和STDOUT
。
$ cat somefile | docker run -i -a stdin mybuilder dobuild
这是一种--attach
将构建文件通过管道传输到容器中的方法。构建完成后将打印容器的 ID,并且可以使用docker logs
. 如果您需要将文件或其他内容通过管道传输到容器中并在容器完成运行后检索容器的 ID,这将很有用。
将主机设备添加到容器 (–device)
$ docker run -it --rm \
--device=/dev/sdc:/dev/xvdc \
--device=/dev/sdd \
--device=/dev/zero:/dev/foobar \
ubuntu ls -l /dev/{xvdc,sdd,foobar}
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/foobar
通常需要将设备直接暴露给容器。该--device
选项可以实现这一点。例如,可以将特定的块存储设备或循环设备或音频设备添加到其他非特权容器(没有--privileged
标志)并让应用程序直接访问它。
默认情况下,容器将能够read
和这些设备。这可以使用每个 标志的第三组选项来覆盖。如果容器以特权模式运行,则指定的权限将被忽略。write``mknod``:rwm``--device
$ 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
笔记
该
--device
选项不能安全地用于临时设备。可以删除的块设备不应添加到带有--device
.
对于 Windows,传递给--device
选项的字符串格式为--device=<IdType>/<Id>
. 从 Windows Server 2019 和 Windows 10 October 2018 Update 开始,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
笔记
该
--device
选项仅在进程隔离的 Windows 容器上受支持,如果容器隔离为hyperv
.
使用动态创建的设备(–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
命令。
访问 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)
使用 Docker 的--restart
指定容器的重启策略。重启策略控制 Docker 守护进程是否在退出后重启容器。Docker 支持以下重启策略:
政策 | 结果 |
---|---|
no |
退出时不要自动重启容器。这是默认值。 |
on-failure[:max-retries] |
仅当容器以非零退出状态退出时才重新启动。(可选)限制 Docker 守护程序尝试的重新启动重试次数。 |
unless-stopped |
重新启动容器,除非明确停止或 Docker 本身停止或重新启动。 |
always |
无论退出状态如何,始终重新启动容器。当您指定 always 时,Docker 守护进程将尝试无限期地重新启动容器。无论容器的当前状态如何,容器也将始终在守护程序启动时启动。 |
$ docker run --restart=always redis
这将以alwaysredis
的重启策略运行容器, 这样如果容器退出,Docker 将重启它。
有关重启策略的更多详细信息,请参阅 Docker 运行参考页面的 重启策略 (–restart) 部分。
将条目添加到容器主机文件 (–add-host)
/etc/hosts
您可以使用一个或多个--add-host
标志将其他主机添加到容器的文件中。此示例为名为 的主机添加静态地址 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 网络。使用以下标志为名为 的网络设备检索 IPv4 地址eth0
:
$ 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
桥接设备)。
在容器中设置 ulimits (–ulimit)
由于ulimit
在容器中设置设置需要默认容器中不可用的额外权限,因此您可以使用--ulimit
标志设置这些设置。 --ulimit
指定软限制和硬限制 <type>=<soft limit>[:<hard limit>]
,例如:
$ docker run --ulimit nofile=1024:1024 --rm debian sh -c "ulimit -n"
1024
笔记
如果您不提供
hard limit
,则将soft limit
用于这两个值。如果未ulimits
设置,则它们继承自ulimits
守护程序上的默认设置。该as
选项现在已禁用。换句话说,不支持以下脚本:$ docker run -it --ulimit as=1024 fedora /bin/bash
这些值在设置时发送到适当syscall
的位置。Docker 不执行任何字节转换。设置值时请考虑到这一点。
供nproc
使用
小心设置Linux 设计nproc
的ulimit
标志,nproc
以设置用户可用的最大进程数,而不是容器。例如,以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-signal)
该--stop-signal
标志设置将发送到容器以退出的系统调用信号。该信号可以是格式为 的信号名称SIG<NAME>
,例如SIGKILL
,或者与内核系统调用表中的位置匹配的无符号数字,例如9
。
默认是STOPSIGNAL
在图像中定义的,或者SIGTERM
如果图像没有STOPSIGNAL
定义。
可选的安全选项 (–security-opt)
在 Windows 上,此标志可用于指定credentialspec
选项。credentialspec
必须采用以下格式file://spec.txt
或registry://keyname
.
停止容器超时(–stop-timeout)
该标志设置在发送预定义(参见)系统调用信号--stop-timeout
后等待容器停止的秒数。--stop-signal
如果超时后容器没有退出,它会被一个SIGKILL
信号强行杀死。
如果--stop-timeout
设置为-1
,则不应用超时,守护进程将无限期地等待容器退出。
默认值由守护程序确定,Linux 容器为 10 秒,Windows 容器为 30 秒。
为容器指定隔离技术(–isolation)
此选项在您在 Windows 上运行 Docker 容器的情况下很有用。该--isolation=<value>
选项设置容器的隔离技术。在 Linux 上,唯一支持的是default
使用 Linux 命名空间的选项。这两个命令在 Linux 上是等效的:
$ docker run -d busybox top
$ docker run -d --isolation default busybox top
在 Windows 上,--isolation
可以采用以下值之一:
价值 | 描述 |
---|---|
default |
使用 Docker 守护程序--exec-opt 或系统默认值指定的值(见下文)。 |
process |
共享内核命名空间隔离。 |
hyperv |
Hyper-V 管理程序基于分区的隔离。 |
Windows服务器操作系统默认隔离,process
Windowshyperv
客户端操作系统,如Windows 10,进程隔离性能较好,但要求镜像和主机使用相同的内核版本。
在 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
如果您--exec-opt isolation=hyperv
在 Docker 上设置了选项daemon
,或者正在针对基于 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
指定容器可用内存的硬性限制(-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
在运行时配置命名空间内核参数 (sysctls) (–sysctl)
在--sysctl
容器中设置命名空间内核参数 (sysctls)。例如,要在容器网络命名空间中打开 IP 转发,请运行以下命令:
$ docker run --sysctl net.ipv4.ip_forward=1 someimage
笔记
并非所有的 sysctl 都是命名空间的。Docker 不支持在容器内更改同时修改主机系统的 sysctl。随着内核的发展,我们期望看到更多的 sysctl 被命名空间化。
当前支持的 sysctl
IPC命名空间:
kernel.msgmax
,kernel.msgmnb
,kernel.msgmni
,kernel.sem
,kernel.shmall
,kernel.shmmax
,kernel.shmmni
,kernel.shm_rmid_forced
.- 系统开始于
fs.mqueue.*
- 如果您使用该
--ipc=host
选项,则不允许使用这些 sysctl。
网络命名空间:
- 系统开始于
net.*
- 如果您使用该
--network=host
选项,则不允许使用这些 sysctl。
评论区