Docker 容器运行
描述 | 从镜像创建并运行新容器 |
---|---|
用法 | docker container run [OPTIONS] IMAGE [COMMAND] [ARG...] |
别名 | docker run |
描述
这docker run
command 在新容器中运行命令,根据需要拉取镜像并启动容器。
您可以使用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 命名空间 中运行容器'': 使用守护进程上 default-cgroupns-mode 选项配置的 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 | 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 设备('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-period | API 1.29+容器在开始运行状况重试倒计时之前要初始化的开始时间 (ms|s|m|h)(默认为 0s) | |
--health-timeout | 允许运行一项检查的最长时间 (ms|s|m|h)(默认为 0s) | |
--help | 打印使用情况 | |
-h, --hostname | 容器主机名 | |
--init | API 1.25+在容器内运行一个 init,用于转发 signals 和 reaps 进程 | |
-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 | 调整容器 pids 限制(设置为 -1 表示无限制) | |
--platform | 接口 1.32+如果服务器支持多平台,则设置 platform | |
--privileged | 为此容器授予扩展权限 | |
-p, --publish | 将容器的端口发布到主机 | |
-P, --publish-all | 将所有公开的端口发布到随机端口 | |
--pull | missing | 在运行之前拉取镜像 (always ,missing ,never ) |
-q, --quiet | Suppress the pull 输出 | |
--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 | Sysctl 选项 | |
--tmpfs | 挂载 tmpfs 目录 | |
-t, --tty | 分配伪 TTY | |
--ulimit | Ulimit 选项 | |
-u, --user | 用户名或 UID (格式: <name|uid>[:<group|gid>]) | |
--userns | 要使用的用户命名空间 | |
--uts | 要使用的 UTS 命名空间 | |
-v, --volume | 绑定挂载卷 | |
--volume-driver | 容器的可选卷驱动程序 | |
--volumes-from | 从指定的容器挂载卷 | |
-w, --workdir | 容器内的工作目录 |
例子
分配名称 (--name)
这--name
flag 允许您为容器指定自定义标识符。这
以下示例运行一个名为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.
在某些情况下,您希望容器共享主机的进程命名空间
允许容器内的进程查看
系统。例如,您可以使用调试工具构建容器,例如strace
或gdb
,但希望在
容器。
示例:在容器内运行 htop
运行htop
在共享主机的进程 namespac 的容器中:
使用
--pid=host
选择:$ docker run --rm -it --pid=host alpine
安装
htop
在容器中:/ # apk add --quiet htop
调用
htop
命令。/ # htop
示例,加入另一个容器的 PID 命名空间
加入另一个容器的 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
将进程 ID 附加到进程 1,则
my-nginx
容器:/ # strace -p 1 strace: Process 1 attached
禁用容器的命名空间重新映射 (--userns)
如果您在守护进程上启用用户命名空间,则
默认情况下,所有容器都在启用用户命名空间的情况下启动。
要禁用特定容器的用户命名空间重新映射,
您可以设置--userns
flag 设置为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 中运行 命名空间尝试更改主机的配置。
如果您希望 容器的主机名,要随着主机主机名的更改而更改。一个 更多 高级用例是从容器中更改主机的主机名。
IPC 设置 (--ipc)
--ipc="MODE" : Set the IPC mode for the container
这--ipc
flag 接受以下值:
价值 | 描述 |
---|---|
"" | 使用 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)
这--privileged
flag 为容器提供以下功能:
- 启用所有 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
这-w
option 运行在指定目录内执行的命令,在本例中为/path/to/dir/
.如果路径不存在,Docker 会在容器内创建该路径。
为每个容器设置存储驱动程序选项 (--storage-opt)
$ docker run -it --storage-opt size=120G fedora /bin/bash
此 (size) 在创建时将容器文件系统大小限制为 120G。
此选项仅适用于btrfs
,overlay2
,windowsfilter
,
和zfs
存储驱动程序。
对于overlay2
storage 驱动程序,则仅当
backing filesystem 是xfs
并使用pquota
mount 选项。
在这些情况下,您可以传递小于后备文件系统大小的任何大小。
对于windowsfilter
,btrfs
和zfs
storage 驱动程序,则不能将
size 小于 Default BaseFS Size。
挂载 tmpfs (--tmpfs)
这--tmpfs
flag 允许您创建一个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
目录中的目录复制到位于/content
path 使用-v
flag 中,将其设置为工作目录,然后
运行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-only
flag 来控制
容器写入文件。这--read-only
flag 挂载容器的根
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 标志添加绑定挂载或卷
这--mount
flag 允许您挂载卷、主机目录和tmpfs
挂载在容器中。
这--mount
flag 支持-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 端口80
upper127.0.0.1
的
主机。您还可以指定udp
和sctp
港口。网络概述
页面详细介绍了如何发布端口
与 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 将每个公开的端口绑定到主机上的随机端口。
这-P
flag 仅发布显式标记为
公开的,或者使用 DockerfileEXPOSE
指令或--expose
flag 的docker run
命令。
端口范围在 由/proc/sys/net/ipv4/ip_local_port_range
.使用-p
标志显式映射
单个端口或端口范围。
设置拉取策略 (--pull)
使用--pull
标志设置镜像拉取策略
容器。
这--pull
flag 可以采用以下值之一:
价值 | 描述 |
---|---|
missing (默认) | 如果在镜像缓存中找不到镜像,请拉取该镜像,否则使用缓存的镜像。 |
never | 即使缺少镜像,也不要拉取镜像,如果镜像缓存中不存在该镜像,则会产生错误。 |
always | 始终在创建容器之前执行拉取。 |
从镜像创建(并运行)容器时,守护进程会检查 image 存在于本地镜像缓存中。如果镜像缺失,则错误为 返回到 CLI,允许它启动拉取。
默认值 (missing
) 是仅在镜像不存在于
daemon 的镜像缓存。此默认值允许您运行仅存在的镜像
本地(例如,您从 Dockerfile 构建的镜像,但尚未
被推送到注册表),并减少联网。
这always
选项始终在创建容器之前启动拉取。这
选项可确保镜像是最新的,并防止您使用过时的
镜像,但可能不适用于您想要在本地测试
在推送之前构建的镜像(因为拉取镜像会覆盖现有镜像
在镜像缓存中)。
这never
option 在创建容器时禁用(隐式)拉取镜像,
并且仅使用镜像缓存中可用的镜像。如果指定了
image 未找到,则会产生错误,并且不会创建容器。
此选项在网络不可用的情况下非常有用,或者
防止在创建容器时隐式拉取镜像。
以下示例显示了docker run
使用--pull=never
option 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-label
key 未指定值,因此标签默认为空
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 | --ip | IPv4 地址(例如,172.30.100.104) |
ip6 | --ip6 | IPv6 地址(例如,2001:db8::33) |
mac-address | --mac-address | 容器 MAC 地址(例如,92:d0:c6:0a:29:33) |
link-local-ip | --link-local-ip | 容器 IPv4/IPv6 链接本地地址 |
driver-opt | docker 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
sysctl
以net.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=1
和net.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-from
flag 从引用的
器皿。您可以通过重复--volumes-from
论点。容器 ID 可以选择以:ro
或:rw
自
分别以只读或读写模式挂载卷。默认情况下,
Docker 以与
引用容器。
像 SELinux 这样的标签系统需要在卷上放置适当的标签 内容挂载到容器中。如果没有标签,安全系统可能会 阻止在容器内运行的进程使用内容。由 default,Docker 不会更改作系统设置的标签。
要更改容器上下文中的标签,您可以添加两个后缀之一:z
或:Z
添加到卷挂载。这些后缀告诉 Docker 重新标记文件
对象。这z
option 告诉 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
这将成功启动nginx
service 的 intent 实例。但是,它
detached container 范例失败,因为根进程 (service nginx start
) 返回,并且分离的容器将按设计停止。因此,nginx
服务已启动,但无法使用。相反,要启动诸如
这nginx
Web 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
,X
或ctrl-\\
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
,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 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
,STDOUT
或STDERR
.这使得作输出成为可能
并根据需要输入您可以指定三个标准流中的哪一个
(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
容器。这
容器的日志仍然存储写入的内容STDERR
和STDOUT
.
$ 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作忽略任何信号。所以,这个过程 不终止于
SIGINT
或SIGTERM
除非它被编码为这样做。
另请参阅这docker cp
命令.
保持 STDIN 打开(-i、--交互式)
这--interactive
(或-i
) 标志保留容器的STDIN
open,然后让
您可以通过 Standard Input 将 Input 发送到容器。
$ echo hello | docker run --rm -i busybox cat
hello
这-i
flag 最常与--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-init
binary,包含在
默认安装由 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
提示符以纯文本显示密码
发短信。但是,如果您尝试相同的作,但同时添加-t
flag 中,
password 被隐藏:
$ docker run -it debian passwd root
New password:
Retype new password:
passwd: password updated successfully
这是因为passwd
可以抑制字符到终端的输出
使用回声关闭 TTY 功能。
您可以使用-t
flag 不带-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-stopped | 似always ,不同之处在于,当容器停止(手动或其他方式)时,即使在 Docker 守护程序重新启动后,它也不会重新启动。 |
$ docker run --restart=always redis
这将运行redis
重启策略为 Always 的容器。
如果容器退出,Docker 将重新启动它。
当重启策略在容器上处于活动状态时,它显示为Up
或Restarting
在docker ps
.使用docker events
以查看生效的重新启动策略。
增加的延迟(之前延迟的两倍,从 100 毫秒开始)
在每次重启之前添加,以防止服务器泛洪。这意味着
守护进程等待 100 毫秒,然后等待 200 毫秒、400、800、1600 等,直到
这on-failure
limit,则达到最大延迟 1 分钟,或者当您docker stop
或docker 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/hosts
file 使用一个 或
更多--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-host
flag 支持特殊的host-gateway
值,解析为
主机的内部 IP 地址。当您希望容器
连接到主机上运行的服务。
使用host.docker.internal
作为引用host-gateway
.Docker Desktop 会自动解析此主机名,请参阅探索网络功能。
以下示例显示了特殊的host-gateway
value 有效。这
示例运行一个 HTTP 服务器,该服务器通过host.docker.internal
hostname,解析为主机的内部 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
flag 还接受:
separator 中,例如:
$ docker run --add-host=my-hostname:8.8.8.8 --rm -it alpine
记录驱动程序 (--log-driver)
容器可以具有与 Docker 守护程序不同的日志记录驱动程序。用
这--log-driver=<DRIVER>
使用docker run
命令配置
容器的日志记录驱动程序。
要了解支持的日志记录驱动程序及其使用方法,请参阅 配置日志记录驱动程序.
要禁用容器的日志记录,请将--log-driver
flag 设置为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-signal
flag 将系统调用信号发送到
容器退出。此信号可以是格式为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-opt
flag 允许您覆盖
容器。在以下命令中指定级别允许您共享
容器之间的内容相同。
$ 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
flag 设置等待容器的秒数
在发送预定义的--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 | 共享内核命名空间隔离。 |
hyperv | Hyper-V 虚拟机管理程序基于分区的隔离。 |
Windows Server作系统上的默认隔离为process
和hyperv
在 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=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
isolation,则 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
选项。