docker run命令用于从镜像创建并运行一个新容器,然后在新容器中运行进程。docker run启动一个进程,它有自己的文件系统、自己的网络和自己的隔离进程树。启动进程的IMAGE可以定义与将在容器中运行的进程、要公开的网络等相关的默认值,但docker run将最终控制权交给从镜像启动容器的操作员或管理员。因此,docker run比任何其他docker命令都有更多的选项。
如果IMAGE尚未加载,那么docker run将以运行docker pull IMAGE的相同方式从存储库中提取IMAGE和所有镜像依赖项,然后再从该镜像启动容器。
docker run命令的用法如下:
docker run [-a|--attach[=[]]] [--add-host[=[]]] [--annotation[=[]]] [--blkio-weight[=[BLKIO-WEIGHT]]] [--blkio-weight-device[=[]]] [-c|--cpu-shares[=0]] [--cap-add[=[]]] [--cap-drop[=[]]] [--cgroupns[=[]]] [--cgroup-parent[=CGROUP-PATH]] [--cidfile[=CIDFILE]] [--cpu-count[=0]] [--cpu-percent[=0]] [--cpu-period[=0]] [--cpu-quota[=0]] [--cpu-rt-period[=0]] [--cpu-rt-runtime[=0]] [--cpus[=0.0]] [--cpuset-cpus[=CPUSET-CPUS]] [--cpuset-mems[=CPUSET-MEMS]] [-d|--detach] [--detach-keys[=[]]] [--device[=[]]] [--device-cgroup-rule[=[]]] [--device-read-bps[=[]]] [--device-read-iops[=[]]] [--device-write-bps[=[]]] [--log-opt[=[]]] [--device-write-iops[=[]]] [--dns[=[]]] [--dns-option[=[]]] [--dns-search[=[]]] [--domainname[=DOMAINNAME]] [-e|--env[=[]]] [--entrypoint[=ENTRYPOINT]] [--env-file[=[]]] [--expose[=[]]] [--group-add[=[]]] [-h|--hostname[=HOSTNAME]] [--help] [--init] [-i|--interactive] [--ip[=IPv4-ADDRESS]] [--ip6[=IPv6-ADDRESS]] [--ipc[=IPC]] [--isolation[=default]] [-l|--label[=[]]] [--kernel-memory[=KERNEL-MEMORY]] [--label-file[=[]]] [--link[=[]]] [--link-local-ip[=[]]] [--log-driver[=[]]] [--volumes-from[=[]]] [-m|--memory[=MEMORY]] [--mac-address[=MAC-ADDRESS]] [--memory-reservation[=MEMORY-RESERVATION]] [--memory-swap[=LIMIT]] [--memory-swappiness[=MEMORY-SWAPPINESS]] [--mount[=[MOUNT]]] [--name[=NAME]] [--network-alias[=[]]] [--network[="bridge"]] [--oom-kill-disable] [--oom-score-adj[=0]] [-P|--publish-all] [-p|--publish[=[]]] [--pid[=[PID]]] [--userns[=[]]] [--pids-limit[=PIDS_LIMIT]] [--privileged] [--read-only] [--restart[=RESTART]] [--rm] [--security-opt[=[]]] [--storage-opt[=[]]] [--stop-signal[=SIGNAL]] [--sig-proxy[=true]] [--stop-timeout[=TIMEOUT]] [--shm-size[=[]]] [--sysctl[=[]]] [-t|--tty] [--tmpfs[=[CONTAINER-DIR[:OPTIONS]]] [-u|--user[=USER]] [--ulimit[=[]]] [--uts[=[]]] [--volume-driver[=DRIVER]] [-v|--volume[=[[HOST-DIR:]CONTAINER-DIR[:OPTIONS]]]] [-w|--workdir[=WORKDIR]] IMAGE [COMMAND] [ARG...]
命令选项
-a, --attach=[]
连接到STDIN、STDOUT或STDERR。
在前台模式下(未指定-d时为默认模式),docker run可以启动容器中的进程,并将控制台附加到进程的标准输入、输出和标准错误。它甚至可以假装是TTY(这是大多数命令行可执行文件所期望的)并传递信号。可以为stdin、stdout和stderr中的每一个设置-a选项。
--add-host=[]
添加自定义主机到IP映射(host=ip,或host:ip)
在/etc/hosts中添加一行。格式为hostname=ip,或hostname:ip。
--add-host选项可以多次设置。
--annotation=[]
向容器添加注释(传递给OCI运行时),注释在OCI运行时提供。
--blkio-weight=0
块IO权重(相对权重)接受10到1000之间的权重值。
--blkio-weight-device=[]
块IO权重(相对设备权重,格式:DEVICE_NAME:WEIGHT)。
-c, --cpu-shares=0
CPU份额(相对权重)。默认情况下,所有容器获得相同比例的CPU周期。可以通过更改容器的CPU份额权重相对于所有其他正在运行的容器的权重来修改此比例。
要修改默认值1024的比例,请使用-c或--cpu-shares标志将权重设置为2或更高。该比例仅在CPU密集型进程运行时适用。当一个容器中的任务空闲时,其他容器可以使用剩余的CPU时间。实际的CPU时间将根据系统上运行的容器数量而有所不同。
例如,考虑三个容器,一个容器的cpu-share为1024,另外两个容器的cpu-share设置为512。当所有三个容器中的进程都试图使用100%的CPU时,第一个容器将获得总CPU时间的50%。如果你添加一个cpu-share为1024的第四个容器,第一个容器只能获得33%的CPU,其余的容器分别获得16.5%、16.5%和33%的CPU。
在多核系统中,CPU时间的份额分布在所有CPU核上。即使一个容器的CPU时间限制在100%以下,它也可以使用每个单独CPU核的100%。
例如,考虑一个具有三个以上内核的系统。如果以-c=512启动一个容器{C0}运行一个进程,以-c=1024启动另一个容器{C1}运行两个进程,这可能会导致CPU共享的以下划分:
PID container CPU CPU share100 {C0} 0 100% of CPU0101 {C1} 1 100% of CPU1102 {C1} 2 100% of CPU2
--cap-add=[]
添加Linux功能。
--cap-drop=[]
删除Linux功能。
--cgroupns=""
为容器设置cgroup命名空间模式。
host:在主机的cgroup命名空间中运行容器。
private:在容器自己的私有cgroup命名空间中运行容器。
“”:(未设置)使用守护进程的默认配置(cgroup v1使用host,cgroup v2使用private)。
--cgroup-parent=""
cgroups的路径,将在该路径下创建容器的cgroup。如果路径不是绝对的,则认为该路径相对于init进程的cgroups路径。如果Cgroups不存在,则将创建它们。
--cidfile=""
将容器ID写入文件
--cpu-count=0
限制容器可用于执行的CPU数量。
在Windows Server容器上,这近似为CPU总使用率的百分比。
在Windows Server容器上,处理器资源控件是互斥的,优先级顺序是先CPUCount,然后是CPUShares,最后是CPUPercent。
--cpu-percent=0
限制在Windows守护进程上运行的容器可执行的CPU百分比。
在Windows Server容器上,处理器资源控件是互斥的,优先级顺序是先CPUCount,然后是CPUShares,最后是CPUPercent。
--cpu-period=0
限制CPU CFS(Completely Fair Scheduler,完全公平调度程序)周期。
限制容器的CPU使用率。此标志告诉内核将容器的CPU使用限制在您指定的范围内。
--cpuset-cpus=""
允许执行的CPU(0-3,0,1)。
--cpuset-mems=""
允许执行的内存节点(MEMs)(0-3,0,1)。仅在NUMA系统上有效。
如果你的系统上有四个内存节点(0-3),使用--cpuset mems=0,1,那么Docker容器中的进程将只使用前两个内存节点的内存。
--cpu-quota=0
限制CPU CFS(Completely Fair Scheduler,完全公平调度程序)配额。
限制容器的CPU使用率。默认情况下,容器以完整的CPU资源运行。此标志告诉内核将容器的CPU使用限制在您指定的配额内。
--cpu-rt-period=0
以微秒为单位限制CPU实时周期
限制容器的实时CPU使用率。此标志告诉内核将容器的实时CPU使用限制在您指定的时长内。
--cpu-rt-runtime=0
以微秒为单位限制CPU实时运行时间
限制容器实时CPU使用率。这个标志告诉内核在指定的CPU周期内限制实时任务可能消耗的时间。例如:1000000us的周期和950000us的运行时间意味着这个容器可能会消耗95%的可用CPU,并将剩余的5%留给正常的优先级任务。
容器中所有运行时的总和不能超过分配给父cgroup的数量。
--cpus=0.0
CPU数量。默认值为0,0表示没有限制。
-d, --detach=true|false
分离模式:在后台运行容器并打印新的容器ID。默认值为false。
在任何时候,你都可以在另一个shell中运行docker ps来查看正在运行的容器列表。您可以使用docker attach重新连接到已断开的容器。
在tty模式下连接时,您可以使用可配置的键序列从容器中分离(并保持其运行)。默认顺序为CTRL-p CTRL-q。您可以使用--detach-keys选项或配置文件配置键序列。有关使用配置文件的文档,请参阅config-json。
--detach-keys=key
覆盖拆卸容器的键顺序;key是[a-Z]范围内的单个字符,或ctrl+按键,其中value是:a-Z、@、^、[、,或_之一。
--device=onhost:incontainer[:mode]
将主机设备onhost添加到容器的非容器名称下。可选模式参数可用于指定设备权限,它是r(代表读取)、w(代表写入)和m(代表mknod)的组合。
例如,--device=/dev/sdc:/dev/xvdc:rwm将为容器授予主机设备/dev/sdc的所有权限,在容器内被视为/dev/xvdc。
--device-cgroup-rule="type major:minor mode"
将规则添加到cgroup允许的设备列表中。该规则应采用Linux内核文档(documentation/cgroup-v1/devices.txt)中指定的格式:
-type:a(all,全部)、c(char,字符)或b(block,块);
-major和minor:要么是数字,要么是*代表所有不;
-mode:r(读)、w(写)和m(mknod)的组合。
示例:--device-cgroup-rule "c 1:3 mr":允许创建和读取由1:3标识的字符设备。
--device-read-bps=[]
限制设备的读取速率。
(例如:--device-read-bps=/dev/sda:1mb)
--device-read-iops=[]
限制设备的读取速率。
(例如:--device-read-iops=/dev/sda:1000)
--device-write-bps=[]
限制设备的写入速率。
(例如:--device-write-bps=/dev/sda:1mb)
--device-write-iops=[]
限制设备的写入速率。
(例如:--device-write-iops=/dev/sda:1000)
--dns-search=[]
设置自定义DNS搜索域。(如果不希望设置搜索域,请使用--dns-search=.)
--dns-option=[]
设置自定义DNS选项。
--dns=[]
设置自定义DNS服务器。
此选项可用于覆盖传递给容器的DNS配置。通常,当主机DNS配置对容器无效时(例如127.0.0.1),这是必要的。在这种情况下,每次运行都需要--dns标志。
--domainname=""
容器NIS域名。设置容器内可用的容器NIS域名(另请参见setdomainname(2))。
-e, --env=[]
设置环境变量。此选项允许您指定可用于将在容器内启动的进程的任意环境变量。
--entrypoint=""
覆盖镜像的默认ENTRYPOINT。
此选项允许您覆盖在Dockerfile中设置的镜像的默认entrypoint。镜像的ENTRYPOINT类似于COMMAND,因为它指定了容器启动时要运行的可执行文件,但它(故意)更难覆盖。ENTRYPOINT为容器提供了默认的性质或行为,因此当您设置ENTRYPOINT时,您可以像运行二进制文件一样运行容器,并使用默认选项,您还可以通过COMMAND传递更多选项。但是,有时操作员可能希望在容器内运行其他内容,因此您可以在运行时通过使用--ENTRYPOINT和字符串指定新的ENTRYPOINT来覆盖默认的ENTRYPOINT。
--env-file=[]
读取以行分隔的环境变量文件。
--expose=[]
暴露一个端口或一系列端口(例如--expose=3300-3310),通知Docker容器在运行时监听指定的网络端口。Docker使用这些信息通过链接互连容器,并在主机系统上设置端口重定向。
--group-add=[]
添加并以其他组[]运行。
-h, --hostname=""
容器主机名。设置容器内可用的容器主机名。
--help
打印使用说明。
--init
在容器内运行一个init,转发信号并获取进程。
-i, --interactive=true|false
即使没有连接,也要保持STDIN打开。默认值为false。当设置为true时,即使没有连接,也要保持stdin打开。
--ip=""
设置容器的接口IPv4地址(例如172.23.0.9)。它只能与--network结合使用,用于用户定义的网络
--ip6=""
设置容器的接口IPv6地址(例如,2001:db8::1b99)。它只能与--network结合使用,用于用户定义的网络
--ipc=""
设置容器的IPC模式。接受以下值:
如果未指定,则使用守护进程默认值,该值可以是私有的或可共享的,具体取决于守护进程的版本和配置。
--isolation="default"
isolation指定了容器使用的隔离技术类型。请注意,Windows服务器上的默认设置是process,Windows客户端上的默认值是hyperv。Linux只支持default。
-l, --label key=value
在容器上设置元数据(例如:--label com.example.key=value)。
--kernel-memory=number[S]
内核内存限制;S是一个可选后缀,可以是b、k、m或g中的一个。
限制容器可用的内核内存。如果指定了0的限制(不使用--kernel内存),则容器的内核内存不受限制。如果指定了一个限制,它可能会四舍五入到操作系统页面大小的倍数,这个值可能非常大,达到数百万万亿。
--label-file=[]
读取以行分隔的标签文件。
--link=name-or-id[:alias]
添加指向另一个容器的链接。
如果操作员在启动新客户端容器时使用--link,则客户端容器可以通过专用网络接口访问暴露的端口。Docker将在客户端容器中设置一些环境变量,以帮助指示使用哪个接口和端口。
--link-local-ip=[]
将一个或多个链路本地IPv4/IPv6地址添加到容器的接口。
--log-driver="json-file|syslog|journald|gelf|fluentd|awslogs|splunk|etwlogs|gcplogs|none"
容器的日志记录驱动程序。默认值由守护进程--log-driver程序标志定义。警告:docker logs命令仅适用于json文件和日志记录驱动程序。
--log-opt=[]
记录特定于驱动程序的选项。
-m, --memory=number[*S]
内存限制;S是一个可选后缀,可以是b、k、m或g中的一个。
允许您限制容器的可用内存。如果主机支持交换内存,则-m内存设置可以大于物理RAM。如果指定了限制为0(不使用-m),则容器的内存不受限制。实际限制可以四舍五入到操作系统页面大小的倍数(该值将非常大,即数百万万亿)。
--memory-reservation=number[*S]
内存软限制;S是一个可选后缀,可以是b、k、m或g中的一个。
设置内存保留后,当系统检测到内存争用或内存不足时,容器将被迫将其消耗限制在保留范围内。因此,您应该始终设置在--memory值以下,否则硬限制将优先。默认情况下,内存预留将与内存限制相同。
--memory-swap=number[S]
组合内存加交换限制;S是一个可选后缀,可以是b、k、m或g中的一个。
此选项只能与--memory一起使用。设置的值应该总是大于--memory。默认值是--memory值的两倍。设置为-1表示启用无限制交换。
--mac-address=""
容器MAC地址(例如,92:d0:c6:0a:29:33)。
请记住,以太网中的MAC地址必须是唯一的。IPv6链路本地地址将根据RFC4862基于设备的MAC地址。
--mount type=TYPE,TYPE-SPECIFIC-OPTION[,...]
将文件系统挂载附加到容器。当前支持的挂载类型包括bind、volume和tmpfs。例如:
type=bind,source=/path/on/host,destination=/path/in/containertype=volume,source=my-volume,destination=/path/in/container,volume-label="color=red",volume-label="shape=round"type=tmpfs,tmpfs-size=512M,destination=/path/in/container
常见选项:
•src,source:挂载指定的bind和volume源,必须使用bind。
•dst、destination、target:指定挂载目标路径。
•ro,readonly:true或false(默认)。
注意:根据内核版本,为绑定挂载设置只读可能不会使其子挂载为只读。另请参见bind-recursive。
bind的特定选项:
•bind-propagation:consistent、slave、private、rshared、rsave或rprivate(默认)。另请参见mount。
•consistency:consistent(默认)、cached或delegated。目前,仅适用于Mac版Docker。
•bind-recursive:enabled(默认)、disabled、可writable或readonly:
如果设置为enabled,子挂载将被递归绑定挂载,并尝试被递归设置为只读。
如果设置为disabled,则子挂载不会递归绑定挂载。
如果设置为可writable,子挂载将被递归绑定挂载,但不会被递归设置为只读。
如果设置为readonly,子挂载将被递归绑定挂载,并强制递归设置为只读。
•bind-nonrecursive(已弃用):true或false(默认)。设置true等于bind-recursive=disabled,设置false等于bind-recursive=enabled。
特定于volume的选项:
•volume-driver:卷驱动程序插件的名称。
•volume-label:自定义元数据。
•volume-nocopy:true(默认)或false。如果设置为false,引擎会将挂载路径下的现有文件和目录复制到卷中,允许主机访问它们。
•volume-opt:特定于指定的volume驱动程序。
tmpfs特有的选项:
•tmpfs-size:tmpfs挂载的大小(以字节为单位)。在Linux中默认情况下不受限制。
•tmpfs-mode:八进制中tmpfs的文件模式。(例如700或0700。)在Linux中默认为1777。
--name=""
为容器命名。操作员可以通过三种方式识别容器:
UUID标识符来自Docker守护进程,如果没有使用--name为容器分配名称,那么守护进程也会生成一个随机字符串名称。在定义链接(请参阅--link)(或您需要标识容器的任何其他位置)时,该名称很有用。这适用于后台和前台Docker容器。
--network=type
设置容器的网络模式。支持的值包括:
默认设置为bridge桥接。
--network-alias=[]
为容器添加网络范围的别名。
--oom-kill-disable=true|false
是否为容器禁用OOM Killer。
--oom-score-adj=""
调整主机对容器的OOM优先级(接受-1000到1000)
-P, --publish-all=true|false
将所有暴露的端口发布到主机接口上的随机端口。默认值为false。
当设置为true时,将所有暴露的端口发布到主机接口。默认值为false。如果操作员使用-P(或-p),那么Docker将使暴露的端口在主机上可访问,并且这些端口将可供任何可以访问主机的客户端使用。使用-P时,Docker会将任何暴露的端口绑定到主机上由/proc/sys/net/ipv4/ip_local_port_range定义的临时端口范围内的随机端口。要查找主机端口和暴露端口之间的映射,请使用docker port。
-p, --publish ip:[hostPort]:containerPort | [hostPort:]containerPort
将容器的端口或端口范围发布到主机。
hostPort和containerPort都可以指定为一个范围。为两者指定范围时,范围中的端口数应相等。
例如:
-p 1234-1236:1222-1224, -p 127.0.0.1:$HOSTPORT:$CONTAINERPORT.
使用docker port命令查看实际映射,例如:docker port CONTAINER $CONTAINERPORT。
--pid=""
设置容器的PID模式。默认情况下,为容器创建私有PID命名空间。
“container:”:加入另一个容器的PID命名空间。
“host”:为容器使用主机的PID命名空间。注意:host模式赋予容器对本地PID的完全访问权限,因此被认为是不安全的。
--userns=""
启用userns-remap选项时,为容器设置usernamespace模式。
host:使用host usernamespace并启用所有特权选项(例如,pid=host或--privileged)。
--pids-limit=""
调整容器的pids(process IDs,进程ID)限制。设置为-1时,容器的pid不受限制。
--uts=type
为容器设置UTS模式。唯一可能的类型是host,这意味着在容器内使用主机的UTS命名空间。
注意:host模式允许容器更改主机名,因此被认为是不安全的。
--privileged [true|false]
授予此容器扩展权限,一个“特权”容器可以访问所有设备。
当操作员执行docker run --privileged时,docker将启用对主机上所有设备的访问,并在AppArmor中设置一些配置,以允许容器对主机的访问几乎与在主机上容器外运行的进程相同。
--read-only=true|false
以只读方式挂载容器的根文件系统。
默认情况下,容器的根文件系统是可写的,允许进程在任何地方写入文件。通过指定--ready标志,容器的根文件系统将被挂载为只读,禁止任何写入。
--restart policy
在容器退出时应用的重启策略。支持的值包括:
默认值为no。
--rm true|false
容器退出时自动移除,默认值为false。
--rm标志可以与-d一起使用,并在守护进程端自动删除。请注意,它与除无重启策略之外的任何重启策略都不兼容。
--security-opt value[,...]
容器的安全选项。可以提供以下选项:
“label=user:USER”:为容器设置标签用户
“label=role:ROLE”:设置容器的标签角色
“label=type:TYPE”:设置容器的标签类型
“label=level:LEVEL”:设置容器的标签级别
“label=disable”:关闭容器的标签限制
“no-new-privileges”:禁止容器进程获得其他权限
“seccomp=unlimited”:关闭容器的seccomp限制
“seccomp=profile.json”:白名单系统调用seccomp json文件作为seccomp筛选器
“apparmor=unconfined”:关闭容器的apparmor限制
“apparmor=your-profile”:设置容器的apparmor限制配置
--storage-opt
每个容器的存储驱动程序选项。
$ docker run -it --storage-opt size=120G fedora /bin/bash
此命令(大小)将允许在创建时将容器rootfs大小设置为120G。此选项仅适用于btrfs、overlay2和zfs存储驱动程序。对于btrfs和zfs存储驱动程序,用户不能传递小于默认BaseFS大小的大小;对于overlay2存储驱动程序,只有当支持文件系统为xfs并使用pquota mount选项挂载时,size选项才可用。在这些条件下,用户可以传递小于底层文件系统大小的任何大小。
--stop-signal=""
发出停止容器的信号。
--stop-signal标志设置将发送到容器以退出的系统调用信号。此信号可以是格式为SIG的信号名称,例如SIGKILL,也可以是与内核系统调用表中的位置匹配的无符号数,例如9。
默认值由镜像中的STOPSIGNAL定义,如果镜像中没有定义STOPSIGNOL,则由SIGTERM定义。
--stop-timeout
达到超时时间(秒)则停止容器,或配置为-1以禁用超时。
--stop-timeout标志设置在发送预定义的(参见--stop-signal)系统调用信号后等待容器停止的秒数。如果容器在超时后没有退出,则会用SIGKILL信号强制杀死它。
如果--stop-timeout设置为-1,则不应用超时,守护进程将无限期等待容器退出。
默认值由守护进程决定,Linux容器为10秒,Windows容器为30秒。
--shm-size=""
/dev/shm的大小。格式为<数字><单位>。数字必须大于0,单位是可选的,可以是b(字节)、k(千字节)、m(兆字节)或g(千兆字节)。
如果省略单位,系统将使用字节。如果完全省略此参数,系统将使用64m。
--sysctl=SYSCTL
在运行时配置命名空间内核参数。
IPC命名空间-当前允许的sysctls:
· kernel.msgmax, kernel.msgmnb, kernel.msgmni, kernel.sem, kernel.shmall, kernel.shmmax, kernel.shmmni, kernel.shm_rmid_forced
· 以fs.mqueue.*开头的sysctls。
如果使用--ipc=host选项,则不允许使用这些sysctls。
网络命名空间-当前允许的sysctls:
· 以net.*开头的sysctls。
如果使用--network=host选项,则不允许使用这些sysctls。
--sig-proxy=true|false
代理接收到进程的信号(仅限非TTY模式)。SIGCHLD、SIGSTOP和SIGKILL未被代理。默认值为true。
--memory-swappiness=""
调整容器的内存交换行为。接受0到100之间的整数。
-t, --tty=true|false
分配一个伪TTY。默认值为false。
当设置为true时,Docker可以分配一个伪tty并附加到任何容器的标准输入。例如,这可用于运行一次性交互式shell。默认值为false。
-t选项与docker客户端标准输入的重定向不兼容。
--tmpfs=[] Create a tmpfs mount
将临时文件系统(temporary filesystem,tmpfs)挂载到容器中,例如:
$ docker run -d --tmpfs /tmp:rw,size=787448k,mode=1777 my_image
此命令在容器内的/tmp处挂载tmpfs。支持的挂载选项与Linux默认挂载标志相同。如果不指定任何选项,系统将使用以下选项:rw,noexec,nosuid,nodev,size=65536k。
另请参见--mount,它是--tmpfs和--volume的继承者。尽管没有计划弃用--tmpfs,但建议使用--mount。
-u, --user=""
设置所使用的用户名或UID,以及指定命令的组名或GID(可选)。以下示例均有效:
--user [user | user:group | uid | uid:gid | user:gid | uid:group ]
如果没有此参数,该命令将在容器中以root身份运行。
--ulimit=[]
Ulimit选项。
-v|--volume[=[[HOST-DIR:]CONTAINER-DIR[:OPTIONS]]]
创建绑定挂载。如果指定-v /HOST-DIR:/CONTAINER-DIR,Docker会将主机中的/HOST-DIR绑定到Docker容器中的/CONTAINER-DIR。如果省略“HOST-DIR”,Docker会自动在主机上创建新卷。选项是逗号分隔的列表,可以是:
• [rw|ro]• [z|Z]• [[r]shared|[r]slave|[r]private]• [delegated|cached|consistent]• [nocopy]
CONTAINER-DIR必须是绝对路径,如/src/docs。HOST-DIR可以是绝对路径或名称值。名称值必须以字母数字字符开头,后跟A-z、0-9、_(下划线)、.(句号)或-(连字符)。绝对路径以/(正斜杠)开头。
如果您提供的HOST-DIR是绝对路径,Docker bind将挂载到您指定的路径。如果您提供了一个名称,Docker将按该名称创建一个命名卷。例如,您可以为HOST-DIR值指定/foo或foo。如果你提供/foo值,Docker会创建一个bind挂载;如果你提供了foo规范,Docker会创建一个同名卷。
您可以指定多个-v选项,将一个或多个卷挂载到容器中。要在其他容器中使用这些相同的挂载,请同时指定--volumes-from选项。
您可以在附加冒号后为每个绑定挂载提供附加选项。:ro或:rw后缀分别以只读或读写模式挂载卷。默认情况下,卷以读写模式挂载。您还可以指定挂载的一致性要求,可以是:consistent(默认)、:cached或:delegated。多个选项用逗号分隔,例如:ro,cached。
像SELinux这样的标签系统要求在挂载到容器中的卷内容上放置适当的标签。如果没有标签,安全系统可能会阻止容器内运行的进程使用内容。默认情况下,Docker不会更改操作系统设置的标签。
要更改容器上下文中的标签,可以向卷挂载添加两个后缀中的任何一个:z或:Z。这些后缀告诉Docker在共享卷上重新标记文件对象。z选项表示Docker两个容器共享卷内容。因此,Docker使用共享内容标签来标记内容,共享卷标允许所有容器读取/写入内容。Z选项表示Docker使用私有非共享标签来标记内容。只有当前容器可以使用私有卷。
默认情况下,绑定挂载的卷是私有的。这意味着在容器内完成的任何挂载在主机上都不可见,反之亦然。可以通过指定卷挂载传播属性来更改此行为。在容器内的该卷下进行的卷共享挂载将在主机上可见,反之亦然。指定卷从属只能实现单向挂载传播,即在该卷下的主机上完成的挂载将在容器内可见,反过来则不可见。
要控制卷的挂载传播属性,可以使用:[r]shared、:[r]slave或:[r]private传播标志。只能为绑定挂载的卷指定传播属性,而不能为内部卷或命名卷指定。为了将挂载传播到工作源挂载点(挂载源目录的挂载点),必须具有正确的传播属性。对于共享卷,必须共享源挂载点。对于从属卷,源挂载必须是共享的或从属的。
使用df来找出源挂载,然后使用findmnt -o TARGET,PROPAGATION来找出源挂载的传播属性。如果findmnt实用程序不可用,那么可以在/proc/self/mountinfo中查看源挂载点的挂载条目。查看可选字段,查看是否指定了任何传播属性。shared:X表示挂载是共享的,master:X表示挂载为从属的;如果没有任何标记,则表示挂载是私有的。
要更改挂载点的传播属性,请使用mount命令。例如,如果要绑定mount源目录/foo,可以执行mount --bind /foo /foo和mount --make-private --make-shared /foo。这将把/foo转换为共享挂载点。或者,可以直接更改源挂载的传播属性。假设/是/foo的源挂载,然后使用mount --make-shared /将/转换为共享挂载。
注意:当使用systemd管理Docker守护进程的启动和停止时,在systemd单元文件中有一个选项可以控制Docker守护进程本身的挂载传播,称为MountFlags。此设置的值可能会导致Docker看不到在挂载点上进行的挂载传播更改。例如,如果此值为slave,则可能无法在卷上使用shared或rshared传播。
要禁用将数据从容器路径自动复制到卷,请使用nocopy标志。可以在绑定挂载和命名卷上设置nocopy标志。
另请参见--mount,它是--tmpfs和--volume的继承者。尽管没有计划弃用--volume,但建议使用--mount。
--volume-driver=""
容器的卷驱动程序。此驱动程序创建从Dockerfile的VOLUME指令或docker run -v标志指定的卷。
有关完整详细信息,请参阅docker-volume-create。
--volumes-from=[]
从指定容器挂载卷。
将已挂载的卷从源容器挂载到另一个容器上。您必须提供源容器的id。要共享卷,请在运行目标容器时使用--volumes-from选项。即使源容器未运行,您也可以共享卷。
默认情况下,Docker以与源容器中挂载卷相同的模式(读写或只读)挂载卷。您可以通过在容器id后添加:ro或:rw关键字来更改此设置。
如果源容器中的卷位置与目标容器上的数据重叠,则该卷会在目标容器上隐藏该数据。
-w, --workdir=""
容器内的工作目录。
在容器中运行二进制文件的默认工作目录是根目录(/)。开发人员可以使用Dockerfile WORKDIR指令设置不同的默认值。操作员可以使用-w选项覆盖工作目录。
退出状态代码
docker run的退出代码提供了有关容器运行失败或退出原因的信息。当docker run以非零代码退出时,退出代码遵循chroot标准,如下所示:
125:如果错误发生在Docker守护进程本身。
$ docker run --foo busybox; echo $?# flag provided but not defined: --fooSee 'docker run --help'.125
126:如果所包含的命令无法调用。
$ docker run busybox /etc; echo $?# exec: "/etc": permission denieddocker: Error response from daemon: Contained command could not be invoked126
127:如果找不到包含的命令。
$ docker run busybox foo; echo $?# exec: "foo": executable file not found in $PATHdocker: Error response from daemon: Contained command not found or does not exist127
否则包含命令的退出代码。
$ docker run busybox /bin/sh -c 'exit 3'# 3
示例
以只读模式运行容器
在容器镜像开发过程中,容器通常需要写入镜像内容。例如,将软件包安装到/usr中。在生产环境中,应用程序很少需要写入镜像。如果容器应用程序需要写入文件系统,则会写入卷。通过使用--read-only开关以只读模式运行应用程序,可以使应用程序更加安全。这可以保护容器镜像免受修改。只读容器可能仍需要写入临时数据。处理此问题的最佳方法是在/run和/tmp上挂载tmpfs目录。
# docker run --read-only --tmpfs /run --tmpfs /tmp -i -t fedora /bin/bash
将容器中的日志消息暴露到主机的日志中
如果你想让记录在容器中的消息显示在主机的syslog/journal中,那么你应该按如下方式绑定挂载/dev/log目录。
# docker run -v /dev/log:/dev/log -i -t fedora /bin/bash
从容器内部,您可以通过向日志发送消息来测试这一点。
(bash)# logger "Hello from my container"
然后退出并检查日志。
# exit# journalctl -b | grep Hello
这应该列出发送给日志记录器的消息。
连接到STDIN、STDOUT、STDERR中的一个或多个
如果不指定-a,Docker将附加所有内容(stdin、stdout、stderr)。您可以指定要连接到三个标准流(stdin、stdout、stderr)中的哪一个,如下所示:
# docker run -a stdin -a stdout -i -t fedora /bin/bash
在容器之间共享IPC
使用此处提供的shm_server.c:https://www.cs.cf.ac.uk/Dave/C/node27.html
测试--ipc=host模式:
宿主机显示了一个连接了7个pid的共享内存段,恰好来自httpd:
$ sudo ipcs -m------ Shared Memory Segments --------key shmid owner perms bytes nattch status0x01128e25 0 root 600 1000 7
现在运行一个常规容器,它如预期一样看不到主机的共享内存段:
$ docker run -it shm ipcs -m------ Shared Memory Segments --------key shmid owner perms bytes nattch status
使用新的--ipc=host选项运行一个容器,它现在可以看到主机httpd中的共享内存段:
$ docker run -it --ipc=host shm ipcs -m------ Shared Memory Segments --------key shmid owner perms bytes nattch status0x01128e25 0 root 600 1000 7
测试--ipc=container:CONTAINERID模式:
使用程序启动容器以创建共享内存段:
$ docker run -it shm bash$ sudo shm/shm_server &$ sudo ipcs -m------ Shared Memory Segments --------key shmid owner perms bytes nattch status0x0000162e 0 root 666 27 1
创建第二个容器,如预期一样显示第一个容器中没有共享内存段:
$ docker run shm ipcs -m------ Shared Memory Segments --------key shmid owner perms bytes nattch status
使用新的--ipc=container:CONTAINERID选项创建第三个容器,现在它显示了第一个共享内存段:
$ docker run -it --ipc=container:ed735b2264ac shm ipcs -m$ sudo ipcs -m------ Shared Memory Segments --------key shmid owner perms bytes nattch status0x0000162e 0 root 666 27 1
链接容器
注意:本节介绍默认(网桥)网络上容器之间的链接,也称为“传统链接”。在用户定义的网络上使用--link使用基于DNS的发现,该发现不会向/etc/hosts添加条目,也不会为发现设置环境变量。
链接功能允许多个容器相互通信。例如,一个其Dockerfile暴露了端口80的容器可以运行并命名如下:
# docker run --name=link-test -d -i -t fedora/httpd
第二个容器(在本例中称为链接器)可以通过运行--link=与httpd容器(名为link-test)通信:
# docker run -t -i --link=link-test:lt --name=linker fedora /bin/bash
现在,容器链接器已使用别名lt链接到容器link-test。在链接器容器中运行env命令将显示具有LT(别名)上下文(LT_)的环境变量。
# envHOSTNAME=668231cb0978TERM=xtermLT_PORT_80_TCP=tcp://172.17.0.3:80LT_PORT_80_TCP_PORT=80LT_PORT_80_TCP_PROTO=tcpLT_PORT=tcp://172.17.0.3:80PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binPWD=/LT_NAME=/linker/ltSHLVL=1HOME=/LT_PORT_80_TCP_ADDR=172.17.0.3_=/usr/bin/env
当链接两个容器时,Docker将使用容器的暴露端口创建一个安全隧道,供父级访问。
如果容器连接到默认网桥网络并与其他容器链接,则容器的/etc/hosts文件将使用链接容器的名称进行更新。
注意:由于Docker可能会实时更新容器的/etc/hosts文件,因此在某些情况下,容器内的进程最终可能会读取一个空的或不完整的/etc/host文件。在大多数情况下,重新尝试读取应该可以解决问题。
映射端口以供外部使用
应用程序的暴露端口可以使用-p标志映射到主机端口。例如,可以使用以下命令将httpd端口80映射到主机端口8080:
# docker run -p 8080:80 -d -i -t fedora/httpd
创建和挂载数据卷容器
许多应用程序需要跨多个容器共享持久数据。Docker允许您创建一个数据卷容器,其他容器可以从中挂载。例如,创建一个包含目录/var/volume1和/tmp/volume2的命名容器。镜像需要包含这些目录,因此fedora-data镜像可能需要几个RUN mkdir指令:
# docker run --name=data -v /var/volume1 -v /tmp/volume2 -i -t fedora-data true# docker run --volumes-from=data --name=fedora-container1 -i -t fedora bash
参数中的多个卷将汇集来自多个容器的多个数据卷。并且可以通过fedora-container1中间容器将来自DATA容器的卷挂载到另一个容器中,从而可以从该数据的用户那里抽象出实际的数据源:
# docker run --volumes-from=fedora-container1 --name=fedora-container2 -i -t fedora bash
安装外部数据卷
要将主机目录挂载为容器卷,请指定目录的绝对路径和容器目录的绝对路径,用冒号分隔:
# docker run -v /var/db:/data1 -i -t fedora bash
使用SELinux时,请注意主机不知道容器SELinux策略。因此,在上述示例中,如果强制执行SELinux策略,则/var/db目录对容器不可写。将出现“Permission Denied”(权限被拒绝)消息,并在主机的系统日志中显示avc:消息。
为了解决这个问题,在编写本手册页时,需要运行以下命令,以便将正确的SELinux策略类型标签附加到主机目录:
# chcon -Rt svirt_sandbox_file_t /var/db
现在,将允许写入容器中的/data1卷,并且更改也将反映在主机的/var/db中。
使用替代安全标签
您可以通过指定--security-opt标志来覆盖每个容器的默认标签方案。例如,您可以指定MCS/MLS级别,这是MLS系统的要求。在以下命令中指定级别允许您在容器之间共享相同的内容。
# docker run --security-opt label=level:s0:c100,c200 -i -t fedora bash
一个可能的MLS示例是:
# docker run --security-opt label=level:TopSecret -i -t rhel7 bash
要禁用此容器的安全标签,而不是使用--permissive标志运行,请使用以下命令:
# docker run --security-opt label=disable -i -t fedora bash
如果您希望对容器内的进程实施更严格的安全策略,可以为容器指定替代类型。您可以通过执行以下命令来运行只允许在Apache端口上侦听的容器:
# docker run --security-opt label=type:svirt_apache_t -i -t centos bash
注意:您必须编写定义svirt_apache_t类型的策略。
设置设备权重
如果要将/dev/sda设备权重设置为200,可以通过--blkio-weight-device标志指定设备权重。使用以下命令:
# docker run -it --blkio-weight-device "/dev/sda:200" ubuntu
指定容器的隔离技术(--isolation)
此选项在您在Microsoft Windows上运行Docker容器的情况下非常有用,用--isolation选项来设置容器的隔离技术。在Linux上,唯一支持的是使用Linux命名空间的默认选项。以下两个命令在Linux上是等效的:
$ docker run -d busybox top$ docker run -d --isolation default busybox top
在Microsoft Windows上,可以使用以下任意值:
•default:使用Docker守护进程--exec-opt指定的值。如果守护进程没有指定隔离技术,Microsoft Windows将使用process作为其默认值。
•process:仅命名空间隔离。
•hyperv:基于Hyper-V管理程序分区的隔离。
在实践中,当在没有设置守护程序选项的情况下在Microsoft Windows上运行时,以下两个命令是等效的:
$ docker run -d --isolation default busybox top$ docker run -d --isolation process busybox top
如果你在Docker守护进程上设置了--exec-opt isolation=hyperv选项,那么以下命令中的任何一个都会导致hyperv隔离:
$ docker run -d --isolation default busybox top$ docker run -d --isolation hyperv busybox top
设置命名空间内核参数(Sysctls)
--sysctl在容器中设置命名空间内核参数(sysctls)。例如,要在容器网络命名空间中启用IP转发,请运行以下命令:
$ docker run --sysctl net.ipv4.ip_forward=1 someimage
注意:并非所有内核参数都支持命名空间。Docker不支持在容器内更改sysctls,因为这也会修改主机系统。随着内核的发展,我们希望看到更多的sysctls支持命名空间。
有关当前支持的sysctls列表,请参阅上面--sysctl选项的定义。
***推荐阅读***
运维老司机血泪总结:docker build镜像构建的避坑法则
误以为是外国货?这家国产SD-WAN神器竟能免费白嫖,附Panabit免费版体验全记录
零成本自建企业级SD-WAN!用Panabit手搓iWAN实战
iWAN隧道实测:一次握手跑满2.3Gbps,白嫖的SD-WAN真能吊打专线?
Panabit竟能无缝整合Ubuntu?用5MB升级包在Ubuntu极速安装Panabit
从崩溃到3G带宽!Panabit三种部署模式性能实测,这个坑千万别踩
48核+96GB内存!EVE-NG 6.2低配版安装实录,网络工程师必看!
告别重装!Ubuntu 22.04直升24.04教程,零数据丢失的终极方案
小白也能玩转VPP!Ubuntu 24.04使用APT极速部署VPP
CentOS迁移指南:在Ubuntu上从零编译部署VPP+DPDK,解锁Ubuntu网络性能!
IPv6隧道搭建指南:用WireGuard轻松玩转IPv4/IPv6混合网络
基于IPv6配置openVPN实战:告别双栈难题,一步打通IPv6隧道!
无需公网IPv4!手把手教你配置基于IPv6的WireGuard安全隧道
目前来看,ollama量化过的DeepSeek模型应该就是最具性价比的选择
哪怕用笔记本的4070显卡运行DeepSeek,都要比128核的CPU快得多!