首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

docker run

描述

在新容器中运行命令

用法

代码语言:javascript
复制
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

选项

名字,简写

默认

描述

--add-host

添加自定义的主机到IP映射(主机:IP)

--attach, -a

附加到STDIN,STDOUT或STDERR

--blkio-weight

0

阻止IO(相对权重),介于10和1000之间,或0禁用(默认值为0)

--blkio-weight-device

块IO重量(相对设备重量)

--cap-add

添加Linux功能

--cap-drop

删除Linux功能

--cgroup-parent

容器的可选父cgroup

--cidfile

将容器ID写入文件

--cpu-count

0

CPU数量(仅限Windows)

--cpu-percent

0

CPU百分比(仅限Windows)

--cpu-period

0

限制CPU CFS(完全公平调度程序)期间

--cpu-quota

0

限制CPU CFS(完全公平调度程序)配额

--cpu-rt-period

0

限制CPU实时周期(以微秒为单位)

--cpu-rt-runtime

0

以微秒为单位限制CPU实时运行时间

--cpu-shares,-c

0

CPU份额(相对重量)

--cpus

CPU数量

--cpuset-cpus

允许执行的CPU(0-3,0,1)

--cpuset-MEMS

允许执行的MEM(0-3,0,1)

--detach,-d

false

在后台运行容器并打印容器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搜索域

--entrypoint

覆盖图像的默认入口点

--env,-e

设置环境变量

--env-file

读入环境变量文件

--expose

公开一个端口或一系列端口

--group-add

添加其他群组加入

--health-cmd

运行以检查运行状况的命令

--health-interval

0

运行检查之间的时间(ms | s | m | h)(默认为0)

--health-retries

0

需要报告不健康的连续失败

--health-start-period

0

启动健康重试倒数前,容器初始化的开始时间段(ms | s | m | h)(默认为0)

--health-timeout

0

允许一次检查运行的最长时间(ms | s | m | h)(默认值为0)

--help

false

打印用法

--hostname,-h

容器主机名称

--init

false

在容器中运行一个转发信号并收集进程的init

---interactive, -i

false

即使没有连接,也要保持STDIN打开

--io-MaxBandwidth

0

系统驱动器的最大IO带宽限制(仅限Windows)

--io-maxiops

0

系统驱动器的最大IOps限制(仅限Windows)

--ip

IPv4地址(例如172.30.100.104)

--ip6

IPv6地址(例如,2001:db8 :: 33)

--ipc

IPC命名空间使用

--isolation

容器隔离技术

--kernel-memory

0

内核内存限制

--label, -l

在容器上设置元数据

--label-file

阅读标签的行分隔文件

--link

将链接添加到其他容器

--link-local-ip

Container IPv4 / IPv6链路本地地址

--log-driver

记录容器的驱动程序

--log-OPT

日志驱动选项

- MAC地址

容器MAC地址(例如,92:d0:c6:0a:29:33)

--memory, -m

0

内存限制

--memory-reservation

0

内存软限制

--memory-swap

0

交换限制等于内存加交换:'-1'以启用无限交换

--memory-swappiness

-1

调整容器内存swappiness(0到100)

--mount

将文件系统挂载附加到容器

--name

为容器分配一个名称

--net

默认

将容器连接到网络

--net-alias

为容器添加网络范围的别名

--network

默认

将容器连接到网络

--network-alias

为容器添加网络范围的别名

--no-healthcheck

false

禁用任何容器指定的HEALTHCHECK

--oom-kill-disable

false

禁用OOM杀手

--oom-score-adj

0

调整主机的OOM首选项(从-1000到1000)

--pid

要使用的PID名称空间

--pids-limit

0

调整容器匹配限制(无限制地设置-1)

--privileged

false

给这个容器赋予扩展权限

--publish,-p

将容器的端口发布到主机

--publish-all,-P

false

将所有暴露的端口发布到随机端口

--read-only

false

将容器的根文件系统挂载为只读

--read-only

no

重新启动策略以在容器退出时应用

--restart

false

当容器退出时自动移除容器

--rm

运行时用于此容器

--security-OPT

安全选项

--shm-size

0

/ dev / shm的大小

--sig-proxy

true

代理接收到进程的信号

--stop-signal

SIGTERM

停止容器的信号

--stop-timeout

0

超时(以秒为单位)停止容器

--storage-OPT

容器的存储驱动程序选项

--sysctl

map[]

Sysctl选项

--tmpfs

挂载一个tmpfs目录

--tty, -t

false

分配一个伪TTY

--ulimit

Ulimit选项

--user,-u

用户名或UID(格式:<名称| uid>:<组| gid>)

--userns

要使用的用户名称空间

--uts

UTS命名空间使用

--volume, -v

绑定安装一个卷

--volume-driver

容器的可选卷驱动程序

--volumes-from

从指定容器装载卷

--workdir,-w

容器内的工作目录

父命令

命令

描述

docker

Docker CLI的基本命令。

扩展描述

docker run命令首先在指定的映像上创建一个可写容器层,然后使用指定的命令启动它。 也就是说,码头运行等同于API / containers / create then / containers /(id)/ start。 使用docker start可以重新启动已停止的容器,并保持原来的所有更改不变。 请参阅docker ps -a查看所有容器的列表。

docker run命令可以在组合使用docker commit,以改变一个容器中运行的命令docker run在Docker运行参考中还有其他详细信息。

有关将容器连接到网络的信息,请参阅“ Docker网络概述 ”。

例子

分配名称并分配伪TTY(-name,-it)

代码语言:javascript
复制
$ 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

这个例子使用debian:latest image运行一个名为test的容器。 -it指示Docker分配连接到容器stdin的伪TTY; 在容器中创建一个交互式bash shell。 在该示例中,通过输入exit 13退出bash shell。此退出代码被传递给docker run的调用者,并记录在测试容器的元数据中。

捕获容器ID(-cidfile)

代码语言:javascript
复制
$ docker run --cidfile /tmp/docker_test.cid ubuntu echo "test"

这将创建一个容器并打印测试到控制台。 cidfile标志使得Docker尝试创建一个新文件并将容器ID写入它。 如果文件已经存在,Docker会返回一个错误。 Docker运行退出时,Docker将关闭此文件。

完整的容器功能(-privileged)

代码语言:javascript
复制
$ docker run -t -i --rm ubuntu bash
root@bc338942ef20:/# mount -t tmpfs none /mnt
mount: permission denied

这是行不通的,因为默认情况下,大多数具有潜在危险的内核功能都被丢弃; 包括cap_sys_admin(这是安装文件系统所必需的)。 但是, - 特权标志将允许它运行:

代码语言:javascript
复制
$ 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)

代码语言:javascript
复制
$ docker  run -w /path/to/dir/ -i -t  ubuntu pwd

-w让里面定目录正在执行的命令,如/path/to/dir/。如果路径不存在,它将在容器内创建。

为每个容器设置存储驱动器选项

代码语言:javascript
复制
$ docker run -it --storage-opt size=120G fedora /bin/bash

这个(大小)将允许在创建时将容器rootfs大小设置为120G。 此选项仅适用于devicemapper,btrfs,overlay2,windowsfilter和zfs图形驱动程序。 对于devicemapper,btrfs,windowsfilter和zfs图形驱动程序,用户无法传递小于默认基本大小的大小。 对于overlay2存储驱动程序,只有当后备fs为xfs并使用pquota安装选项安装时,size选项才可用。 在这些条件下,用户可以通过任何小于支持fs大小的大小。

装载tmpfs(-tmpfs)

代码语言:javascript
复制
$ docker run -d --tmpfs /run:rw,noexec,nosuid,size=65536k my_image

--tmpfs标志将空tmpfs与rw,noexec,nosuid,size = 65536k选项一起装载到容器中。

装入卷(-v,只读)

代码语言:javascript
复制
$ docker  run  -v `pwd`:`pwd` -w `pwd` -i -t  ubuntu pwd

-v标志将当前工作目录挂载到容器中。 -w让命令在当前工作目录内执行,方法是将目录更改为由pwd返回的值。 所以这个组合使用容器执行命令,但在当前工作目录中执行。

代码语言:javascript
复制
$ docker run -v /doesnt/exist:/foo -w /foo -i -t ubuntu bash

当绑定安装卷的主机目录不存在时,Docker会自动在主机上为您创建此目录。在上面的例子中,Docker将/doesnt/exist在启动容器之前创建文件夹。

代码语言:javascript
复制
$ docker run --read-only -v /icanwrite busybox touch /icanwrite/here

体积可以与--read-only结合使用来控制容器写入文件的位置。 -read-only标志将容器的根文件系统装载为只读,禁止写入容器指定体积以外的位置。

代码语言:javascript
复制
$ 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风格的语义来指定。

代码语言:javascript
复制
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:以外的驱动器。此外,绑定挂载的源必须是本地目录,而不是文件。

代码语言:javascript
复制
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标志支持-vor 标志支持的大多数选项--volume,但使用不同的语法。有关的深度信息--mount的标志,和之间的比较--volume--mount,请参考服务创建命令参考。

即使没有计划反对--volume,建议使用--mount

例子:

代码语言:javascript
复制
$ docker run --read-only --mount type=volume,target=/icanwrite busybox touch /icanwrite/here
代码语言:javascript
复制
$ docker run -t -i --mount type=bind,src=/data,dst=/data busybox sh

发布或公开端口(-p,-expose)

代码语言:javascript
复制
$ docker run -p 127.0.0.1:80:8080 ubuntu bash

这将容器的端口8080绑定到主机的127.0.0.1上的端口80。 Docker用户指南详细解释了如何操作Docker中的端口。

代码语言:javascript
复制
$ docker run --expose 80 ubuntu bash

这暴露80容器的端口而不将端口发布到主机系统的接口。

设置环境变量(-e,-env,-env-file)

代码语言:javascript
复制
$ docker run -e MYVAR1 --env MYVAR2=foo --env-file ./env.list ubuntu bash

使用-e--env--env-file标志设置在容器简单(非数组)环境变量,你正在运行,或覆盖在你运行图像的Dockerfile中定义的变量。

您可以在运行容器时定义变量及其值:

代码语言:javascript
复制
$ docker run --env VAR1=value1 --env VAR2=value2 ubuntu env | grep VAR
VAR1=value1
VAR2=value2

您也可以使用您已经导出到本地环境的变量:

代码语言:javascript
复制
export VAR1=value1
export VAR2=value2

$ docker run --env VAR1 --env VAR2 ubuntu env | grep VAR
VAR1=value1
VAR2=value2

在运行该命令时,Docker CLI客户端将检查变量在本地环境中的值并将其传递给容器。 如果提供了no =并且该变量未在本地环境中导出,则该变量将不会在容器中进行设置。

您也可以从文件加载环境变量。该文件应该使用语法<variable>=value(将变量设置为给定值)或<variable>(从本地环境获取值)以及#注释。

代码语言:javascript
复制
$ cat env.list
# This is a comment
VAR1=value1
VAR2=value2
USER

$ docker run --env-file env.list ubuntu env | grep VAR
VAR1=value1
VAR2=value2
USER=denis

在容器上设置元数据(-l,-label,-label-file)

标签是key=value将元数据应用于容器的一对。用两个标签标注容器:

代码语言:javascript
复制
$ docker run -l my-label --label com.example.foo=bar ubuntu bash

my-label键不指定值,因此标签默认为空字符串(“”)。 要添加多个标签,请重复标签标志(-l或--label)。

key =值必须是唯一的,以避免覆盖标签值。 如果您使用相同的键但指定了不同的值,则每个后续值都会覆盖前一个值。 Docker使用您提供的最后一个key =值。

使用该--label-file标志从文件加载多个标签。用EOL标记分隔文件中的每个标签。下面的示例从当前目录中的标签文件加载标签:

代码语言:javascript
复制
$ docker run --label-file ./labels ubuntu bash

标签文件格式与加载环境变量的格式类似。(与环境变量不同,标签对容器内运行的进程不可见。)以下示例说明了标签文件格式:

代码语言:javascript
复制
com.example.label1="a label"

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

您可以通过提供多个--label-file标志来加载多个标签文件。

有关使用标签的更多信息,请参阅Docker用户指南中的标签 - Docker中的自定义元数据

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

在启动容器时,使用--network标志将其连接到网络。 这将busybox容器添加到my-net网络。

代码语言:javascript
复制
$ docker run -itd --network=my-net busybox

在用户定义的网络上启动容器时,也可以使用--ip和--ip6标志选择容器的IP地址。

代码语言:javascript
复制
$ docker run -itd --network=my-net --ip=10.10.9.75 busybox

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

您可以将多个容器连接到同一个网络。一旦连接,容器可以很容易地通信,只需要另一个容器的IP地址或名称。对于overlay支持多主机连接的网络或自定义插件,连接到相同多主机网络但从不同引擎启动的容器也可以通过这种方式进行通信。

注意:服务发现在默认网桥上不可用。容器默认通过IP地址进行通信。要通过名称进行交流,他们必须联系起来。

您可以使用该docker network disconnect命令从网络断开容器。

从容器中装入卷(-volumes-from)

代码语言:javascript
复制
$ docker run --volumes-from 777f7dc92da7 --volumes-from ba8c0c54f0f2:ro -i -t ubuntu pwd

--volumes-from标志会从引用的容器中装入所有定义的卷。 容器可以通过重复-volumes-from参数来指定。 容器ID可以选择性地添加后缀:ro或:rw以分别将卷挂载到只读或读写模式。 默认情况下,卷以相同模式(读写或只读)作为参考容器装入。

像SELinux这样的标签系统要求在安装到容器中的卷内容上放置正确的标签。如果没有标签,安全系统可能会阻止容器内运行的进程使用内容。默认情况下,Docker不会更改OS设置的标签。

要更改容器上下文中的标签,可以添加两个后缀中的任意一个:z或添加:Z到卷装载。这些后缀告诉Docker重新标记共享卷上的文件对象。该z选项告诉Docker两个容器共享卷内容。因此,Docker使用共享内容标签来标记内容。共享卷标允许所有容器读取/写入内容。该Z选项告诉Docker使用私有非共享标签标记内容。只有当前容器可以使用私人卷。

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

-a标志告诉码头运行绑定到容器的STDIN,STDOUT或STDERR。 这可以根据需要操作输出和输入。

代码语言:javascript
复制
$ echo "test" | docker run -i -a stdin ubuntu cat -

这将数据通过管道传输到容器中,并通过仅附加到容器的STDIN来打印容器的ID。

代码语言:javascript
复制
$ docker run -a stderr ubuntu echo test

这不会打印任何东西,除非出现错误,因为我们只附加到容器的STDERR。 容器的日志仍然存储了写入STDERR和STDOUT的内容。

代码语言:javascript
复制
$ cat somefile | docker run -i -a stdin mybuilder dobuild

这是如何将文件传输到容器中以便构建的。构建完成后将打印容器的ID,并可使用检索构建日志docker logs。如果您需要将文件或其他内容传输到容器中,并在容器运行完毕后检索容器的ID,这非常有用。

将主机设备添加到容器(-device)

代码语言:javascript
复制
$ docker run --device=/dev/sdc:/dev/xvdc \
             --device=/dev/sdd --device=/dev/zero:/dev/nulo \
             -i -t \
             ubuntu ls -l /dev/{xvdc,sdd,nulo}

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/nulo

通常需要将设备直接暴露于容器。 --device选项启用该选项。 例如,一个特定的块存储设备或循环设备或音频设备可以被添加到另一个没有特权的容器(没有 - - 特权标志),并让应用程序直接访问它。

默认情况下,容器将能够读取,写入和mknod这些设备。 这可以使用第三个覆盖:每个设备标志的rwm选项集:

代码语言:javascript
复制
$ 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不能将不可用的块设备添加到不受信任的容器中。

重新启动策略(-restart)

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

政策

结果

没有

退出时不要自动重启容器。这是默认设置。

失败

仅在容器以非零退出状态退出时才能重新启动。或者,限制Docker守护程序尝试重新启动的次数。

总是

不管退出状态如何,始终重新启动容器。当你总是指定时,Docker守护进程将尝试无限期地重启容器。无论容器的当前状态如何,容器也将始终在守护进程启动时启动。

代码语言:javascript
复制
$ docker run --restart=always redis

这将运行redis容器,其重启策略始终如此,如果容器退出,Docker将重新启动它。

有关重新启动策略的更多详细信息,请参阅Docker运行参考页的重新启动策略(-restart)部分。

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

您可以使用一个或多个--add-host标志将其他主机添加到容器的/ etc / hosts文件中。 本示例为名为docker的主机添加一个静态地址:

代码语言:javascript
复制
$ docker run --add-host=docker:10.180.0.1 --rm -it debian

root@f38c87f2a42d:/# ping docker
PING docker (10.180.0.1): 48 data bytes
56 bytes from 10.180.0.1: icmp_seq=0 ttl=254 time=7.600 ms
56 bytes from 10.180.0.1: icmp_seq=1 ttl=254 time=30.705 ms
^C--- docker ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/stddev = 7.600/19.152/30.705/11.553 ms

有时您需要从容器内连接到Docker主机。 要启用此功能,请使用--add-host标志将Docker主机的IP地址传递给容器。 要查找主机地址,请使用ip addr show命令。

您传递的标志ip addr show取决于您的容器中是使用IPv4还是IPv6网络。使用以下标志为名为以下内​​容的网络设备检索IPv4地址eth0

代码语言:javascript
复制
$ HOSTIP=`ip -4 addr show scope global dev eth0 | grep inet | awk '{print \$2}' | cut -d / -f 1`
$ docker run  --add-host=docker:${HOSTIP} --rm -it debian

对于IPv6,使用-6标志而不是-4标志。 对于其他网络设备,请将eth0替换为正确的设备名称(例如桥设备的docker0)。

在容器中设置ulimits(-ulimit)

由于在容器中设置ulimit设置需要默认容器中不具备的额外特权,因此可以使用--ulimit标志来设置它们。 --ulimit指定软限制和硬限制,例如:<type>=<soft limit>[:<hard limit>],例如:

代码语言:javascript
复制
$ docker run --ulimit nofile=1024:1024 --rm debian sh -c "ulimit -n"
1024

注意:如果您不提供硬限制,则软限制将用于这两个值。 如果没有设置ulimits,它们将从守护程序中设置的默认ulimits继承。 因为现在选项被禁用。 换句话说,不支持以下脚本:

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

这些值syscall在设置时会发送到适当的位置。Docker不执行任何字节转换。设置这些值时请考虑这一点。

对于nproc的用法

请小心使用ulimit标志设置nproc,因为nproc是由Linux设计的,用于设置用户可用的最大进程数,而不是容器。 例如,使用守护进程用户启动四个容器:

代码语言:javascript
复制
$ 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,导致前三个容器使用为守护程序用户设置的三个进程配额。

停止带有信号的容器(-stop-signal)

--stop-signal标志设置将被发送到容器的系统呼叫信号以退出。这个信号可以是一个有效的无符号数字,与内核syscall表中的位置相匹配,例如9,或者SIGNAME格式的信号名称,例如SIGKILL。

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

在Windows上,此标志可用于指定credentialspec选项。 credentialspec必须采用格式file://spec.txt或registry:// keyname。

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

--stop-timeout标志设置将发送给容器退出的预定义(请参阅 - 停止信号)系统调用信号的超时(以秒为单位)。 超时后,容器将被SIGKILL杀死。

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

在Windows上运行Docker容器的情况下,此选项很有用。该--isolation <value>选项设置容器的隔离技术。在Linux上,唯一支持的是default使用Linux命名空间的选项。这两个命令在Linux上是等效的:

代码语言:javascript
复制
$ docker run -d busybox top
$ docker run -d --isolation default busybox top

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

描述

默认

使用Docker守护进程的--exec-opt或系统默认值(请参见下文)指定的值。

处理

共享内核命名空间隔离(Windows客户端操作系统不支持)。

Hyper-V的

基于Hyper-V管理程序分区的隔离。

Windows服务器操作系统上的默认隔离是过程。 Windows客户端操作系统上的默认(且仅支持)隔离是hyperv。 尝试使用--isolation过程在客户端操作系统上启动容器将失败。

在Windows服务器上,假设使用默认配置,这些命令是等效的并导致进程隔离:

代码语言:javascript
复制
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

如果您在Docker守护进程上设置了--exec-opt isolation = hyperv选项,或者针对基于Windows客户端的守护进程运行,则这些命令是等效的,并导致超级隔离:

代码语言:javascript
复制
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将报告主机系统的全部内存,而不是对容器docker运行的应用程序的限制运行-it -m 2GB --isolation =进程microsoft / nanoserver powershell Get-ComputerInfo *内存* CsTotalPhysicalMemory:17064509440 CsPhyicallyInstalledMemory: 16777216 OsTotalVisibleMemorySize:16664560 OsFreePhysicalMemory:14646720 OsTotalVirtualMemorySize:19154928 OsFreeVirtualMemory:17197440 OsInUseVirtualMemory:1957488 OsMaxProcessMemorySize:137438953344
  • hyperv隔离的情况下,Windows将创建一个足够容纳内存限制的实用程序虚拟机,以及承载容器所需的最小操作系统。该大小报告为“总物理内存”。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转发,请运行以下命令:

代码语言:javascript
复制
$ docker run --sysctl net.ipv4.ip_forward=1 someimage

注意:并非所有sysctl都是命名空间。Docker不支持更改也修改主机系统的容器内部的sysctls。随着内核的发展,我们期望看到更多的sysctl变成命名空间。

目前支持的sysctls

  • IPC Namespace:kernel.msgmax,kernel.msgmnb,kernel.msgmni,kernel.sem,kernel.shmall,kernel.shmmax,kernel.shmmni,kernel.shm_rmid_forced以fs.mqueue开头的系统*如果使用这个--ipc=host选项,这些sysctl将不会允许。
  • Network Namespace:以net开头的Sysctls *如果--network=host使用这些sysctl 的选项将不被允许。

扫码关注腾讯云开发者

领取腾讯云代金券