欢迎访问shiker.tech

请允许在我们的网站上展示广告

您似乎使用了广告拦截器,请关闭广告拦截器。我们的网站依靠广告获取资金。

【译文】docker容器运行命令
(last modified Jun 26, 2023, 12:31 PM )
by
侧边栏壁纸
  • 累计撰写 182 篇文章
  • 累计创建 64 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

【译文】docker容器运行命令

橙序员
2023-02-12 / 0 评论 / 0 点赞 / 506 阅读 / 8,354 字 / 正在检测百度是否收录... 正在检测必应是否收录...
文章摘要(AI生成)

docker容器运行命令是用于创建和运行新容器的命令。使用该命令,可以在指定的镜像上创建一个可写容器层,并使用指定的命令启动该容器。停止的容器可以使用docker start命令重新启动。可以通过docker ps -a命令查看所有容器的列表。该命令还提供了许多选项,用于添加自定义主机映射、附加到容器的输入输出流、设置CPU和内存限制等。可以通过--add-host选项添加自定义主机映射,通过--attach选项附加到容器的输入输出流。还可以使用其他选项来设置CPU和内存限制,以及其他一些功能的添加或删除。该命令还支持使用Cgroup命名空间来运行容器。示例用法和更多详细信息可以在官方文档中找到。

docker容器运行

从镜像创建并运行新容器

用法

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

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

说明

docker run命令首先creates在指定图像上创建一个可写容器层,然后starts使用指定命令。也就是说, docker run相当于 API /containers/createthen /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;在容器中创建交互式bashshell。在示例中,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 runDocker退出时会关闭这个文件。

完整的容器功能(–特权)

$ 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标志为容器提供了所有功能,它还解除了devicecgroup 控制器强制执行的所有限制。换句话说,容器几乎可以做宿主可以做的所有事情。这个标志的存在是为了允许特殊的用例,比如在 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。此选项仅适用于devicemapperbtrfsoverlay2windowsfilter图形zfs驱动程序。对于devicemapperbtrfs和图形驱动程序windowsfilterzfs用户不能传递小于默认 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

这会将容器的端口绑定到主机的8080TCP 端口。您还可以指定和端口。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)

( --attachor -a) 标志告诉docker run绑定到容器的 STDIN, STDOUTor STDERR。这使得可以根据需要操纵输出和输入。

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

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

$ docker run -a stderr ubuntu echo test

除非出现错误,否则不会打印任何内容,因为我们只附加到STDERR容器的。容器的日志仍然存储写入的内容STDERRSTDOUT

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

这是一种--attach将构建文件通过管道传输到容器中的方法。构建完成后将打印容器的 ID,并且可以使用docker logs. 如果您需要将文件或其他内容通过管道传输到容器中并在容器完成运行后检索容器的 ID,这将很有用。

另请docker cp参阅命令

将主机设备添加到容器 (–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 设计nproculimit标志,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.txtregistry://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服务器操作系统默认隔离,processWindowshyperv 客户端操作系统,如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。
0

评论区