Docker 容器运行

描述从镜像创建并运行新容器
用法docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]
别名
docker run

描述

docker runcommand 在新容器中运行命令,根据需要拉取镜像并启动容器。

您可以使用docker start. 用docker ps -a查看所有容器的列表,包括已停止的容器。

选项

选择违约描述
--add-host添加自定义主机到 IP 映射 (host:ip)
--annotationAPI 1.43+向容器添加注释(传递到 OCI 运行时)
-a, --attach连接到 STDIN、STDOUT 或 STDERR
--blkio-weight块 IO (相对权重),介于 10 和 1000 之间,或 0 表示禁用(默认为 0)
--blkio-weight-device块 IO 权重(相对设备权重)
--cap-add添加 Linux 功能
--cap-drop丢弃 Linux 功能
--cgroup-parent容器的可选父 cgroup
--cgroupnsAPI 1.41+要使用的 cgroup 命名空间 (host|private)
'host': 在 Docker 主机的 cgroup 命名空间
中运行容器'private': 在其自己的私有 cgroup 命名空间
中运行容器'': 使用守护进程上
default-cgroupns-mode 选项配置的 cgroup 命名空间(默认)
--cidfile将容器 ID 写入文件
--cpu-countCPU 计数(仅限 Windows)
--cpu-percentCPU 百分比(仅限 Windows)
--cpu-period限制 CPU CFS (Completely Fair Scheduler) 周期
--cpu-quota限制 CPU CFS (Completely Fair Scheduler) 配额
--cpu-rt-periodAPI 1.25+限制 CPU 实时周期(以微秒为单位)
--cpu-rt-runtimeAPI 1.25+限制 CPU 实时运行时间(以微秒为单位)
-c, --cpu-sharesCPU 份额(相对权重)
--cpusAPI 1.25+CPU 数量
--cpuset-cpus允许执行的 CPU (0-3, 0,1)
--cpuset-mems允许在其中执行的 MEM (0-3, 0,1)
-d, --detach在后台运行容器并打印容器 ID
--detach-keys覆盖用于分离容器的键序列
--device将主机设备添加到容器
--device-cgroup-rule向 cgroup 允许的设备列表添加规则
--device-read-bps限制设备读取速率(每秒字节数)
--device-read-iops限制设备读取速率(每秒 IO)
--device-write-bps限制设备的写入速率 (每秒字节数)
--device-write-iops限制设备的写入速率(每秒 IO)
--disable-content-trusttrue跳过镜像验证
--dns设置自定义 DNS 服务器
--dns-option设置 DNS 选项
--dns-search设置自定义 DNS 搜索域
--domainname容器 NIS 域名
--entrypoint覆盖镜像的默认 ENTRYPOINT
-e, --env设置环境变量
--env-file读入环境变量文件
--expose公开一个端口或一系列端口
--gpusAPI 1.40+要添加到容器的 GPU 设备('all' 传递所有 GPU)
--group-add添加其他群组以加入
--health-cmd运行以检查运行状况的命令
--health-interval运行检查之间的时间 (ms|s|m|h)(默认为 0s)
--health-retries报告运行状况不佳所需的连续失败
--health-start-interval接口 1.44+在开始时段运行检查之间的时间 (ms|s|m|h)(默认为 0s)
--health-start-periodAPI 1.29+容器在开始运行状况重试倒计时之前要初始化的开始时间 (ms|s|m|h)(默认为 0s)
--health-timeout允许运行一项检查的最长时间 (ms|s|m|h)(默认为 0s)
--help打印使用情况
-h, --hostname容器主机名
--initAPI 1.25+在容器内运行一个 init,用于转发 signals 和 reaps 进程
-i, --interactive即使未连接,也请保持 STDIN 打开
--io-maxbandwidth系统驱动器的最大 IO 带宽限制(仅限 Windows)
--io-maxiops系统驱动器的最大 IOps 限制(仅限 Windows)
--ipIPv4 地址(例如,172.30.100.104)
--ip6IPv6 地址(例如,2001:db8::33)
--ipc要使用的 IPC 模式
--isolation容器隔离技术
--kernel-memory内核内存限制
-l, --label在容器上设置元数据
--label-file读取标签的行分隔文件
--link向另一个容器添加链接
--link-local-ip容器 IPv4/IPv6 链接本地地址
--log-driver容器的日志记录驱动程序
--log-opt日志驱动程序选项
--mac-address容器 MAC 地址(例如,92:d0:c6:0a:29:33)
-m, --memory内存限制
--memory-reservation内存软限制
--memory-swap交换限制等于内存加上交换:“-1”,用于启用无限交换
--memory-swappiness-1优化容器内存交换性(0 到 100)
--mount将文件系统挂载附加到容器
--name为容器分配名称
--network将容器连接到网络
--network-alias为容器添加网络范围的别名
--no-healthcheck禁用任何容器指定的 HEALTHCHECK
--oom-kill-disable禁用 OOM Killer
--oom-score-adj调整主机的 OOM 首选项(-1000 到 1000)
--pid要使用的 PID 命名空间
--pids-limit调整容器 pids 限制(设置为 -1 表示无限制)
--platform接口 1.32+如果服务器支持多平台,则设置 platform
--privileged为此容器授予扩展权限
-p, --publish将容器的端口发布到主机
-P, --publish-all将所有公开的端口发布到随机端口
--pullmissing在运行之前拉取镜像 (always,missing,never)
-q, --quietSuppress the pull 输出
--read-only以只读方式挂载容器的根文件系统
--restartno容器退出时要应用的重启策略
--rm容器退出时自动删除容器及其关联的匿名卷
--runtime用于此容器的运行时
--security-opt安全选项
--shm-size/dev/shm 的大小
--sig-proxytrue代理接收到进程的信号
--stop-signal停止容器的信号
--stop-timeoutAPI 1.25+停止容器的超时 (秒)
--storage-opt容器的存储驱动程序选项
--sysctlSysctl 选项
--tmpfs挂载 tmpfs 目录
-t, --tty分配伪 TTY
--ulimitUlimit 选项
-u, --user用户名或 UID (格式: <name|uid>[:<group|gid>])
--userns要使用的用户命名空间
--uts要使用的 UTS 命名空间
-v, --volume绑定挂载卷
--volume-driver容器的可选卷驱动程序
--volumes-from从指定的容器挂载卷
-w, --workdir容器内的工作目录

例子

分配名称 (--name)

--nameflag 允许您为容器指定自定义标识符。这 以下示例运行一个名为test使用nginx:alpine镜像 在 detached 模式下

$ docker run --name test -d nginx:alpine
4bed76d3ad428b889c56c1ecc2bf2ed95cb08256db22dc5ef5863e1d03252a19
$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED        STATUS                  PORTS     NAMES
4bed76d3ad42   nginx:alpine   "/docker-entrypoint.…"   1 second ago   Up Less than a second   80/tcp    test

您可以使用其他命令按名称引用容器。例如, 以下命令停止并删除名为test:

$ docker stop test
test
$ docker rm test
test

如果您未使用--name标志,守护进程会分配 随机生成的名称,例如vibrant_cannon)添加到容器。使用 自定义名称的好处是具有易于记忆的 ID 容器。

此外,如果将容器连接到用户定义的桥接网络,则其他 同一网络上的容器可以通过 DNS 按名称引用容器。

$ docker network create mynet
cb79f45948d87e389e12013fa4d969689ed2c3316985dd832a43aaec9a0fe394
$ docker run --name test --net mynet -d nginx:alpine
58df6ecfbc2ad7c42d088ed028d367f9e22a5f834d7c74c66c0ab0485626c32a
$ docker run --net mynet busybox:latest ping test
PING test (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.073 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.411 ms
64 bytes from 172.18.0.2: seq=2 ttl=64 time=0.319 ms
64 bytes from 172.18.0.2: seq=3 ttl=64 time=0.383 ms
...

捕获容器 ID (--cidfile)

为了帮助实现自动化,您可以让 Docker 将容器 ID 写入 文件。这类似于某些程序的写出方式 它们的进程 ID 添加到文件中(您可能已经将它们视为 PID 文件):

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

这将创建一个容器并打印test拖动到控制台。这cidfile标志使 Docker 尝试创建新文件并将容器 ID 写入该文件。 如果文件已存在,Docker 将返回错误。Docker 关闭此 file 当docker run出口。

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.

在某些情况下,您希望容器共享主机的进程命名空间 允许容器内的进程查看 系统。例如,您可以使用调试工具构建容器,例如stracegdb,但希望在 容器。

示例:在容器内运行 htop

运行htop在共享主机的进程 namespac 的容器中:

  1. 使用--pid=host选择:

    $ docker run --rm -it --pid=host alpine
    
  2. 安装htop在容器中:

    / # apk add --quiet htop
    
  3. 调用htop命令。

    / # htop
    

示例,加入另一个容器的 PID 命名空间

加入另一个容器的 PID 命名空间对于调试该 PID 命名空间非常有用 容器。

  1. 启动运行 Redis 服务器的容器:

    $ docker run --rm --name my-nginx -d nginx:alpine
    
  2. 运行一个 Alpine 容器,该容器将--pid命名空间设置为my-nginx容器:

    $ docker run --rm -it --pid=container:my-nginx \
      --cap-add SYS_PTRACE \
      --security-opt seccomp=unconfined \
      alpine
    
  3. 安装strace在 Alpine 容器中:

    / # apk add strace
    
  4. 将进程 ID 附加到进程 1,则my-nginx容器:

    / # strace -p 1
    strace: Process 1 attached
    

禁用容器的命名空间重新映射 (--userns)

如果您在守护进程上启用用户命名空间,则 默认情况下,所有容器都在启用用户命名空间的情况下启动。 要禁用特定容器的用户命名空间重新映射, 您可以设置--usernsflag 设置为host.

docker run --userns=host hello-world

host--userns旗。

有关更多信息,请参阅隔离具有用户命名空间的容器

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 命名空间。设置--utshost导致容器使用与主机相同的 UTS 命名空间。

注意

Docker 不允许将--hostname--domainname带有--uts=host.这是为了防止容器在主机的 UTS 中运行 命名空间尝试更改主机的配置。

如果您希望 容器的主机名,要随着主机主机名的更改而更改。一个 更多 高级用例是从容器中更改主机的主机名。

IPC 设置 (--ipc)

--ipc="MODE"  : Set the IPC mode for the container

--ipcflag 接受以下值:

价值描述
""使用 daemon 的默认值。
“无”拥有私有 IPC 命名空间,未挂载 /dev/shm。
“私有”拥有私有 IPC 命名空间。
“可分享”拥有私有 IPC 命名空间,并可以与其他容器共享。
“容器:<名称或 ID>"加入另一个(“可共享”)容器的 IPC 命名空间。
“主机”使用主机系统的 IPC 命名空间。

如果未指定,则使用 daemon default,可以是"private""shareable",具体取决于守护程序版本和配置。

System V 进程间通信 (IPC) 命名空间提供命名共享内存段、信号量和 消息队列。

共享内存段用于加速 内存速度,而不是通过管道或网络堆栈。共享 内存通常由数据库使用,并且是定制的(通常是 C/OpenMPI、 C++/使用 boost 库)用于科学的高性能应用程序 计算机和金融服务行业。如果这些类型的应用程序 被分解为多个容器,您可能需要共享 IPC 机制 的容器,使用"shareable"mode 为主(即 “donor”) container 和"container:<donor-name-or-ID>"对于其他容器。

提升容器权限 (--privileged)

--privilegedflag 为容器提供以下功能:

  • 启用所有 Linux 内核功能
  • 禁用默认 seccomp 配置文件
  • 禁用默认 AppArmor 配置文件
  • 禁用 SELinux 进程标签
  • 授予对所有主机设备的访问权限
  • 使/sys读写
  • 使 cgroups 挂载为读写

换句话说,容器几乎可以做主机可以做的所有事情 做。此标志的存在是为了允许特殊用例,例如在 Docker。

警告

使用--privileged谨慎标记。 具有--privileged不是一个安全的沙盒进程。 此模式下的容器可以在主机上获取根 shell 并控制系统。

对于大多数用例,此标志不应是首选解决方案。 如果您的容器需要提升的权限, 您应该更愿意显式授予必要的权限, 例如,通过使用--cap-add.

有关更多信息,请参阅运行时权限和 Linux 功能

以下示例不起作用,因为默认情况下,Docker 丢弃的 具有潜在危险的内核功能,包括CAP_SYS_ADMIN (即 挂载文件系统所需的)。

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

当您添加--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

设置工作目录 (-w, --workdir)

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

-woption 运行在指定目录内执行的命令,在本例中为/path/to/dir/.如果路径不存在,Docker 会在容器内创建该路径。

为每个容器设置存储驱动程序选项 (--storage-opt)

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

此 (size) 在创建时将容器文件系统大小限制为 120G。 此选项仅适用于btrfs,overlay2,windowsfilter, 和zfs存储驱动程序。

对于overlay2storage 驱动程序,则仅当 backing filesystem 是xfs并使用pquotamount 选项。 在这些情况下,您可以传递小于后备文件系统大小的任何大小。

对于windowsfilter,btrfszfsstorage 驱动程序,则不能将 size 小于 Default BaseFS Size。

挂载 tmpfs (--tmpfs)

--tmpfsflag 允许您创建一个tmpfs安装。

您可以传递给--tmpfs与 Linux 相同mount -t tmpfs -o命令。以下示例将空的tmpfs到 容器的rw,noexec,nosuid,size=65536k选项。

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

有关更多信息,请参阅 tmpfs 挂载

挂载卷 (-v)

$ docker  run  -v $(pwd):$(pwd) -w $(pwd) -i -t  ubuntu pwd

上面的示例将当前目录挂载到容器中的同一路径 使用-v标志,将其设置为工作目录,然后运行pwd命令。

从 Docker Engine 版本 23 开始,您可以在主机上使用相对路径。

$ docker  run  -v ./content:/content -w /content -i -t  ubuntu pwd

上面的示例将content目录中的目录复制到位于/contentpath 使用-vflag 中,将其设置为工作目录,然后 运行pwd命令。

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

当绑定挂载卷的 host 目录不存在时,Docker 自动在主机上为您创建此目录。在 示例,Docker 会创建/doesnt/exist文件夹中。

以只读方式挂载卷 (--read-only)

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

您可以将卷与--read-onlyflag 来控制 容器写入文件。这--read-onlyflag 挂载容器的根 filesystem 设置为只读,禁止写入 为容器指定的卷。

$ 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 binary (参考 获取 Linux Binaries), 您授予容器创建和作主机的 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 的容器时失败,因为 容器内的卷或绑定挂载的 destination 必须是以下之一: 不存在或空的目录;或除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 标志添加绑定挂载或卷

--mountflag 允许您挂载卷、主机目录和tmpfs挂载在容器中。

--mountflag 支持-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 nginx:alpine

这将 bind port8080容器到 TCP 端口80upper127.0.0.1的 主机。您还可以指定udpsctp港口。网络概述 页面详细介绍了如何发布端口 与 Docker 一起使用。

注意

如果您未指定 IP 地址(即-p 80:80而不是-p 127.0.0.1:80:80),Docker 会发布 端口(地址0.0.0.0) 中。这些端口是 外部可访问。如果您将 UFW 配置为阻止此作,这也适用 特定端口,因为 Docker 管理自己的 iptables 规则。读 更多

$ docker run --expose 80 nginx:alpine

这会公开端口80的容器,而不将端口发布到主机 系统的接口。

发布所有公开的端口 (-P, --publish-all)

$ docker run -P nginx:alpine

-P--publish-all,标志将所有公开的端口发布到主机。 Docker 将每个公开的端口绑定到主机上的随机端口。

-Pflag 仅发布显式标记为 公开的,或者使用 DockerfileEXPOSE指令或--exposeflag 的docker run命令。

端口范围在 由/proc/sys/net/ipv4/ip_local_port_range.使用-p标志显式映射 单个端口或端口范围。

设置拉取策略 (--pull)

使用--pull标志设置镜像拉取策略 容器。

--pullflag 可以采用以下值之一:

价值描述
missing(默认)如果在镜像缓存中找不到镜像,请拉取该镜像,否则使用缓存的镜像。
never即使缺少镜像,也不要拉取镜像,如果镜像缓存中不存在该镜像,则会产生错误。
always始终在创建容器之前执行拉取。

从镜像创建(并运行)容器时,守护进程会检查 image 存在于本地镜像缓存中。如果镜像缺失,则错误为 返回到 CLI,允许它启动拉取。

默认值 (missing) 是仅在镜像不存在于 daemon 的镜像缓存。此默认值允许您运行仅存在的镜像 本地(例如,您从 Dockerfile 构建的镜像,但尚未 被推送到注册表),并减少联网。

always选项始终在创建容器之前启动拉取。这 选项可确保镜像是最新的,并防止您使用过时的 镜像,但可能不适用于您想要在本地测试 在推送之前构建的镜像(因为拉取镜像会覆盖现有镜像 在镜像缓存中)。

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

以下示例显示了docker run使用--pull=neveroption set 中, 这会产生 en 错误,因为 image-cache 中缺少镜像:

$ 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要设置 simple (non-array) 的标志 环境变量,或覆盖变量 在您正在运行的镜像的 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 客户端会检查变量 has 在本地环境中,并将其传递给容器。 如果未提供 no 且该变量未导出到本地 environment,则变量在容器中未设置。=

您还可以从文件加载环境变量。此文件应使用 语法<variable>=value(将变量设置为给定值)或<variable>(从本地环境获取值),对于 评论。以 开头的行被视为行注释,并且 ignored,而出现在行中其他任何位置的 a 被视为 变量值。###

$ 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-labelkey 未指定值,因此标签默认为空 string () 的 URL 中。要添加多个标签,请重复标签标志 (""-l--label).

key=value必须是唯一的,以避免覆盖 label 值。如果你 指定键相同但值不同的标签,每个后续值 覆盖上一个。Docker 使用最后一个key=value你供应。

使用--label-file标志从一个文件中加载多个标签。分隔每个 label 在文件中带有 EOL 标记。以下示例从 labels 文件:

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

label-file 格式类似于加载环境的格式 变量。(与环境变量不同,标签对进程不可见 在容器内运行。以下示例显示了一个 label-file 格式:

com.example.label1="a label"

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

您可以通过提供多个--label-file标志。

有关使用标签的其他信息,请参阅标签

将容器连接到网络 (--network)

要启动容器并将其连接到网络,请使用--network选择。

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

您可以将多个容器连接到同一网络。连接后, 容器只能使用另一个容器的 IP 地址进行通信 或名称。为overlay支持多主机的网络或自定义插件 连接性,容器连接到同一多主机网络但已启动 也可以通过这种方式进行通信。

注意

默认桥接网络只允许容器使用 内部 IP 地址。用户创建的桥接网络在 使用容器名称的容器。

您可以使用docker network disconnect命令。

以下命令将创建一个名为my-net并添加一个busybox容器 到my-net网络。

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

您还可以使用--ip--ip6标志。要分配 static IP to containers,则必须为网络指定子网块。

$ docker network create --subnet 192.0.2.0/24 my-net
$ docker run -itd --network=my-net --ip=192.0.2.69 busybox

要将容器连接到多个网络,请重复--network选择。

$ docker network create --subnet 192.0.2.0/24 my-net1
$ docker network create --subnet 192.0.3.0/24 my-net2
$ docker run -itd --network=my-net1 --network=my-net2 busybox

要在连接到多个网络时指定选项,请使用扩展语法 对于--network旗。逗号分隔选项,可以在扩展的--network语法是:

选择顶级等效项描述
name网络名称 (必填)
alias--network-alias为容器添加网络范围的别名
ip--ipIPv4 地址(例如,172.30.100.104)
ip6--ip6IPv6 地址(例如,2001:db8::33)
mac-address--mac-address容器 MAC 地址(例如,92:d0:c6:0a:29:33)
link-local-ip--link-local-ip容器 IPv4/IPv6 链接本地地址
driver-optdocker network connect --driver-opt网络驱动程序选项
$ docker network create --subnet 192.0.2.0/24 my-net1
$ docker network create --subnet 192.0.3.0/24 my-net2
$ docker run -itd --network=name=my-net1,ip=192.0.2.42 --network=name=my-net2,ip=192.0.3.42 busybox

sysctlnet.ipv4.,net.ipv6.net.mpls.可以是 使用 SET PER-Interface 使用driver-opt标签com.docker.network.endpoint.sysctls. 接口名称必须是字符串IFNAME.

设置多个sysctl对于接口,请引用整个driver-opt田 如有必要,请记住转义 shell 的引号。例如,如果 接口my-net是给定名称eth0中,以下示例将 sysctlsnet.ipv4.conf.eth0.log_martians=1net.ipv4.conf.eth0.forwarding=0和 分配 IPv4 地址192.0.2.42.

$ docker network create --subnet 192.0.2.0/24 my-net
$ docker run -itd --network=name=my-net,\"driver-opt=com.docker.network.endpoint.sysctls=net.ipv4.conf.IFNAME.log_martians=1,net.ipv4.conf.IFNAME.forwarding=0\",ip=192.0.2.42 busybox

注意

网络驱动程序可能会限制可以修改的 sysctl 设置,并且为了保护 网络的运行,将来可能会添加新的限制。

有关在使用run命令 请参阅 Docker 网络概述

从容器挂载卷 (--volumes-from)

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

--volumes-fromflag 从引用的 器皿。您可以通过重复--volumes-from论点。容器 ID 可以选择以:ro:rw自 分别以只读或读写模式挂载卷。默认情况下, Docker 以与 引用容器。

像 SELinux 这样的标签系统需要在卷上放置适当的标签 内容挂载到容器中。如果没有标签,安全系统可能会 阻止在容器内运行的进程使用内容。由 default,Docker 不会更改作系统设置的标签。

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

分离模式 (-d, --detach)

--detach(或-d) 标志将容器作为后台进程启动,该 不会占用您的终端窗口。根据设计,容器以 detached 模式退出,除非你 此外,指定--rm选择。如果您使用-d--rm,则容器为 在它退出或守护进程退出时删除,以先发生者为准。

不要传递service x start命令添加到分离的容器中。例如 此命令尝试启动nginx服务。

$ docker run -d -p 80:80 my_image service nginx start

这将成功启动nginxservice 的 intent 实例。但是,它 detached container 范例失败,因为根进程 (service nginx start) 返回,并且分离的容器将按设计停止。因此,nginx服务已启动,但无法使用。相反,要启动诸如 这nginxWeb Server 执行以下作:

$ docker run -d -p 80:80 my_image nginx -g 'daemon off;'

要使用分离的容器进行输入/输出,请使用网络连接或共享 卷。这些是必需的,因为容器不再侦听 命令行,其中docker run运行。

覆盖分离序列 (--detach-keys)

使用--detach-keys选项覆盖 Docker 键序列以进行分离。 如果 Docker 默认序列与键序列冲突,这非常有用 用于其他应用程序。有两种方法可以定义您自己的 detach key sequence 作为每个容器的覆盖或作为 整个配置。

要覆盖单个容器的顺序,请使用--detach-keys="<sequence>"flag 替换为docker attach命令。格式 这<sequence>是字母 [a-Z],或者ctrl-与任何 以下内容:

  • a-z(单个小写字母字符)
  • @(签到)
  • [(左括号)
  • \\(两个反斜杠)
  • _(下划线)
  • ^(插入符号)

这些a,ctrl-a,Xctrl-\\values 都是 valid key 的示例 序列。为所有 containers 中,请参阅 配置文件 部分

将主机设备添加到容器 (--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选项启用该选项。例如,添加特定的块存储设备或循环 device 或 audio 设备复制到其他非特权容器 (没有--privileged标志),并让应用程序直接访问它。

默认情况下,容器能够read,writemknod这些设备。 这可以使用第三个:rwm选项集--device旗。如果容器在特权模式下运行,则 Docker 会忽略 指定权限。

$ 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 2018 年 10 月更新,Windows 仅支持 IdTypeclass和 Id 作为设备接口类 GUID 的 请参阅 Windows 容器中定义的表 docs 获取容器支持的设备接口类 GUID 列表。

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

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

注意

--device选项仅在进程隔离的 Windows 容器上受支持, 如果容器隔离度为hyperv.

CDI 设备

注意

CDI 功能是实验性的,可能会发生变化。 CDI 目前仅支持 Linux 容器。

容器设备接口 (CDI)是容器运行时创建容器的标准化机制,该 能够与第三方设备交互。

使用 CDI 时,设备配置是使用 JSON 或 YAML 以声明方式定义的 文件。除了使容器能够与设备节点交互之外, 它还允许您为设备指定其他配置,例如 环境变量、主机挂载(例如共享对象)和可执行文件 钩。

您可以使用--device标志使用 设备的完全限定名称,如以下示例所示:

$ docker run --device=vendor.com/class=device-name --rm -it ubuntu

这将启动ubuntu容器,可以访问指定的 CDI 设备,vendor.com/class=device-name,假设:

  • 所请求设备的有效 CDI 规范(JSON 或 YAML 文件)为 在运行守护程序的系统上可用,位于配置的 CDI 之一中 规范目录。
  • 已在守护程序中启用 CDI 功能;请参阅启用 CDI 设备

附加到 STDIN/STDOUT/STDERR (-a, --attach)

--attach(或-a) 标志告诉docker run绑定到容器的STDIN,STDOUTSTDERR.这使得作输出成为可能 并根据需要输入您可以指定三个标准流中的哪一个 (STDIN,STDOUT,STDERR),您希望改为连接,如下所示:

$ docker run -a stdin -a stdout -i -t ubuntu /bin/bash

以下示例将数据通过管道传输到容器中,并打印容器的 ID 通过仅附加到容器的STDIN.

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

以下示例不会将任何内容打印到控制台,除非有 错误,因为 output 仅附加到STDERR容器。这 容器的日志仍然存储写入的内容STDERRSTDOUT.

$ docker run -a stderr ubuntu echo test

以下示例显示了一种使用--attach将文件通过管道传输到 容器。该命令在构建完成后打印容器的 ID,并 您可以使用docker logs.如果您需要,这将非常有用 将文件或其他内容通过管道传输到容器中,并检索容器的 容器完成运行后的 ID。

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

注意

在容器内作为 PID 1 运行的进程由 Linux:它使用 default作忽略任何信号。所以,这个过程 不终止于SIGINTSIGTERM除非它被编码为这样做。

另请参阅docker cp命令.

保持 STDIN 打开(-i、--交互式)

--interactive(或-i) 标志保留容器的STDINopen,然后让 您可以通过 Standard Input 将 Input 发送到容器。

$ echo hello | docker run --rm -i busybox cat
hello

-iflag 最常与--tty标志绑定 I/O 流到伪终端,创建交互式终端 容器的会话。有关更多示例,请参阅分配伪 TTY

$ docker run -it debian
root@10a3e71492b0:/# factor 90
90: 2 3 3 5
root@10a3e71492b0:/# exit
exit

使用-i标志允许进行组合,例如将管道输入到 器皿:

$ docker run --rm -i busybox echo "foo bar baz" \
  | docker run --rm -i busybox awk '{ print $2 }' \
  | docker run --rm -i busybox rev
rab

指定 init 进程

您可以使用--init标志,指示 init 进程应用作 容器中的 PID 1。指定 init 进程可确保通常的 Init 系统的责任(例如收割僵尸进程)是 在创建的容器内执行。

使用的默认 init 进程是第一个docker-init可执行文件在 docker 守护进程的系统路径。这docker-initbinary,包含在 默认安装由 Tini 提供支持。

分配伪 TTY (-t, --tty)

--tty(或-t) 标志将伪 TTY 附加到容器,将 您的终端连接到容器的 I/O 流。将伪 TTY 分配给 容器意味着您可以访问 TTY 的输入和输出功能 devices 提供。

例如,以下命令运行passwd命令在debian容器中,为root用户。

$ docker run -i debian passwd root
New password: karjalanpiirakka9
Retype new password: karjalanpiirakka9
passwd: password updated successfully

如果仅使用-i标志(允许您将文本发送到STDIN中),则passwd提示符以纯文本显示密码 发短信。但是,如果您尝试相同的作,但同时添加-tflag 中, password 被隐藏:

$ docker run -it debian passwd root
New password:
Retype new password:
passwd: password updated successfully

这是因为passwd可以抑制字符到终端的输出 使用回声关闭 TTY 功能。

您可以使用-tflag 不带-i旗。这仍然会分配一个伪 TTY 添加到容器,但无法写入STDIN.唯一一次 如果容器的输出需要 TTY 环境,则可能很有用。

指定自定义 cgroups

使用--cgroup-parent标志,您可以传递特定的 cgroup 来运行 容器。这允许您自行创建和管理 cgroup。您可以 为这些 cgroups 定义自定义资源,并将容器放在一个通用的 父组。

使用动态创建的设备 (--device-cgroup-rule)

Docker 在创建时为容器分配可用的设备。这 分配的设备将添加到 cgroup.allow 文件中,并且 created 到容器中。这会带来一个问题 您需要将新设备添加到正在运行的容器中。

一种解决方案是向容器添加更宽松的规则 允许它访问更广泛的设备。例如,假设 容器需要访问具有 major 的字符设备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

注意

您还可以使用--device标志,请参阅 CDI 设备

有关更多信息,请参阅指定容器的资源

要使用--gpus中,指定要使用的 GPU(或所有 GPU)。如果您不提供任何值,Docker 将使用所有 可用的 GPU。以下示例公开了所有可用的 GPU。

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

使用device选项以指定 GPU。下面的示例公开了特定的 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"' ubuntu nvidia-smi

重启策略 (--restart)

使用--restart标志以指定容器的重启策略。重启 策略控制 Docker 守护程序是否在退出后重新启动容器。 Docker 支持以下重启策略:

描述
no不要自动重启容器。(默认)
on-failure[:max-retries]如果容器由于错误而退出,请重新启动容器,该错误表现为非零退出代码。(可选)使用:max-retries选择。这on-failure策略仅在容器退出失败时提示重启。如果守护程序重新启动,它不会重新启动容器。
always如果容器停止,请始终重新启动容器。如果手动停止,则仅当 Docker 守护程序重新启动或手动重新启动容器本身时,才会重新启动。
unless-stoppedalways,不同之处在于,当容器停止(手动或其他方式)时,即使在 Docker 守护程序重新启动后,它也不会重新启动。
$ docker run --restart=always redis

这将运行redis重启策略为 Always 的容器。 如果容器退出,Docker 将重新启动它。

当重启策略在容器上处于活动状态时,它显示为UpRestartingdocker ps.使用docker events以查看生效的重新启动策略。

增加的延迟(之前延迟的两倍,从 100 毫秒开始) 在每次重启之前添加,以防止服务器泛洪。这意味着 守护进程等待 100 毫秒,然后等待 200 毫秒、400、800、1600 等,直到 这on-failurelimit,则达到最大延迟 1 分钟,或者当您docker stopdocker rm -f容器。

如果容器成功重启(容器已启动并运行 至少 10 秒),延迟将重置为其默认值 100 毫秒。

指定重启尝试次数的限制

您可以指定 Docker 尝试重新启动 容器。默认情况下,Docker 永远不会停止 尝试重新启动容器。

以下示例运行redis重启策略为 on-failure 且最大重启计数为 10 的容器。

$ docker run --restart=on-failure:10 redis

如果redis容器以非零 exit 状态退出超过 10 次 ,Docker 会停止尝试重启容器。提供最大值 restart limit 仅对 on-failure 策略有效。

检查容器重启

容器的(尝试)重启次数可以使用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 自动清理 容器并删除文件系统,请在容器退出时使用--rm旗:

--rm: Automatically remove the container when it exits

注意

如果将--rm标志,Docker 还会删除匿名卷 在删除容器时与容器关联。这与此类似 到运行docker rm -v my-container.仅指定的卷 没有名称的 S S 将被删除。例如,在运行以下命令时, 卷/foo被删除,但未/bar:

$ docker run --rm -v /foo -v awesome:/bar busybox top

继承卷--volumes-from使用相同的逻辑删除: 如果原始卷指定了名称,则不会删除该卷。

将条目添加到容器主机文件 (--add-host)

您可以将其他主机添加到容器的/etc/hostsfile 使用一个 或 更多--add-host标志。此示例为名为my-hostname:

$ docker run --add-host=my-hostname=8.8.8.8 --rm -it alpine

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

您可以将 IPv6 地址括在方括号中:

$ docker run --add-host my-hostname=[2001:db8::33] --rm -it alpine

--add-hostflag 支持特殊的host-gateway值,解析为 主机的内部 IP 地址。当您希望容器 连接到主机上运行的服务。

使用host.docker.internal作为引用host-gateway.Docker Desktop 会自动解析此主机名,请参阅探索网络功能

以下示例显示了特殊的host-gatewayvalue 有效。这 示例运行一个 HTTP 服务器,该服务器通过host.docker.internalhostname,解析为主机的内部 IP。

$ echo "hello from host!" > ./hello
$ python3 -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
$ docker run \
  --add-host host.docker.internal=host-gateway \
  curlimages/curl -s host.docker.internal:8000/hello
hello from host!

--add-hostflag 还接受:separator 中,例如:

$ docker run --add-host=my-hostname:8.8.8.8 --rm -it alpine

记录驱动程序 (--log-driver)

容器可以具有与 Docker 守护程序不同的日志记录驱动程序。用 这--log-driver=<DRIVER>使用docker run命令配置 容器的日志记录驱动程序。

要了解支持的日志记录驱动程序及其使用方法,请参阅 配置日志记录驱动程序.

要禁用容器的日志记录,请将--log-driverflag 设置为none:

$ docker run --log-driver=none -d nginx:alpine
5101d3b7fe931c27c2ba0e65fd989654d297393ad65ae238f20b97a020e7295b
$ docker logs 5101d3b
Error response from daemon: configured logging driver does not support reading

在容器中设置 ulimits (--ulimit)

由于设置ulimit容器中的设置不需要额外的权限 在默认容器中可用,您可以使用--ulimit旗。 指定--ulimit格式中具有软限制和硬限制<type>=<soft limit>[:<hard limit>].例如:

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

注意

如果您未提供硬限制值,Docker 将使用软限制值 对于这两个值。如果您未提供任何值,则它们将从 默认的ulimits设置在守护进程上。

注意

as选项已弃用。 换句话说,不支持以下脚本:

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

Docker 将值发送到相应的作系统syscall并且不执行任何字节转换。 在设置值时,请考虑这一点。

nproc用法

小心设置nproc使用ulimit标志,因为 Linux 使用nproc要设置 用户可用的最大进程数,而不是容器可用的最大进程数。例如,开始 4 容器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导致前三个容器用完 UP 为daemon用户。

使用信号停止容器 (--stop-signal)

--stop-signalflag 将系统调用信号发送到 容器退出。此信号可以是格式为SIG<NAME>, 例如SIGKILL或与 内核的 syscall 表,例如9.

默认值由STOPSIGNAL在镜像中,或SIGTERM如果镜像没有STOPSIGNAL定义。

可选安全选项 (--security-opt)

选择描述
--security-opt="label=user:USER"为容器设置标签 user
--security-opt="label=role:ROLE"设置容器的标签角色
--security-opt="label=type:TYPE"设置容器的标签类型
--security-opt="label=level:LEVEL"设置容器的标签级别
--security-opt="label=disable"关闭容器的标签限制
--security-opt="apparmor=PROFILE"设置要应用于容器的 apparmor 配置文件
--security-opt="no-new-privileges=true"禁止容器进程获取新权限
--security-opt="seccomp=unconfined"关闭容器的 seccomp 限制
--security-opt="seccomp=builtin"使用容器的默认(内置)seccomp 配置文件。这可用于为在具有自定义默认配置文件集的守护进程上运行的容器启用 seccomp,或者禁用 seccomp(“unconfined”)。
--security-opt="seccomp=profile.json"将 seccomp Json 文件列入白名单的 seccomp Json 文件用作 seccomp 过滤器
--security-opt="systempaths=unconfined"关闭容器的系统路径(掩码路径、只读路径)的限制

--security-optflag 允许您覆盖 容器。在以下命令中指定级别允许您共享 容器之间的内容相同。

$ docker run --security-opt label=level:s0:c100,c200 -it fedora bash

注意

不支持 MLS 标签的自动翻译。

要完全禁用容器的安全标签,您可以使用label=disable:

$ docker run --security-opt label=disable -it ubuntu bash

如果您希望对容器内的进程采取更严格的安全策略,您可以 可以指定自定义type标签。以下示例运行容器 只允许监听 Apache 端口:

$ docker run --security-opt label=type:svirt_apache_t -it ubuntu bash

注意

您必须编写策略来定义svirt_apache_t类型。

为了防止您的容器进程获得额外的权限,您可以 使用以下命令:

$ docker run --security-opt no-new-privileges -it ubuntu bash

这意味着,提升权限的命令(例如susudo不再有效。 它还会导致在删除权限后应用任何 seccomp 过滤器 这可能意味着您可以拥有一组更严格的过滤器。 有关更多详细信息,请参阅内核文档

在 Windows 上,您可以使用--security-opt标志指定credentialspec选择。 这credentialspec必须采用file://spec.txtregistry://keyname.

超时停止容器 (--stop-timeout)

--stop-timeoutflag 设置等待容器的秒数 在发送预定义的--stop-signal) 系统调用信号。 如果容器在超时后没有退出,则会被强制杀死 替换为SIGKILL信号。

如果您将--stop-timeout-1,则不会应用超时,并且守护程序 无限期等待容器退出。

守护程序确定默认值,对于 Linux 容器,为 10 秒。 Windows 容器为 30 秒。

指定容器的隔离技术 (--isolation)

当您在 Docker 容器上运行 Docker 容器时,此选项非常有用 窗户。这--isolation=<value>option 设置容器的隔离技术。 在 Linux 上,唯一支持的是default选项,该选项使用 Linux 命名空间。 这两个命令在 Linux 上是等效的:

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

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

价值描述
default使用 Docker 守护程序的--exec-opt或 system default (见下文)。
process共享内核命名空间隔离。
hypervHyper-V 虚拟机管理程序基于分区的隔离。

Windows Server作系统上的默认隔离为processhyperv在 Windows 客户端作系统(如 Windows 10)上。进程隔离具有更好的 性能,但要求镜像和主机使用相同的内核版本。

在 Windows Server 上,假设默认配置,这些命令是等效的 并导致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=hypervDocker 上的选项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 上,这对容器的影响不同,具体取决于您使用的隔离类型。

  • processisolation,则 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

在运行时配置命名空间内核参数 (sysctl) (--sysctl)

--sysctl在 容器。例如,要在容器中启用 IP 转发 network 命名空间,请运行以下命令:

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

注意

并非所有 sysctl 参数都有命名空间。Docker 不支持更改 sysctl 参数 在容器内,该容器也会修改主机系统。作为内核 evolves,我们预计会看到更多的 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选项。