docker容器运行
描述 | 从映像创建并运行新容器 |
---|---|
用法 | docker container run [OPTIONS] IMAGE [COMMAND] [ARG...] |
别名 | docker run |
描述
该docker run
命令在新容器中运行命令,根据需要拉取映像并启动容器。
您可以使用 重新启动已停止的容器,并保持其之前的所有更改不变docker start
。用于docker ps -a
查看所有容器的列表,包括已停止的容器。
选项
选项 | 默认 | 描述 |
---|---|---|
--add-host | 添加自定义主机到 IP 映射 (host:ip) | |
--annotation | API 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 | |
--cgroupns | API 1.41+
要使用的 Cgroup 命名空间 (host|private) 'host':在 Docker 主机的 cgroup 命名空间中运行容器 'private':在其自己的私有 cgroup 命名空间中运行容器'':使用默认 配置的 cgroup 命名空间 守护进程上的 -cgroupns-mode 选项(默认) | |
--cidfile | 将容器ID写入文件 | |
--cpu-count | CPU 计数(仅限 Windows) | |
--cpu-percent | CPU 百分比(仅限 Windows) | |
--cpu-period | 限制CPU CFS(完全公平调度程序)周期 | |
--cpu-quota | 限制CPU CFS(完全公平调度程序)配额 | |
--cpu-rt-period | API 1.25+ 以微秒为单位限制 CPU 实时周期 | |
--cpu-rt-runtime | API 1.25+ 以微秒为单位限制 CPU 实时运行时间 | |
-c, --cpu-shares | CPU 份额(相对权重) | |
--cpus | API 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-trust | true | 跳过图像验证 |
--dns | 设置自定义 DNS 服务器 | |
--dns-option | 设置 DNS 选项 | |
--dns-search | 设置自定义 DNS 搜索域 | |
--domainname | 容器NIS域名 | |
--entrypoint | 覆盖图像的默认ENTRYPOINT | |
-e, --env | 设置环境变量 | |
--env-file | 读入环境变量文件 | |
--expose | 公开一个端口或一系列端口 | |
--gpus | API 1.40+ GPU 设备添加到容器(“全部”传递所有 GPU) | |
--group-add | 添加其他群组以加入 | |
--health-cmd | 运行命令来检查运行状况 | |
--health-interval | 运行检查之间的时间 (ms|s|m|h)(默认 0s) | |
--health-retries | 需要连续失败才能报告不健康 | |
--health-start-interval | API 1.44+
在开始期间运行检查之间的时间 (ms|s|m|h)(默认 0s) | |
--health-start-period | API 1.29+ 启动
运行状况重试倒计时之前容器初始化的开始时间 (ms|s|m|h)(默认 0s) | |
--health-timeout | 允许运行一项检查的最长时间 (ms|s|m|h)(默认 0s) | |
--help | 打印用途 | |
-h, --hostname | 容器主机名 | |
--init | API 1.25+
在容器内运行 init 来转发信号并获取进程 | |
-i, --interactive | 即使未连接,也保持 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 | 内核内存限制 | |
-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 | 调整容器 pid 限制(设置 -1 表示无限制) | |
--platform | API 1.32+ 如果服务器支持多平台,则设置平台 | |
--privileged | 授予此容器扩展权限 | |
-p, --publish | 将容器的端口发布到主机 | |
-P, --publish-all | 将所有暴露的端口发布到随机端口 | |
--pull | missing | 运行前拉取镜像 ( always , missing , never ) |
-q, --quiet | 抑制拉动输出 | |
--read-only | 将容器的根文件系统挂载为只读 | |
--restart | no | 容器退出时应用的重新启动策略 |
--rm | 容器退出时自动移除 | |
--runtime | 用于此容器的运行时 | |
--security-opt | 安全选项 | |
--shm-size | /dev/shm 的大小 | |
--sig-proxy | true | 代理接收到进程的信号 |
--stop-signal | 发出停止容器的信号 | |
--stop-timeout | API 1.25+ 停止容器的超时(以秒为单位) | |
--storage-opt | 容器的存储驱动程序选项 | |
--sysctl | 系统选项 | |
--tmpfs | 挂载tmpfs目录 | |
-t, --tty | 分配伪 TTY | |
--ulimit | 极限选项 | |
-u, --user | 用户名或 UID(格式:<name|uid>[:<group|gid>]) | |
--userns | 要使用的用户命名空间 | |
--uts | 要使用的 UTS 命名空间 | |
-v, --volume | 绑定挂载卷 | |
--volume-driver | 容器的可选卷驱动程序 | |
--volumes-from | 从指定容器装载卷 | |
-w, --workdir | 容器内的工作目录 |
例子
指定名称(--name)
该--name
标志允许您为容器指定自定义标识符。以下示例在
分离模式test
下运行一个使用映像命名的容器。nginx:alpine
$ 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 退出时会关闭该文件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。
在某些情况下,您希望容器共享主机的进程命名空间,从而允许容器内的进程查看系统上的所有进程。例如,您可以使用
strace
或等调试工具构建容器gdb
,但希望在调试容器内的进程时使用这些工具。
示例:在容器内运行 htop
htop
要在共享主机进程名称空间的容器中运行:
使用以下选项运行 alpine 容器
--pid=host
:$ docker run --rm -it --pid=host alpine
安装
htop
到容器中:/ # apk add htop fetch https://dl-cdn.alpinelinux.org/alpine/v3.18/main/aarch64/APKINDEX.tar.gz fetch https://dl-cdn.alpinelinux.org/alpine/v3.18/community/aarch64/APKINDEX.tar.gz (1/3) Installing ncurses-terminfo-base (6.4_p20230506-r0) (2/3) Installing libncursesw (6.4_p20230506-r0) (3/3) Installing htop (3.2.2-r1) Executing busybox-1.36.1-r2.trigger OK: 9 MiB in 18 packages
调用
htop
命令。/ # htop
例如,加入另一个容器的 PID 命名空间
加入另一个容器的 PID 命名空间对于调试该容器非常有用。
启动一个运行 Redis 服务器的容器:
$ docker run --rm --name my-nginx -d nginx:alpine
运行一个 Alpine 容器,将
--pid
命名空间附加到my-nginx
容器:$ docker run --rm -it --pid=container:my-nginx \ --cap-add SYS_PTRACE \ --security-opt seccomp=unconfined \ alpine
安装
strace
在 Alpine 容器中:/ # apk add strace
附加到进程1,容器的进程ID
my-nginx
:/ # strace -p 1 strace: Process 1 attached
禁用容器的命名空间重新映射 (--userns)
如果在守护进程上启用用户命名空间,则默认情况下所有容器都会在启用用户命名空间的情况下启动。要禁用特定容器的用户命名空间重新映射,您可以将该--userns
标志设置为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 命名空间。设置--uts
为
host
会导致容器使用与主机相同的 UTS 命名空间。
笔记
Docker 不允许将
--hostname
和--domainname
标志与--uts=host
.这是为了防止在主机的 UTS 命名空间中运行的容器尝试更改主机的配置。
如果您希望容器的主机名随着主机的主机名更改而更改,您可能希望与主机共享 UTS 命名空间。更高级的用例是从容器更改主机的主机名。
IPC 设置 (--ipc)
--ipc="MODE" : Set the IPC mode for the container
该--ipc
标志接受以下值:
价值 | 描述 |
---|---|
”” | 使用守护进程的默认值。 |
“没有任何” | 自己的私有IPC命名空间,未挂载/dev/shm。 |
“私人的” | 拥有私有IPC命名空间。 |
“可共享” | 拥有私有 IPC 命名空间,可以与其他容器共享。 |
“容器:<名称或 ID >” | 加入另一个(“可共享”)容器的 IPC 命名空间。 |
“主持人” | 使用主机系统的 IPC 命名空间。 |
如果未指定,则使用守护程序默认值,可以是"private"
或"shareable"
,具体取决于守护程序版本和配置。
System V 进程间通信 (IPC) 命名空间提供命名共享内存段、信号量和消息队列的分离。
共享内存段用于以内存速度加速进程间通信,而不是通过管道或网络堆栈。共享内存通常用于科学计算和金融服务行业的数据库和定制(通常是 C/OpenMPI、C++/使用 boost 库)高性能应用程序。如果这些类型的应用程序被分成多个容器,您可能需要共享容器的 IPC 机制,"shareable"
对主(即“捐赠者”)容器和"container:<donor-name-or-ID>"
其他容器使用模式。
升级容器权限(--privileged)
该--privileged
标志为容器提供了以下功能:
- 启用所有 Linux 内核功能
- 禁用默认的 seccomp 配置文件
- 禁用默认的 AppArmor 配置文件
- 禁用 SELinux 进程标签
- 授予对所有主机设备的访问权限
- 使
/sys
读写 - 使 cgroups 以读写方式挂载
换句话说,容器几乎可以做主机能做的所有事情。该标志的存在是为了允许特殊的用例,例如在 Docker 中运行 Docker。
警告
--privileged
谨慎使用该标志。容器--privileged
不是安全的沙盒进程。这种模式下的容器可以获得主机上的 root 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
该-w
选项运行在指定目录内执行的命令,在本例中为
/path/to/dir/
.如果该路径不存在,Docker 会在容器内创建它。
设置每个容器的存储驱动程序选项(--storage-opt)
$ docker run -it --storage-opt size=120G fedora /bin/bash
此(大小)在创建时将容器文件系统大小限制为 120G。此选项仅适用于btrfs
、overlay2
、windowsfilter
和zfs
存储驱动程序。
对于overlay2
存储驱动程序,大小选项仅在支持文件系统已xfs
使用 mount 选项挂载时才可用pquota
。在这些条件下,您可以传递小于支持文件系统大小的任何大小。
对于windowsfilter
、btrfs
和zfs
存储驱动程序,您不能传递小于默认 BaseFS 大小的大小。
挂载 tmpfs (--tmpfs)
该--tmpfs
标志可让您创建tmpfs
坐骑。
您可以传递给的选项--tmpfs
与 Linuxmount -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
当前目录中的目录挂载到该路径的容器中
,并将其设置为工作目录,然后在容器内运行命令。/content
-v
pwd
$ docker run -v /doesnt/exist:/foo -w /foo -i -t ubuntu bash
当绑定挂载卷的主机目录不存在时,Docker 会自动在主机上创建此目录。在上面的示例中,Docker/doesnt/exist
在启动容器之前创建该文件夹。
以只读方式挂载卷(--read-only)
$ 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 nginx:alpine
这会将8080
容器的端口绑定到主机的80
TCP端口。127.0.0.1
您还可以指定udp
和sctp
端口。网络
概述页面详细解释了如何使用 Docker 发布端口。
笔记
如果您在发布容器端口时未指定 IP 地址(即,
-p 80:80
而不是),则 Docker默认会在所有接口(地址 )上发布端口。这些端口可从外部访问。如果您将 UFW 配置为阻止此特定端口,这也适用,因为 Docker 管理其自己的 iptables 规则。 阅读更多-p 127.0.0.1:80:80
0.0.0.0
$ docker run --expose 80 nginx:alpine
80
这会公开容器的端口,而不会将端口发布到主机系统的接口。
发布所有公开的端口(-P、--publish-all)
$ docker run -P nginx:alpine
-P
, 或,标志--publish-all
将所有公开的端口发布到主机。 Docker 将每个公开的端口绑定到主机上的随机端口。
该-P
标志仅发布使用 DockerfileEXPOSE
指令或--expose
命令标志明确标记为公开的端口号docker run
。
端口范围在由 定义的
临时端口范围/proc/sys/net/ipv4/ip_local_port_range
内。使用该-p
标志显式映射单个端口或端口范围。
设置拉取策略(--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>
(从本地环境获取值)以及#
注释。以 开头的行将#
被视为行注释并被忽略,而#
出现在行中其他任何位置的 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-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
。
有关使用标签的更多信息,请参阅 标签。
将容器连接到网络(--network)
要启动容器并将其连接到网络,请使用该--network
选项。
以下命令创建一个名为 的网络并向该网络my-net
添加一个容器。busybox
my-net
$ docker network create my-net
$ docker run -itd --network=my-net busybox
当您在用户定义的网络上启动容器时,您还可以使用--ip
和标志为容器选择 IP 地址。--ip6
要将静态 IP 分配给容器,您必须指定网络的子网块。
$ docker network create --subnet 192.0.2.0/24 my-net
$ docker run -itd --network=my-net --ip=192.0.2.69 busybox
如果要将正在运行的容器添加到网络,请使用docker network connect
子命令。
您可以将多个容器连接到同一网络。连接后,容器只能使用另一个容器的 IP 地址或名称进行通信。对于overlay
支持多主机连接的网络或自定义插件,连接到同一多主机网络但从不同引擎启动的容器也可以通过这种方式进行通信。
笔记
默认桥接网络仅允许容器使用内部 IP 地址相互通信。用户创建的桥接网络使用容器名称在容器之间提供 DNS 解析。
您可以使用该命令断开容器与网络的连接docker network disconnect
。
有关使用该命令将容器连接到网络的更多信息run
,请参阅
“ Docker 网络概述”。
从容器挂载卷 (--volumes-from)
$ docker run --volumes-from 777f7dc92da7 --volumes-from ba8c0c54f0f2:ro -i -t ubuntu pwd
该--volumes-from
标志从引用的容器中安装所有定义的卷。您可以通过重复参数来指定多个容器--volumes-from
。容器 ID 可以选择带有:ro
或后缀:rw
,分别以只读或读写模式安装卷。默认情况下,Docker 以与引用容器相同的模式(读写或只读)挂载卷。
像 SELinux 这样的标签系统需要在安装到容器中的卷内容上放置适当的标签。如果没有标签,安全系统可能会阻止容器内运行的进程使用内容。默认情况下,Docker 不会更改操作系统设置的标签。
要更改容器上下文中的标签,您可以添加两个后缀之一
:z
或:Z
添加到卷安装中。这些后缀告诉 Docker 重新标记共享卷上的文件对象。该z
选项告诉 Docker 两个容器共享卷内容。因此,Docker 使用共享内容标签来标记内容。共享卷标签允许所有容器读取/写入内容。该Z
选项告诉 Docker 使用私有非共享标签来标记内容。只有当前容器可以使用私有卷。
分离模式(-d,--detach)
--detach
(或)标志-d
将容器作为后台进程启动,不占用终端窗口。根据设计,当用于运行容器的根进程退出时,以分离模式启动的容器就会退出,除非您还指定了该--rm
选项。如果使用-d
with --rm
,则容器在退出或守护进程退出时(以先发生者为准)将被删除。
不要将service x start
命令传递给分离的容器。例如,此命令尝试启动nginx
服务。
$ docker run -d -p 80:80 my_image service nginx start
这样就成功启动了nginx
容器内的服务。然而,它失败了分离容器范例,因为根进程(service nginx start
)返回并且分离容器按设计停止。结果,
nginx
服务启动但无法使用。相反,要启动 Web 服务器等进程,nginx
请执行以下操作:
$ docker run -d -p 80:80 my_image nginx -g 'daemon off;'
要使用分离的容器进行输入/输出,请使用网络连接或共享卷。这些是必需的,因为容器不再侦听docker run
运行的命令行。
覆盖分离序列(--detach-keys)
使用该--detach-keys
选项覆盖 Docker 键序列以进行分离。如果 Docker 默认序列与您用于其他应用程序的按键序列冲突,这非常有用。有两种方法可以定义您自己的分离键序列,作为每个容器的覆盖或作为整个配置的配置属性。
要覆盖单个容器的序列,请
--detach-keys="<sequence>"
在docker attach
命令中使用该标志。的格式<sequence>
可以是字母 [aZ],也可以ctrl-
与以下任意内容组合:
a-z
(单个小写字母字符)@
(在标志处)[
(左括号)\\
(两个反斜杠)_
(下划线)^
(插入符号)
这些a
、ctrl-a
、X
或ctrl-\\
值都是有效键序列的示例。要为所有容器配置不同的配置默认键序列,请参阅
配置文件部分。
将主机设备添加到容器(--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 会忽略指定的权限。
$ 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 容器指定此选项,Docker 会使实现 所请求的设备接口类 GUID 的所有设备在容器中可用。例如,以下命令使主机上的所有 COM 端口在容器中可见。
PS C:\> docker run --device=class/86E0D1E0-8089-11D0-9CE4-08003E301F73 mcr.microsoft.com/windows/servercore:ltsc2019
笔记
该
--device
选项仅在进程隔离的 Windows 容器上受支持,如果容器隔离为 ,则会产生错误hyperv
。
CDI设备
笔记
这是实验性功能,因此并不代表稳定的 API。
容器设备接口 (CDI) 是 容器运行时的标准化 机制,用于创建能够与第三方设备交互的容器。
使用 CDI,设备配置是使用 JSON 文件定义的。除了使容器能够与设备节点交互之外,它还允许您为设备指定其他配置,例如内核模块、主机库和环境变量。
您可以使用设备的完全限定名称来引用带有标志的 CDI 设备--device
,如以下示例所示:
$ docker run --device=vendor.com/class=device-name --rm -it ubuntu
这将启动一个ubuntu
可以访问指定 CDI 设备 的容器,
vendor.com/class=device-name
假设:
- 运行守护程序的系统上已配置的 CDI 规范目录之一中提供了所请求设备的有效 CDI 规范(JSON 文件)。
- 守护进程端已启用CDI功能,请参见 启用CDI设备。
连接到 STDIN/STDOUT/STDERR (-a, --attach)
--attach
(or -a
) 标志指示绑定docker run
到容器的
STDIN
,STDOUT
或STDERR
。这使得可以根据需要操纵输出和输入。您可以指定要连接到三个标准流 ( STDIN
、STDOUT
、STDERR
) 中的哪一个,如下所示:
$ docker run -a stdin -a stdout -i -t ubuntu /bin/bash
以下示例将数据通过管道传输到容器中,并通过仅附加到容器的STDIN
.
$ echo "test" | docker run -i -a stdin ubuntu cat -
除非出现错误,否则以下示例不会向控制台打印任何内容,因为输出仅附加到STDERR
容器的。容器的日志仍然存储写入STDERR
和 的内容STDOUT
。
$ docker run -a stderr ubuntu echo test
--attach
以下示例显示了一种使用管道将文件传输到容器中的方法。该命令在构建完成后打印容器的 ID,您可以使用 检索构建日志docker logs
。如果您需要将文件或其他内容通过管道传输到容器中,并在容器完成运行后检索容器的 ID,这非常有用。
$ cat somefile | docker run -i -a stdin mybuilder dobuild
笔记
Linux 会对容器内以 PID 1 身份运行的进程进行特殊处理:它会忽略具有默认操作的任何信号。因此,进程不会在
SIGINT
或处终止,SIGTERM
除非它被编码为这样做。
另请
参见命令docker cp
。
保持 STDIN 打开(-i, --interactive)
--interactive
(或)标志-i
使容器保持STDIN
打开状态,并允许您通过标准输入将输入发送到容器。
$ echo hello | docker run --rm -i busybox cat
hello
该-i
标志最常与 标志一起使用,--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 守护进程的系统路径中找到的第一个可执行文件。该二进制文件包含在默认安装中,由tinidocker-init
支持
。
分配伪 TTY (-t, --tty)
--tty
(或)标志-t
将伪 TTY 附加到容器,将终端连接到容器的 I/O 流。将伪 TTY 分配给容器意味着您可以访问 TTY 设备提供的输入和输出功能。
例如,以下命令passwd
在容器中运行该命令debian
,为用户设置新密码root
。
$ docker run -i debian passwd root
New password: karjalanpiirakka9
Retype new password: karjalanpiirakka9
passwd: password updated successfully
如果您仅使用标志-i
(允许您将文本发送到
STDIN
容器)运行此命令,则passwd
提示会以纯文本形式显示密码。但是,如果您尝试相同的操作但还添加了标志-t
,则密码将被隐藏:
$ docker run -it debian passwd root
New password:
Retype new password:
passwd: password updated successfully
这是因为passwd
可以使用 echo-off TTY 功能来抑制向终端输出字符。
您可以使用-t
没有-i
标志的标志。这仍然会向容器分配一个伪 TTY,但无法写入STDIN
.唯一有用的时候是容器的输出需要 TTY 环境。
指定自定义 cgroup
使用该--cgroup-parent
标志,您可以传递特定的 cgroup 以在其中运行容器。这允许您自行创建和管理 cgroup。您可以为这些 cgroup 定义自定义资源,并将容器放在公共父组下。
使用动态创建的设备(--device-cgroup-rule)
Docker 在创建时为容器分配可用的设备。分配的设备将添加到 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。
笔记
您还可以使用 标志将 GPU 指定为 CDI 设备
--device
,请参阅 CDI 设备。
请阅读 指定容器的资源 以获取更多信息。
要使用--gpus
,请指定要使用的 GPU(或全部)。如果您不提供任何值,Docker 将使用所有可用的 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"' ubuntu nvidia-smi
重启策略(--restart)
使用该--restart
标志指定容器的重新启动策略。重启策略控制 Docker 守护进程退出后是否重新启动容器。 Docker 支持以下重启策略:
政策 | 结果 |
---|---|
no | 容器退出时不要自动重启。这是默认设置。 |
on-failure[:max-retries] | 仅当容器以非零退出状态退出时才重新启动。 (可选)限制 Docker 守护进程尝试重新启动的次数。 |
unless-stopped | 重新启动容器,除非它被明确停止或者 Docker 本身被停止或重新启动。 |
always | 无论退出状态如何,始终重新启动容器。当您指定always时,Docker守护进程会尝试无限期地重新启动容器。无论容器的当前状态如何,容器始终在守护程序启动时启动。 |
$ docker run --restart=always redis
这将使用alwaysredis
重启策略来运行容器。如果容器退出,Docker 会重新启动它。
当重新启动策略在容器上处于活动状态时,它会在 中
显示为Up
或
。它对于查看生效的重启策略也很有用
。Restarting
docker ps
docker events
每次重新启动之前都会添加逐渐增加的延迟(之前延迟的两倍,从 100 毫秒开始),以防止服务器泛滥。这意味着守护进程会等待 100 毫秒,然后是 200 毫秒、400、800、1600 毫秒,依此类推,直到on-failure
达到限制(最大延迟 1 分钟),或者当您
docker stop
或docker rm -f
容器达到限制时。
如果容器成功重启(容器启动并运行至少 10 秒),延迟将重置为其默认值 100 毫秒。
指定重新启动尝试的限制
您可以指定使用失败策略时 Docker 尝试重新启动容器的最大次数。默认情况下,Docker 永远不会停止尝试重新启动容器。
以下示例使用失败redis
重启策略
和最大重启次数 10 来运行容器。
$ docker run --restart=on-failure:10 redis
如果redis
容器以非零退出状态连续退出超过 10 次,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 在容器退出时自动清理容器并删除文件系统,请使用以下
--rm
标志:
--rm=false: Automatically remove the container when it exits
笔记
如果设置该
--rm
标志,Docker 还会在删除容器时删除与该容器关联的匿名卷。这与运行类似docker rm -v my-container
。仅删除未指定名称的卷。例如,运行以下命令时,卷/foo
会被删除,但不会/bar
:$ docker run --rm -v /foo -v awesome:/bar busybox top
通过继承的卷
--volumes-from
将使用相同的逻辑删除:如果使用名称指定了原始卷,则不会将其删除。
将条目添加到容器主机文件(--add-host)
/etc/hosts
您可以使用一个或多个标志将其他主机添加到容器的文件中--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
该标志支持解析为主机内部 IP 地址的--add-host
特殊值。host-gateway
当您希望容器连接到主机上运行的服务时,这非常有用。
通常用作host.docker.internal
引用 的主机名
host-gateway
。 Docker Desktop 会自动解析此主机名,请参阅
探索网络功能。
以下示例显示了特殊host-gateway
值的工作原理。该示例运行一个 HTTP 服务器,该服务器通过主机名将文件从主机提供给容器
host.docker.internal
,主机名解析为主机的内部 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-host
标志还接受:
分隔符,例如:
$ docker run --add-host=my-hostname:8.8.8.8 --rm -it alpine
记录驱动程序 (--log-driver)
容器可以具有与 Docker 守护程序不同的日志记录驱动程序。使用--log-driver=<DRIVER>
和docker run
命令来配置容器的日志记录驱动程序。
要了解支持的日志记录驱动程序以及如何使用它们,请参阅 配置日志记录驱动程序。
要禁用容器的日志记录,请将--log-driver
标志设置为none
:
$ docker run --log-driver=none -d nginx:alpine
5101d3b7fe931c27c2ba0e65fd989654d297393ad65ae238f20b97a020e7295b
$ docker logs 5101d3b
Error response from daemon: configured logging driver does not support reading
在容器中设置 ulimit (--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
设置用户而不是容器可用的最大进程数。例如,使用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
第四个容器失败并报告“[8]系统错误:资源暂时不可用”错误。此操作失败,因为调用者设置nproc=3
导致前三个容器用完为用户设置的三个进程配额daemon
。
使用信号停止容器(--stop-signal)
该--stop-signal
标志向容器发送系统调用信号以退出。该信号可以是格式为 的信号名称SIG<NAME>
(例如 )SIGKILL
,也可以是与内核系统调用表中的位置匹配的无符号数字(例如 )9
。
STOPSIGNAL
默认值由图像中定义
,或者SIGTERM
如果图像没有STOPSIGNAL
定义。
可选的安全选项(--security-opt)
选项 | 描述 |
---|---|
--security-opt="label=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。 |
--security-opt="seccomp=profile.json" | 列入白名单的系统调用 seccomp Json 文件用作 seccomp 过滤器 |
该--security-opt
标志允许您覆盖容器的默认标签方案。在以下命令中指定级别允许您在容器之间共享相同的内容。
$ 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
这意味着提升诸如su
或 等权限的命令sudo
不再起作用。它还会导致稍后在删除权限后应用任何 seccomp 过滤器,这可能意味着您可以拥有一组更具限制性的过滤器。有关更多详细信息,请参阅
内核文档。
在 Windows 上,您可以使用该--security-opt
标志来指定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
,hyperv
Windows 客户端操作系统(例如 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 创建一个足以容纳内存限制的实用虚拟机,以及托管容器所需的最小操作系统。该大小被报告为“总物理内存”。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 不支持在容器内更改 sysctls 并同时修改主机系统。随着内核的发展,我们期望看到更多的 sysctl 成为命名空间。
当前支持的 sysctl
IPC命名空间:
kernel.msgmax
,,,,,,,,,kernel.msgmnb
.kernel.msgmni
kernel.sem
kernel.shmall
kernel.shmmax
kernel.shmmni
kernel.shm_rmid_forced
- Syscts 开头为
fs.mqueue.*
- 如果您使用该
--ipc=host
选项,则不允许使用这些 sysctl。
网络命名空间:
- Syscts 开头为
net.*
- 如果您使用
--network=host
这些 sysctl 选项是不允许的。