?
This document uses PHP Chinese website manual Release
Docker 在獨(dú)立的容器中運(yùn)行進(jìn)程。容器是一個(gè)在主機(jī)上運(yùn)行的進(jìn)程。主機(jī)可能是本地或遠(yuǎn)程的。當(dāng)運(yùn)營(yíng)商執(zhí)行時(shí)docker run
,運(yùn)行的容器進(jìn)程是獨(dú)立的,因?yàn)樗鼡碛凶约旱奈募到y(tǒng),自己的網(wǎng)絡(luò)以及獨(dú)立于主機(jī)的獨(dú)立進(jìn)程樹。
本頁(yè)詳細(xì)介紹如何使用該docker run
命令在運(yùn)行時(shí)定義容器的資源。
基本docker run
命令采用這種形式:
$ docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
該docker run
命令必須指定一個(gè) IMAGE 以從中派生容器。圖像開發(fā)人員可以定義與以下相關(guān)的圖像默認(rèn)值:
分離或前景運(yùn)行
貨柜識(shí)別
網(wǎng)絡(luò)設(shè)置
CPU和內(nèi)存的運(yùn)行時(shí)間限制
隨著docker run [OPTIONS]
操作者可以添加或覆蓋由開發(fā)者設(shè)置的圖像的默認(rèn)值。此外,運(yùn)算符可以覆蓋 Docker 運(yùn)行時(shí)自身設(shè)置的幾乎所有默認(rèn)值。操作員重寫圖像和 Docker 運(yùn)行時(shí)默認(rèn)值的能力是為什么run比其他docker
命令具有更多選項(xiàng)。
要了解如何解釋類型[OPTIONS]
,請(qǐng)參閱選項(xiàng)類型。
注意:根據(jù)您的 Docker 系統(tǒng)配置,您可能需要使用前面的
docker run
命令sudo
。為了避免必須使用sudo
該docker
命令,系統(tǒng)管理員可以創(chuàng)建一個(gè)名為的 Unix 組docker
并向其添加用戶。有關(guān)此配置的更多信息,請(qǐng)參閱適用于您的操作系統(tǒng)的 Docker 安裝文檔。
只有操作員(執(zhí)行人員docker run
)可以設(shè)置以下選項(xiàng)。
分離與前景
分離(-d)
前景
容器標(biāo)識(shí)
名稱(-name)
PID等值
IPC設(shè)置(-ipc)
網(wǎng)絡(luò)設(shè)置
重新啟動(dòng)策略(-restart)
清理(-rm)
運(yùn)行時(shí)對(duì)資源的限制
運(yùn)行時(shí)權(quán)限和Linux功能
啟動(dòng) Docker 容器時(shí),您必須先決定是否要在后臺(tái)以“分離”模式或默認(rèn)的前臺(tái)模式運(yùn)行容器:
-d=false: Detached mode: Run container in the background, print new container id
要以分離模式啟動(dòng)容器,可以使用-d=true
或僅使用-d
選項(xiàng)。按照設(shè)計(jì),當(dāng)用于運(yùn)行容器的根進(jìn)程退出時(shí),容器以分離模式退出,除非您還指定了該--rm
選項(xiàng)。如果使用-d
帶--rm
,容器,當(dāng)它退出刪除或當(dāng)守護(hù)進(jìn)程退出,先發(fā)生者為準(zhǔn)。
不要將service x start
命令傳遞給分離的容器。例如,該命令嘗試啟動(dòng)該nginx
服務(wù)。
$ docker run -d -p 80:80 my_image service nginx start
這成功地啟動(dòng)nginx
了容器內(nèi)的服務(wù)。然而,它不符合分離的容器范例,因?yàn)楦M(jìn)程(service nginx start
)返回并且分離的容器按設(shè)計(jì)停止。因此,該nginx
服務(wù)已啟動(dòng),但無(wú)法使用。相反,要啟動(dòng)諸如nginx
Web服務(wù)器等進(jìn)程,請(qǐng)執(zhí)行以下操作:
$ docker run -d -p 80:80 my_image nginx -g 'daemon off;'
要使用分離的容器進(jìn)行輸入/輸出,請(qǐng)使用網(wǎng)絡(luò)連接或共享卷。這些都是必需的,因?yàn)槿萜鞑辉俦O(jiān)聽docker run
運(yùn)行的命令行。
要重新附加到分離的容器,請(qǐng)使用docker
attach 命令。
在前臺(tái)模式下(-d
未指定默認(rèn)值時(shí)),docker run
可以在容器中啟動(dòng)進(jìn)程并將控制臺(tái)附加到進(jìn)程的標(biāo)準(zhǔn)輸入,輸出和標(biāo)準(zhǔn)錯(cuò)誤。它甚至可以偽裝成 TTY(這是大多數(shù)命令行可執(zhí)行文件所期望的)并傳遞信號(hào)。所有這些都是可配置的:
-a=[] : Attach to `STDIN`, `STDOUT` and/or `STDERR` -t : Allocate a pseudo-tty --sig-proxy=true: Proxy all received signals to the process (non-TTY mode only) -i : Keep STDIN open even if not attached
如果你沒有指定,-a
那么 Docker 將連接到stdout和stderr。您可以指定其中三個(gè)標(biāo)準(zhǔn)流(STDIN
,STDOUT
,STDERR
)你想,而不是連接,如:
$ docker run -a stdin -a stdout -i -t ubuntu /bin/bash
對(duì)于交互式進(jìn)程(如shell),必須-i -t
一起使用才能為容器進(jìn)程分配tty。-i -t
通常-it
會(huì)按照后面的示例中的描述進(jìn)行編寫。-t
當(dāng)客戶端從管道接收其標(biāo)準(zhǔn)輸入時(shí),禁止指定,如下所示:
$ echo test | docker run -i busybox cat
注意:在容器中作為PID 1運(yùn)行的進(jìn)程會(huì)被Linux專門處理:它將忽略具有默認(rèn)操作的任何信號(hào)。因此,該過程將不會(huì)終止
SIGINT
或者SIGTERM
除非它被編寫這樣做。
操作員可以通過三種方式識(shí)別容器:
識(shí)別類型 | 示例值 |
---|---|
UUID長(zhǎng)標(biāo)識(shí)符 | “F78375b1c487e03c9438c729345e54db9d20cfa2ac1fc3494b6eb60872e74778” |
UUID短標(biāo)識(shí)符 | “F78375b1c487” |
Name | “evil_ptolemy” |
UUID 標(biāo)識(shí)符來(lái)自 Docker 守護(hù)進(jìn)程。如果您沒有為該--name
選項(xiàng)分配容器名稱,則該守護(hù)程序會(huì)為您生成一個(gè)隨機(jī)字符串名稱。定義一個(gè)name
可以方便地為容器添加含義。如果您指定了一個(gè)name
,則可以在 Docker 網(wǎng)絡(luò)中引用容器時(shí)使用它。這適用于后臺(tái)和前臺(tái) Docker 容器。
注意:默認(rèn)網(wǎng)橋網(wǎng)絡(luò)上的容器必須鏈接以通過名稱進(jìn)行通信。
最后,為了幫助實(shí)現(xiàn)自動(dòng)化,您可以讓 Docker 將容器 ID 寫出到您選擇的文件中。這與某些程序可能會(huì)將其進(jìn)程 ID 寫入文件(您已將其視為 PID 文件)類似:
--cidfile="": Write the container ID to the file
雖然不是嚴(yán)格意義上的容器識(shí)別方法,但您可以通過添加image[:tag]
到命令中來(lái)指定要運(yùn)行容器的圖像版本。例如,docker run ubuntu:14.04
。
使用v2或更高版本的圖像格式的圖像具有稱為摘要的內(nèi)容可尋址標(biāo)識(shí)符。只要用于生成圖像的輸入保持不變,摘要值是可預(yù)測(cè)和可引用的。
以下示例從包含摘要的alpine
映像運(yùn)行容器sha256:9cacb71397b640eca97488cf08582ae4e4068513101088e9f96c9814bfda95e0
:
$ docker run alpine@sha256:9cacb71397b640eca97488cf08582ae4e4068513101088e9f96c9814bfda95e0 date
--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
默認(rèn)情況下,所有容器都啟用了 PID 名稱空間。
PID 名稱空間提供了進(jìn)程的分離。PID 名稱空間刪除系統(tǒng)進(jìn)程的視圖,并允許重新使用進(jìn)程 ID,包括 PID 1。
在某些情況下,您希望容器共享主機(jī)的進(jìn)程名稱空間,基本上允許容器中的進(jìn)程查看系統(tǒng)上的所有進(jìn)程。例如,你可以建立與調(diào)試工具等的容器strace
或gdb
,但要在容器內(nèi)調(diào)試過程時(shí)使用這些工具。
創(chuàng)建這個(gè) Dockerfile:
FROM alpine:latest RUN apk add --update htop && rm -rf /var/cache/apk/* CMD ["htop"]
構(gòu)建 Dockerfile 并將圖像標(biāo)記為myhtop
:
$ docker build -t myhtop .
使用以下命令htop
在容器內(nèi)運(yùn)行:
$ docker run -it --rm --pid=host myhtop
加入另一個(gè)容器的 pid 名稱空間可用于調(diào)試該容器。
啟動(dòng)運(yùn)行 redis 服務(wù)器的容器:
$ docker run --name my-redis -d redis
通過運(yùn)行另一個(gè)容器來(lái)調(diào)試 redis 容器:
$ docker run -it --pid=container:my-redis my_strace_docker_image bash $ strace -p 1
--uts="" : Set the UTS namespace mode for the container, 'host': use the host's UTS namespace inside the container
UTS 命名空間用于設(shè)置在該命名空間中運(yùn)行進(jìn)程可見的主機(jī)名和域。默認(rèn)情況下,所有容器(包括那些容器)--network=host
都有自己的 UTS 名稱空間。該host
設(shè)置將導(dǎo)致容器使用與主機(jī)相同的 UTS 名稱空間。請(qǐng)注意,--hostname
在host
UTS 模式下無(wú)效。
如果您希望容器的主機(jī)名隨著主機(jī)的主機(jī)名更改而更改,您可能希望與主機(jī)共享 UTS 名稱空間。更高級(jí)的用例將從容器中更改主機(jī)的主機(jī)名。
--ipc="" : Set the IPC mode for the container, 'container:<name|id>': reuses another container's IPC namespace 'host': use the host's IPC namespace inside the container
默認(rèn)情況下,所有容器都啟用了 IPC 命名空間。
IPC(POSIX / SysV IPC)命名空間提供命名共享內(nèi)存段,信號(hào)量和消息隊(duì)列的分離。
共享內(nèi)存段用于以內(nèi)存速度加速進(jìn)程間通信,而不是通過管道或通過網(wǎng)絡(luò)堆棧。共享內(nèi)存通常由數(shù)據(jù)庫(kù)和定制(通常為C / OpenMPI,C ++ /使用boost庫(kù))用于科學(xué)計(jì)算和金融服務(wù)行業(yè)的高性能應(yīng)用程序使用。如果這些類型的應(yīng)用程序分成多個(gè)容器,則可能需要共享容器的IPC機(jī)制。
--dns=[] : Set custom dns servers for the container--network="bridge" : Connect a container to a network 'bridge': create a network stack on the default Docker bridge 'none': no networking 'container:<name|id>': reuse another container's network stack 'host': use the Docker host network stack '<network-name>|<network-id>': connect to a user-defined network--network-alias=[] : Add network-scoped alias for the container--add-host="" : Add a line to /etc/hosts (host:IP)--mac-address="" : Sets the container's Ethernet device's MAC address--ip="" : Sets the container's Ethernet device's IPv4 address--ip6="" : Sets the container's Ethernet device's IPv6 address--link-local-ip=[] : Sets one or more container's Ethernet device's link local IPv4/IPv6 addresses
默認(rèn)情況下,所有容器都已啟用網(wǎng)絡(luò)連接,并且可以進(jìn)行任何傳出連接。運(yùn)營(yíng)商可以完全禁用網(wǎng)絡(luò)docker run --network none
,禁用所有進(jìn)入和離開的網(wǎng)絡(luò)。在這樣的情況下,你將I / O通過文件或執(zhí)行STDIN
和STDOUT
只。
發(fā)布端口和鏈接到其他容器只能使用默認(rèn)(橋接)。鏈接功能是一項(xiàng)傳統(tǒng)功能。您應(yīng)該始終更喜歡使用 Docker 網(wǎng)絡(luò)驅(qū)動(dòng)程序進(jìn)行鏈接。
默認(rèn)情況下,您的容器將使用與主機(jī)相同的 DNS 服務(wù)器,但您可以使用它覆蓋此容器--dns
。
默認(rèn)情況下,使用分配給容器的IP地址生成 MAC 地址。您可以通過--mac-address
參數(shù)(format 12:34:56:78:9a:bc
:)提供MAC地址來(lái)明確設(shè)置容器的MAC地址。請(qǐng)注意,Docker不會(huì)檢查手動(dòng)指定的MAC地址是否唯一。
支持的網(wǎng)絡(luò):
網(wǎng)絡(luò) | 描述 |
---|---|
沒有 | 容器中沒有網(wǎng)絡(luò)。 |
橋(默認(rèn)) | 通過veth接口將容器連接到橋。 |
主辦 | 在容器內(nèi)使用主機(jī)的網(wǎng)絡(luò)堆棧。 |
容器:<名稱| ID> | 使用另一個(gè)容器的網(wǎng)絡(luò)堆棧,通過其名稱或ID指定。 |
網(wǎng)絡(luò) | 將容器連接到用戶創(chuàng)建的網(wǎng)絡(luò)(使用docker network create命令) |
與網(wǎng)絡(luò)是none
一個(gè)容器將不能訪問任何外部路由。該容器仍然loopback
在容器中啟用了一個(gè)接口,但它沒有任何到外部流量的路由。
將網(wǎng)絡(luò)設(shè)置為bridge
容器將使用docker的默認(rèn)網(wǎng)絡(luò)設(shè)置。在主機(jī)上設(shè)置docker0
一個(gè)通常命名的網(wǎng)橋,并veth
為該容器創(chuàng)建一對(duì)接口。該veth
對(duì)中的一側(cè)將保留在連接到橋的主機(jī)上,而另一側(cè)將放置在容器的命名空間內(nèi),除了該loopback
界面。一個(gè)IP地址將被分配給橋接網(wǎng)絡(luò)上的容器,流量將通過該橋接路由到容器。
容器默認(rèn)通過 IP 地址進(jìn)行通信。要通過名稱進(jìn)行交流,他們必須聯(lián)系起來(lái)。
將網(wǎng)絡(luò)設(shè)置為host
容器將共享主機(jī)的網(wǎng)絡(luò)堆棧,并且主機(jī)的所有接口都可用于容器。容器的主機(jī)名將與主機(jī)系統(tǒng)上的主機(jī)名匹配。請(qǐng)注意,--mac-address
在host
netmode中無(wú)效。即使在host
網(wǎng)絡(luò)模式下,默認(rèn)情況下容器也有自己的UTS命名空間。因?yàn)檫@--hostname
是在host
網(wǎng)絡(luò)模式下允許的,并且只會(huì)改變?nèi)萜鲀?nèi)的主機(jī)名。類似--hostname
的--add-host
,--dns
,--dns-search
,和--dns-option
選項(xiàng)可以用在host
網(wǎng)絡(luò)模式。這些選項(xiàng)更新/etc/hosts
或/etc/resolv.conf
在容器內(nèi)部。沒有變化的,以制作/etc/hosts
,并/etc/resolv.conf
在主機(jī)上。
與默認(rèn)bridge
模式相比,該host
模式顯著提高了網(wǎng)絡(luò)性能,因?yàn)樗褂弥鳈C(jī)的本地網(wǎng)絡(luò)堆棧,而網(wǎng)橋必須通過 docker 守護(hù)進(jìn)程通過一級(jí)虛擬化。建議在網(wǎng)絡(luò)性能至關(guān)重要的情況下以此模式運(yùn)行容器,例如生產(chǎn)負(fù)載平衡器或高性能 Web 服務(wù)器。
注意:
--network="host"
給容器充分訪問本地系統(tǒng)服務(wù),如 D-bus,因此被認(rèn)為是不安全的。
將網(wǎng)絡(luò)設(shè)置為container
一個(gè)容器將共享另一個(gè)容器的網(wǎng)絡(luò)堆棧。另一個(gè)容器的名稱必須以格式提供--network container:<name|id>
。請(qǐng)注意,--add-host
--hostname
--dns
--dns-search
--dns-option
并且--mac-address
在container
netmode 中無(wú)效,并且在netmode --publish
--publish-all
--expose
中也無(wú)效container
。
示例使用 Redis 綁定運(yùn)行 Redis 容器,localhost
然后運(yùn)行該redis-cli
命令并通過localhost
接口連接到 Redis 服務(wù)器。
$ docker run -d --name redis example/redis --bind 127.0.0.1$ # use the redis container's network stack to access localhost $ docker run --rm -it --network container:redis example/redis-cli -h 127.0.0.1
您可以使用 Docker 網(wǎng)絡(luò)驅(qū)動(dòng)程序或外部網(wǎng)絡(luò)驅(qū)動(dòng)程序插件來(lái)創(chuàng)建網(wǎng)絡(luò)。您可以將多個(gè)容器連接到同一個(gè)網(wǎng)絡(luò)。一旦連接到用戶定義的網(wǎng)絡(luò),容器就可以很容易地使用另一個(gè)容器的 IP 地址或名稱進(jìn)行通信。
對(duì)于overlay
支持多主機(jī)連接的網(wǎng)絡(luò)或自定義插件,連接到相同多主機(jī)網(wǎng)絡(luò)但從不同引擎啟動(dòng)的容器也可以通過這種方式進(jìn)行通信。
以下示例使用內(nèi)置bridge
網(wǎng)絡(luò)驅(qū)動(dòng)程序創(chuàng)建網(wǎng)絡(luò),并在創(chuàng)建的網(wǎng)絡(luò)中運(yùn)行容器
$ docker network create -d bridge my-net $ docker run --network=my-net -itd --name=container3 busybox
您的容器將具有/etc/hosts
定義容器本身的主機(jī)名以及localhost
其他一些常見事物的行。該--add-host
標(biāo)志可用于添加更多行/etc/hosts
。
$ docker run -it --add-host db-static:86.75.30.9 ubuntu cat /etc/hosts172.17.0.22 09d03f76bf2c fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters127.0.0.1 localhost::1 localhost ip6-localhost ip6-loopback86.75.30.9 db-static
如果容器連接到默認(rèn)橋接網(wǎng)絡(luò)和linked
其他容器,則/etc/hosts
使用鏈接容器的名稱更新容器的文件。
注意由于 Docker 可能實(shí)時(shí)更新容器的
/etc/hosts
文件,因此容器中的進(jìn)程最終可能會(huì)讀取空的或不完整的/etc/hosts
文件。在大多數(shù)情況下,再次重試讀取應(yīng)解決問題。
--restart
在Docker運(yùn)行中使用標(biāo)志,您可以指定一個(gè)重啟策略,以便在退出時(shí)應(yīng)該或不應(yīng)該重啟容器。
當(dāng)重新啟動(dòng)策略是活性的容器上,它將被顯示為任一Up
或Restarting
在docker ps
。使用docker events
查看重啟策略的效果也很有用。
Docker支持以下重啟策略:
政策 | 結(jié)果 |
---|---|
沒有 | 退出時(shí)不要自動(dòng)重啟容器。這是默認(rèn)設(shè)置。 |
對(duì)故障:最大重試 | 僅在容器以非零退出狀態(tài)退出時(shí)才能重新啟動(dòng)?;蛘撸拗艱ocker守護(hù)程序嘗試重新啟動(dòng)的次數(shù)。 |
總是 | 不管退出狀態(tài)如何,始終重新啟動(dòng)容器。當(dāng)你總是指定時(shí),Docker守護(hù)進(jìn)程將嘗試無(wú)限期地重啟容器。無(wú)論容器的當(dāng)前狀態(tài)如何,容器也將始終在守護(hù)進(jìn)程啟動(dòng)時(shí)啟動(dòng)。 |
除非,停止 | 無(wú)論退出狀態(tài)如何,始終重新啟動(dòng)容器,但如果容器之前已處于停止?fàn)顟B(tài),則不要在守護(hù)進(jìn)程啟動(dòng)時(shí)啟動(dòng)它。 |
在每次重新啟動(dòng)前添加一個(gè)不斷增加的延遲(前一延遲的兩倍,從100毫秒開始),以防止服務(wù)器泛濫。這意味著守護(hù)進(jìn)程將等待100毫秒,然后等待200毫秒,400,800,1600等,直到on-failure
命中限制或者您docker stop
或docker rm -f
容器。
如果容器重新啟動(dòng)成功(容器啟動(dòng)并運(yùn)行至少10秒鐘),延遲將重置為默認(rèn)值100 ms。
您可以指定 Docker 在使用故障策略時(shí)嘗試重新啟動(dòng)容器的最大次數(shù)。默認(rèn)情況下,Docker 將永遠(yuǎn)嘗試重新啟動(dòng)容器??梢酝ㄟ^以下方式獲取容器(嘗試)重新啟動(dòng)的次數(shù)docker inspect
。例如,要獲取容器“my-container”的重新啟動(dòng)次數(shù);
$ docker inspect -f "{{ .RestartCount }}" my-container # 2
或者,為了獲得最后一次容器(重新)啟動(dòng);
$ docker inspect -f "{{ .State.StartedAt }}" my-container # 2015-03-04T23:47:07.691840179Z
將--restart
(重新啟動(dòng)策略)與--rm
(清除)標(biāo)志組合會(huì)導(dǎo)致錯(cuò)誤。在容器重啟時(shí),連接的客戶端被斷開連接 請(qǐng)參閱--rm
本頁(yè)后面使用(清理)標(biāo)志的示例。
$ docker run --restart=always redis
這將運(yùn)行redis
一個(gè)始終重啟策略的容器,這樣如果容器退出,Docker 將重新啟動(dòng)它。
$ docker run --restart=on-failure:10 redis
這將運(yùn)行redis
容器,其重啟策略為on-failure,最大重啟次數(shù)為10.如果redis
容器以非零退出狀態(tài)在一行中退出10次以上,Docker 將中止嘗試重新啟動(dòng)容器。提供最大重新啟動(dòng)限制僅適用于故障策略。
退出碼docker run
提供了有關(guān)容器無(wú)法運(yùn)行或?yàn)楹瓮顺龅男畔?。?dāng)docker run
退出時(shí)非零碼時(shí),退出代碼遵循chroot
標(biāo)準(zhǔn),見下文:
如果錯(cuò)誤是 Docker 守護(hù)進(jìn)程本身,則為 125
$ docker run --foo busybox; echo $?# flag provided but not defined: --foo See 'docker run --help'. 125
126 如果 包含的命令不能被調(diào)用
$ docker run busybox /etc; echo $?# docker: Error response from daemon: Container command '/etc' could not be invoked. 126
127 如果 包含的命令不能被找到
$ docker run busybox foo; echo $?# docker: Error response from daemon: Container command 'foo' not found or does not exist. 127
退出代碼 的 包含命令否則
$ docker run busybox /bin/sh -c 'exit 3'; echo $?# 3
即使在容器退出后,默認(rèn)情況下容器的文件系統(tǒng)仍然存在。這使調(diào)試更容易(因?yàn)槟梢詸z查最終狀態(tài)),并且默認(rèn)情況下保留所有數(shù)據(jù)。但是如果你正在運(yùn)行短期的 前臺(tái) 進(jìn)程,這些容器文件系統(tǒng)可能真的堆積如山。相反,如果您希望Docker 在容器退出時(shí)自動(dòng)清理容器并移除文件系統(tǒng),則可以添加該--rm
標(biāo)志:
--rm=false: Automatically remove the container when it exits (incompatible with -d)
注意:設(shè)置
--rm
標(biāo)志時(shí),當(dāng)容器被移除時(shí),Docker 也會(huì)刪除與容器關(guān)聯(lián)的卷。這與運(yùn)行相似docker rm -v my-container
。只有未指定名稱的卷才會(huì)被刪除。例如,與docker run --rm -v /foo -v awesome:/bar busybox top
,音量/foo
將被刪除,但音量/bar
不會(huì)。通過--volumes-from
相同的邏輯將繼承的卷將被刪除 - 如果原始卷指定了名稱,則不會(huì)被刪除。
--security-opt="label=user:USER" : Set the label user for the container--security-opt="label=role:ROLE" : Set the label role for the container--security-opt="label=type:TYPE" : Set the label type for the container--security-opt="label=level:LEVEL" : Set the label level for the container--security-opt="label=disable" : Turn off label confinement for the container--security-opt="apparmor=PROFILE" : Set the apparmor profile to be applied to the container--security-opt="no-new-privileges:true|false" : Disable/enable container processes from gaining new privileges--security-opt="seccomp=unconfined" : Turn off seccomp confinement for the container--security-opt="seccomp=profile.json": White listed syscalls seccomp Json file to be used as a seccomp filter
您可以通過指定--security-opt
標(biāo)志來(lái)覆蓋每個(gè)容器的默認(rèn)標(biāo)簽方案。在以下命令中指定級(jí)別允許您在容器之間共享相同的內(nèi)容。
$ docker run --security-opt label=level:s0:c100,c200 -it fedora bash
注意:目前不支持自動(dòng)翻譯MLS標(biāo)簽。
要禁用此容器的安全標(biāo)簽而不是使用該--privileged
標(biāo)志運(yùn)行,請(qǐng)使用以下命令:
$ docker run --security-opt label=disable -it fedora bash
如果您希望容器中的進(jìn)程采用更嚴(yán)格的安全策略,則可以為容器指定備用類型。您可以通過執(zhí)行以下命令來(lái)運(yùn)行只允許在Apache端口上偵聽的容器:
$ docker run --security-opt label=type:svirt_apache_t -it centos bash
注意:您必須編寫定義
svirt_apache_t
類型的策略。
如果你想阻止你的容器進(jìn)程獲得額外的權(quán)限,你可以執(zhí)行下面的命令:
$ docker run --security-opt no-new-privileges -it centos bash
這意味著提升諸如su
或者sudo
將不再起作用的特權(quán)的命令。它還會(huì)導(dǎo)致任何 seccomp 過濾器稍后應(yīng)用,權(quán)限被刪除后,這可能意味著您可以擁有更多限制性的過濾器集。有關(guān)更多詳細(xì)信息,請(qǐng)參閱內(nèi)核文檔。
您可以使用該--init
標(biāo)志來(lái)指示 init 過程應(yīng)該用作容器中的 PID 1。指定init進(jìn)程可確保在創(chuàng)建的容器內(nèi)執(zhí)行init系統(tǒng)的常規(guī)職責(zé)(如收割僵尸進(jìn)程)。
使用的默認(rèn) init 進(jìn)程是docker-init
在 Docker 守護(hù)進(jìn)程的系統(tǒng)路徑中找到的第一個(gè)可執(zhí)行文件。docker-init
包含在默認(rèn)安裝中的這個(gè)二進(jìn)制文件由tini提供支持。
使用該--cgroup-parent
標(biāo)志,您可以傳遞特定的 cgroup 來(lái)運(yùn)行容器。這允許您自行創(chuàng)建和管理 cgroup。您可以為這些 cgroup 定義自定義資源,并將容器放在公共父組下。
操作員還可以調(diào)整容器的性能參數(shù):
選項(xiàng) | 描述 |
---|---|
-m,--memory =“” | 內(nèi)存限制(格式:<數(shù)字> <單位>)。數(shù)字是一個(gè)正整數(shù)。單位可以是b,k,m或g中的一個(gè)。最低為4M。 |
--memory交換=“” | 內(nèi)存總量限制(內(nèi)存+交換,格式:<編號(hào)> <單位>)。數(shù)字是一個(gè)正整數(shù)。單位可以是b,k,m或g中的一個(gè)。 |
--memory預(yù)約=“” | 內(nèi)存軟限制(格式:<編號(hào)> <單位>)。數(shù)字是一個(gè)正整數(shù)。單位可以是b,k,m或g中的一個(gè)。 |
--kernel內(nèi)存=“” | 內(nèi)核內(nèi)存限制(格式:<數(shù)字> <單位>)。數(shù)字是一個(gè)正整數(shù)。單位可以是b,k,m或g中的一個(gè)。最低為4M。 |
-c,--cpu-shares = 0 | CPU份額(相對(duì)重量) |
--cpus = 0.000 | CPU數(shù)量。數(shù)字是一個(gè)小數(shù)。0.000表示沒有限制。 |
--cpu周期= 0 | 限制CPU CFS(完全公平調(diào)度程序)期限 |
--cpuset-的CPU = “” | 允許執(zhí)行的CPU(0-3,0,1) |
--cpuset-MEMS = “” | 在其中允許執(zhí)行的內(nèi)存節(jié)點(diǎn)(MEM)(0-3,0,1)。只對(duì)NUMA系統(tǒng)有效。 |
--cpu配額= 0 | 限制CPU CFS(完全公平調(diào)度程序)配額 |
--cpu-RT-周期= 0 | 限制CPU實(shí)時(shí)期限。以微秒為單位。需要設(shè)置父cgroups并且不能高于父級(jí)。另請(qǐng)檢查rtprio ulimits。 |
--cpu-RT-運(yùn)行時(shí)間= 0 | 限制CPU實(shí)時(shí)運(yùn)行時(shí)間。以微秒為單位。需要設(shè)置父cgroups并且不能高于父級(jí)。另請(qǐng)檢查rtprio ulimits。 |
--blkio重量= 0 | 塊IO權(quán)重(相對(duì)權(quán)重)接受介于10和1000之間的權(quán)重值。 |
--blkio-重設(shè)備= “” | 阻止IO權(quán)重(相對(duì)設(shè)備權(quán)重,格式:DEVICE_NAME:WEIGHT) |
--device讀-BPS = “” | 限制設(shè)備的讀取速率(格式:<設(shè)備路徑>:<編號(hào)> <單元>)。數(shù)字是一個(gè)正整數(shù)。單位可以是kb,mb或gb中的一個(gè)。 |
--device - 寫 - BPS =“” | 限制寫入速率到設(shè)備(格式:<device-path>:<number> <unit>)。數(shù)字是一個(gè)正整數(shù)。單位可以是kb,mb或gb中的一個(gè)。 |
--device讀-IOPS = “” | 限制來(lái)自設(shè)備的讀取速率(每秒IO)(格式:<device-path>:<number>)。數(shù)字是一個(gè)正整數(shù)。 |
--device - 寫 - IOPS =“” | 限制寫入速率(每秒IO)到設(shè)備(格式:<device-path>:<number>)。數(shù)字是一個(gè)正整數(shù)。 |
--oom殺-禁用=假 | 是否禁用容器的OOM殺手。 |
--oom分?jǐn)?shù)ADJ = 0 | 調(diào)整容器的OOM首選項(xiàng)(-1000到1000) |
--memory-swappiness = “” | 調(diào)整容器的內(nèi)存swappiness行為。接受0到100之間的整數(shù)。 |
--shm尺寸=“” | / dev / shm的大小。格式是<編號(hào)> <單位>。數(shù)字必須大于0.單位是可選的,可以是b(字節(jié)),k(千字節(jié)),m(兆字節(jié))或g(千兆字節(jié))。如果您省略了單位,系統(tǒng)會(huì)使用字節(jié)。如果完全忽略尺寸,則系統(tǒng)使用64米。 |
我們有四種方法來(lái)設(shè)置用戶內(nèi)存使用情況:
選項(xiàng) | 結(jié)果 |
---|---|
memory = inf,memory-swap = inf(默認(rèn)) | 容器沒有內(nèi)存限制。容器可以根據(jù)需要使用盡可能多的內(nèi)存。 |
內(nèi)存= L <inf,內(nèi)存交換= inf | (指定內(nèi)存并將內(nèi)存交換設(shè)置為-1)容器不允許使用多于L字節(jié)的內(nèi)存,但可以根據(jù)需要使用盡可能多的交換(如果主機(jī)支持交換內(nèi)存)。 |
內(nèi)存= L <inf,內(nèi)存交換= 2 * L | (指定沒有內(nèi)存交換的內(nèi)存)容器不允許使用超過L字節(jié)的內(nèi)存,swap和內(nèi)存使用率是其中的兩倍。 |
內(nèi)存= L <inf,內(nèi)存交換= S <inf,L <= S | (指定內(nèi)存和內(nèi)存交換)容器不允許使用多于L字節(jié)的內(nèi)存,交換加內(nèi)存使用受S限制。 |
例子:
$ docker run -it ubuntu:14.04 /bin/bash
我們沒有設(shè)置內(nèi)存,這意味著容器中的進(jìn)程可以根據(jù)需要使用盡可能多的內(nèi)存和交換內(nèi)存。
$ docker run -it -m 300M --memory-swap -1 ubuntu:14.04 /bin/bash
我們?cè)O(shè)置內(nèi)存限制和禁用交換內(nèi)存限制,這意味著容器中的進(jìn)程可以使用300M內(nèi)存和盡可能多的交換內(nèi)存(如果主機(jī)支持交換內(nèi)存)。
$ docker run -it -m 300M ubuntu:14.04 /bin/bash
我們只設(shè)置內(nèi)存限制,這意味著容器中的進(jìn)程可以使用300M內(nèi)存和300M交換內(nèi)存,默認(rèn)情況下,總虛擬內(nèi)存大?。?memory-swap)將被設(shè)置為內(nèi)存的兩倍,在這種情況下,內(nèi)存+ swap 會(huì)是2 * 300M,所以進(jìn)程也可以使用300M交換內(nèi)存。
$ docker run -it -m 300M --memory-swap 1G ubuntu:14.04 /bin/bash
我們?cè)O(shè)置了內(nèi)存和交換內(nèi)存,因此容器中的進(jìn)程可以使用 300M 內(nèi)存和 700M 交換內(nèi)存。
內(nèi)存預(yù)留是一種內(nèi)存軟限制,允許更大的內(nèi)存共享。在正常情況下,容器可以根據(jù)需要使用盡可能多的內(nèi)存,并且僅受限于使用-m
/ --memory
選項(xiàng)設(shè)置的硬限制。當(dāng)設(shè)置了內(nèi)存預(yù)留時(shí),Docker 會(huì)檢測(cè)內(nèi)存爭(zhēng)用或內(nèi)存不足,并強(qiáng)制容器將其消耗限制在預(yù)留限制內(nèi)。
始終將內(nèi)存預(yù)留值設(shè)置為低于硬限制,否則硬限制優(yōu)先。保留0與設(shè)置不保留相同。默認(rèn)情況下(沒有預(yù)留設(shè)置),內(nèi)存預(yù)留與硬內(nèi)存限制相同。
內(nèi)存預(yù)留是一項(xiàng)軟限制功能,并不保證不會(huì)超出限制。相反,該功能會(huì)嘗試確保在內(nèi)存嚴(yán)重競(jìng)爭(zhēng)時(shí)基于預(yù)留提示/設(shè)置分配內(nèi)存。
以下示例將內(nèi)存(-m
)限制為 500M,并將內(nèi)存預(yù)留設(shè)置為 200M。
$ docker run -it -m 500M --memory-reservation 200M ubuntu:14.04 /bin/bash
在此配置下,當(dāng)容器消耗的內(nèi)存超過200M且小于500M時(shí),下一次系統(tǒng)內(nèi)存回收嘗試將容器內(nèi)存縮小到200M以下。
以下示例將內(nèi)存預(yù)留設(shè)置為1G,但沒有硬內(nèi)存限制。
$ docker run -it --memory-reservation 1G ubuntu:14.04 /bin/bash
容器可以根據(jù)需要使用盡可能多的內(nèi)存。內(nèi)存預(yù)留設(shè)置可確保容器不會(huì)消耗太多內(nèi)存很長(zhǎng)時(shí)間,因?yàn)槊總€(gè)內(nèi)存回收都會(huì)將容器的消耗量縮減到預(yù)留量。
默認(rèn)情況下,如果發(fā)生內(nèi)存不足(OOM)錯(cuò)誤,內(nèi)核會(huì)殺死容器中的進(jìn)程。要更改此行為,請(qǐng)使用該--oom-kill-disable
選項(xiàng)。只有在您還設(shè)置-m/--memory
選項(xiàng)的容器上禁用 OOM 殺手。如果-m
未設(shè)置標(biāo)志,則可能導(dǎo)致主機(jī)內(nèi)存不足,并且需要?dú)⑺乐鳈C(jī)的系統(tǒng)進(jìn)程以釋放內(nèi)存。
以下示例將內(nèi)存限制為100M,并禁用此容器的 OOM 殺手:
$ docker run -it -m 100M --oom-kill-disable ubuntu:14.04 /bin/bash
以下示例說(shuō)明了使用該標(biāo)志的危險(xiǎn)方法:
$ docker run -it --oom-kill-disable ubuntu:14.04 /bin/bash
該容器具有無(wú)限制的內(nèi)存,這可能導(dǎo)致主機(jī)耗盡內(nèi)存并需要查殺系統(tǒng)進(jìn)程以釋放內(nèi)存。該--oom-score-adj
參數(shù)是可以改變的選擇優(yōu)先權(quán),容器就會(huì)被殺死,當(dāng)系統(tǒng)內(nèi)存不足,負(fù)得分使他們不太可能被殺害,并積極分?jǐn)?shù)的可能性較大。
內(nèi)核內(nèi)存與用戶內(nèi)存根本不同,因?yàn)閮?nèi)核內(nèi)存不能被換出。無(wú)法進(jìn)行交換使得容器可能通過消耗太多內(nèi)核內(nèi)存來(lái)阻塞系統(tǒng)服務(wù)。內(nèi)核內(nèi)存包括:
堆疊頁(yè)面
平板頁(yè)面
插座內(nèi)存壓力
tcp 內(nèi)存壓力
您可以設(shè)置內(nèi)核內(nèi)存限制來(lái)限制這些內(nèi)存。例如,每個(gè)進(jìn)程都會(huì)消耗一些堆棧頁(yè)面。通過限制內(nèi)核內(nèi)存,可以防止在內(nèi)核內(nèi)存使用率過高時(shí)創(chuàng)建新進(jìn)程。
內(nèi)核內(nèi)存永遠(yuǎn)不會(huì)完全獨(dú)立于用戶內(nèi)存。相反,您在用戶內(nèi)存限制的上下文中限制內(nèi)核內(nèi)存。假設(shè)“U”是用戶內(nèi)存限制,“K”是內(nèi)核限制。有三種可能的方式來(lái)設(shè)置限制:
選項(xiàng) | 結(jié)果 |
---|---|
U!= 0,K = inf(默認(rèn)) | 這是使用內(nèi)核內(nèi)存之前已經(jīng)存在的標(biāo)準(zhǔn)內(nèi)存限制機(jī)制。內(nèi)核內(nèi)存被完全忽略。 |
U!= 0,K <U | 內(nèi)核內(nèi)存是用戶內(nèi)存的一個(gè)子集。這種設(shè)置在每個(gè)cgroup的總內(nèi)存數(shù)量過量的部署中非常有用。絕對(duì)不推薦過度使用內(nèi)核內(nèi)存限制,因?yàn)樵摲娇蛉钥赡芎谋M不可回收的內(nèi)存。在這種情況下,您可以配置K,使所有組的總和永遠(yuǎn)不會(huì)大于總內(nèi)存。然后,以系統(tǒng)服務(wù)質(zhì)量為代價(jià)自由設(shè)置U. |
U!= 0,K> U | 由于內(nèi)核內(nèi)存電荷也被饋送到用戶計(jì)數(shù)器,并且為這兩種內(nèi)存的容器觸發(fā)回收。這種配置為管理員提供了統(tǒng)一的內(nèi)存視圖。對(duì)于只想跟蹤內(nèi)核內(nèi)存使用情況的人也很有用。 |
例子:
$ docker run -it -m 500M --kernel-memory 50M ubuntu:14.04 /bin/bash
我們?cè)O(shè)置內(nèi)存和內(nèi)核內(nèi)存,所以容器中的進(jìn)程總共可以使用500M內(nèi)存,在這個(gè)500M內(nèi)存中,它可以是50M內(nèi)核內(nèi)存。
$ docker run -it --kernel-memory 50M ubuntu:14.04 /bin/bash
我們?cè)诓皇褂?strong>-m的情況下設(shè)置內(nèi)核內(nèi)存,因此容器中的進(jìn)程可以使用盡可能多的內(nèi)存,但它們只能使用50M內(nèi)核內(nèi)存。
默認(rèn)情況下,容器的內(nèi)核可以換出一定比例的匿名頁(yè)面。要為容器設(shè)置此百分比,請(qǐng)指定--memory-swappiness
介于0和100之間的值。值為0將關(guān)閉匿名頁(yè)面交換。值為100將所有匿名頁(yè)面設(shè)置為可交換。默認(rèn)情況下,如果你不使用--memory-swappiness
,內(nèi)存swappiness值將從父項(xiàng)繼承。
例如,您可以設(shè)置:
$ docker run -it --memory-swappiness=0 ubuntu:14.04 /bin/bash
如果--memory-swappiness
要保留容器的工作集并避免交換性能處罰,設(shè)置該選項(xiàng)很有用。
默認(rèn)情況下,所有容器都獲得相同比例的CPU周期。通過相對(duì)于所有其他正在運(yùn)行的容器的權(quán)重更改容器的CPU份額權(quán)重,可以修改此比例。
要從默認(rèn)值1024修改比例,請(qǐng)使用-c
或--cpu-shares
標(biāo)志將權(quán)重設(shè)置為2或更高。如果設(shè)置為0,系統(tǒng)將忽略該值并使用默認(rèn)值1024。
該比例僅適用于 CPU 密集型進(jìn)程正在運(yùn)行時(shí)。當(dāng)一個(gè)容器中的任務(wù)空閑時(shí),其他容器可以使用剩余的 CPU 時(shí)間。實(shí)際的 CPU 時(shí)間量取決于系統(tǒng)上運(yùn)行的容器數(shù)量。
例如,考慮三個(gè)容器,一個(gè) cpu-share 為1024,另外兩個(gè) cpu-share 設(shè)置為512.當(dāng)所有三個(gè)容器中的進(jìn)程嘗試使用100%的 CPU 時(shí),第一個(gè)容器將獲得50%的 CPU 總 CPU 時(shí)間。如果添加一個(gè) cpu-share 為1024的第四個(gè)容器,則第一個(gè)容器只能獲得33%的 CPU。剩下的容器獲得 CPU 的16.5%,16.5%和33%。
在多核系統(tǒng)上,CPU 時(shí)間份額分布在所有 CPU 核心上。即使容器的CPU時(shí)間限制在100%以內(nèi),它也可以使用每個(gè) CPU 內(nèi)核的100%。
例如,考慮一個(gè)具有三個(gè)以上內(nèi)核的系統(tǒng)。如果你開始一個(gè)容器{C0}
與-c=512
運(yùn)行的一個(gè)過程,而另一個(gè)容器{C1}
與-c=1024
運(yùn)行的兩個(gè)過程,這可能會(huì)導(dǎo)致CPU份額如下劃分:
PID container CPU CPU share100 {C0}0100% of CPU0101 {C1}1100% of CPU1102 {C1}2100% of CPU2
默認(rèn) CPU CFS(完全公平調(diào)度程序)周期為100ms。我們可以使用--cpu-period
設(shè)置 CPU 的時(shí)間段來(lái)限制容器的 CPU 使用率。通常--cpu-period
應(yīng)該與--cpu-quota
。
例子:
$ docker run -it --cpu-period=50000 --cpu-quota=25000 ubuntu:14.04 /bin/bash
如果有1個(gè) CPU,這意味著容器每50ms可以獲得50%的 CPU 運(yùn)行時(shí)間。
除了使用--cpu-period
和--cpu-quota
設(shè)置 CPU 周期約束外,還可以--cpus
使用浮點(diǎn)數(shù)指定以實(shí)現(xiàn)相同的目的。例如,如果有1個(gè) CPU,--cpus=0.5
則會(huì)達(dá)到與設(shè)置--cpu-period=50000
和--cpu-quota=25000
(50% CPU)相同的結(jié)果。
--cpus
is 的默認(rèn)值是0.000
,這意味著沒有限制。
有關(guān)更多信息,請(qǐng)參閱CFS有關(guān)帶寬限制的文檔。
我們可以設(shè)置允許執(zhí)行容器的 cpus。
例子:
$ docker run -it --cpuset-cpus="1,3" ubuntu:14.04 /bin/bash
這意味著容器中的進(jìn)程可以在 cpu 1和 cpu 3上執(zhí)行。
$ docker run -it --cpuset-cpus="0-2" ubuntu:14.04 /bin/bash
這意味著容器中的進(jìn)程可以在 cpu 0,cpu 1和 cpu 2上執(zhí)行。
我們可以設(shè)置允許執(zhí)行容器的 mems。只對(duì) NUMA 系統(tǒng)有效。
例子:
$ docker run -it --cpuset-mems="1,3" ubuntu:14.04 /bin/bash
此示例將容器中的進(jìn)程限制為僅使用內(nèi)存節(jié)點(diǎn)1和3中的內(nèi)存。
$ docker run -it --cpuset-mems="0-2" ubuntu:14.04 /bin/bash
此示例將容器中的進(jìn)程限制為僅使用內(nèi)存節(jié)點(diǎn)0,1和2中的內(nèi)存。
該--cpu-quota
標(biāo)志限制了容器的 CPU 使用率。默認(rèn)的0值允許容器占用100%的 CPU 資源(1個(gè)CPU)。CFS(完全公平調(diào)度程序)為執(zhí)行進(jìn)程處理資源分配,并且是內(nèi)核使用的默認(rèn) Linux 調(diào)度程序。將此值設(shè)置為50000以將容器限制為 CPU 資源的50%。對(duì)于多個(gè) CPU,--cpu-quota
根據(jù)需要進(jìn)行調(diào)整。有關(guān)更多信息,請(qǐng)參閱CFS有關(guān)帶寬限制的文檔。
默認(rèn)情況下,所有容器都獲得相同比例的塊 IO 帶寬(blkio)。該比例為500.要修改此比例,請(qǐng)使用--blkio-weight
標(biāo)志更改容器的 blkio 權(quán)重與所有其他正在運(yùn)行的容器的權(quán)重。
注意: blkio 權(quán)重設(shè)置僅適用于直接 IO。緩沖 IO 目前不受支持。
該--blkio-weight
標(biāo)志可以將權(quán)重設(shè)置為10至1000之間的值。例如,下面的命令創(chuàng)建兩個(gè)具有不同 blkio 權(quán)重的容器:
$ docker run -it --name c1 --blkio-weight 300 ubuntu:14.04 /bin/bash $ docker run -it --name c2 --blkio-weight 600 ubuntu:14.04 /bin/bash
如果您同時(shí)在兩個(gè)容器中阻止 IO,例如:
$ time dd if=/mnt/zerofile of=test.out bs=1M count=1024 oflag=direct
您會(huì)發(fā)現(xiàn)時(shí)間的比例與兩個(gè)容器的 blkio 權(quán)重的比例相同。
該--blkio-weight-device="DEVICE_NAME:WEIGHT"
標(biāo)志設(shè)置了特定的設(shè)備重量。這DEVICE_NAME:WEIGHT
是一個(gè)包含冒號(hào)分隔的設(shè)備名稱和權(quán)重的字符串。例如,要將/dev/sda
設(shè)備重量設(shè)置為200
:
$ docker run -it \ --blkio-weight-device "/dev/sda:200" \ ubuntu
如果您同時(shí)指定--blkio-weight
和--blkio-weight-device
,則 Docker 將使用--blkio-weight
默認(rèn)權(quán)重,并使用--blkio-weight-device
此值在特定設(shè)備上用新值覆蓋此默認(rèn)值。以下示例使用默認(rèn)權(quán)重300
并將/dev/sda
該權(quán)重設(shè)置為以下內(nèi)容時(shí)將覆蓋此默認(rèn)值200
:
$ docker run -it \ --blkio-weight 300 \ --blkio-weight-device "/dev/sda:200" \ ubuntu
該--device-read-bps
標(biāo)志限制了設(shè)備的讀取速率(每秒字節(jié)數(shù))。例如,該命令創(chuàng)建一個(gè)容器并將讀取速率限制為1mb
每秒從以下位置開始/dev/sda
:
$ docker run -it --device-read-bps /dev/sda:1mb ubuntu
該--device-write-bps
標(biāo)志限制了設(shè)備的寫入速率(每秒字節(jié)數(shù))。例如,該命令創(chuàng)建一個(gè)容器并將寫入速率限制為1mb
每秒的寫入速率/dev/sda
:
$ docker run -it --device-write-bps /dev/sda:1mb ubuntu
兩種標(biāo)志都采用<device-path>:<limit>[unit]
格式限制。讀取和寫入速率都必須是正整數(shù)。您可以指定速率kb
(千字節(jié)),mb
(兆字節(jié))或gb
(千兆字節(jié))。
該--device-read-iops
標(biāo)志限制了設(shè)備的讀取速率(每秒 IO)。例如,該命令創(chuàng)建一個(gè)容器,并且限制了讀出速度,以1000
從 IO 每秒/dev/sda
:
$ docker run -ti --device-read-iops /dev/sda:1000 ubuntu
該--device-write-iops
標(biāo)志限制寫入速率(每秒 IO)到設(shè)備。例如,該命令創(chuàng)建一個(gè)容器并將寫入速率限制為每秒1000
IO,以便/dev/sda
:
$ docker run -ti --device-write-iops /dev/sda:1000 ubuntu
兩種標(biāo)志都采用<device-path>:<limit>
格式限制。讀取和寫入速率都必須是正整數(shù)。
--group-add: Add additional groups to run as
默認(rèn)情況下,泊塢窗容器進(jìn)程運(yùn)行時(shí),為指定用戶查找補(bǔ)充組。如果你想添加更多的組,那么你可以使用這個(gè)標(biāo)志:
$ docker run --rm --group-add audio --group-add nogroup --group-add 777 busybox id uid=0(root) gid=0(root) groups=10(wheel),29(audio),99(nogroup),777
--cap-add: Add Linux capabilities--cap-drop: Drop Linux capabilities--privileged=false: Give extended privileges to this container--device=[]: Allows you to run devices inside the container without the --privileged flag.
默認(rèn)情況下,Docker 容器是“非特權(quán)”的,例如不能在 Docker 容器中運(yùn)行 Docker 守護(hù)進(jìn)程。這是因?yàn)槟J(rèn)情況下容器不允許訪問任何設(shè)備,但“特權(quán)”容器可以訪問所有設(shè)備(請(qǐng)參閱cgroups設(shè)備上的文檔)。
當(dāng)操作員執(zhí)行時(shí)docker run --privileged
,Docker 將啟用對(duì)主機(jī)上所有設(shè)備的訪問,并在 AppArmor 或
SELinux 中設(shè)置一些配置,以允許容器幾乎對(duì)主機(jī)的所有訪問權(quán)限與主機(jī)上容器外運(yùn)行的進(jìn)程相同。有關(guān)運(yùn)行的更多信息--privileged
可在Docker博客上找到。
如果你想限制訪問特定的設(shè)備或設(shè)備,你可以使用該--device
標(biāo)志。它允許您指定一個(gè)或多個(gè)在容器內(nèi)可訪問的設(shè)備。
$ docker run --device=/dev/snd:/dev/snd ...
默認(rèn)情況下,容器就可以read
,write
和mknod
這些設(shè)備。這可以使用:rwm
每個(gè)--device
標(biāo)志的第三組選項(xiàng)來(lái)覆蓋:
$ docker run --device=/dev/sda:/dev/xvdc --rm -it ubuntu fdisk /dev/xvdcCommand (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:w --rm -it ubuntu fdisk /dev/xvdc crash....$ docker run --device=/dev/sda:/dev/xvdc:m --rm -it ubuntu fdisk /dev/xvdc fdisk: unable to open /dev/xvdc: Operation not permitted
除此之外--privileged
,操作員可以對(duì)使用--cap-add
和的能力進(jìn)行細(xì)粒度控制--cap-drop
。默認(rèn)情況下,Docker 具有保留的默認(rèn)功能列表。下表列出了默認(rèn)情況下允許并可以刪除的 Linux 功能選項(xiàng)。
能力密鑰 | 能力描述 |
---|---|
SETPCAP | 修改過程功能。 |
MKNOD | 使用mknod(2)創(chuàng)建特殊文件。 |
AUDIT_WRITE | 將記錄寫入內(nèi)核審計(jì)日志。 |
CHOWN | 對(duì)文件UID和GID進(jìn)行任意更改(請(qǐng)參見chown(2))。 |
NET_RAW | 使用RAW和PACKET套接字。 |
DAC_OVERRIDE | 繞過文件讀取,寫入和執(zhí)行權(quán)限檢查。 |
FOWNER | 對(duì)通常需要進(jìn)程的文件系統(tǒng)UID的操作繞過權(quán)限檢查以匹配文件的UID。 |
FSETID | 修改文件時(shí),不要清除set-user-ID和set-group-ID權(quán)限位。 |
KILL | 繞過發(fā)送信號(hào)的權(quán)限檢查。 |
SETGID | 任意操作進(jìn)程GID和補(bǔ)充GID列表。 |
SETUID | 任意操作進(jìn)程UID。 |
NET_BIND_SERVICE | 將套接字綁定到Internet域特權(quán)端口(端口號(hào)小于1024)。 |
SYS_CHROOT | 使用chroot(2),更改根目錄。 |
SETFCAP | 設(shè)置文件功能。 |
下表顯示了默認(rèn)情況下未授予的功能,可以添加。
Capability Key | Capability Description |
---|---|
SYS_MODULE | Load and unload kernel modules. |
SYS_RAWIO | Perform I/O port operations (iopl(2) and ioperm(2)). |
SYS_PACCT | Use acct(2), switch process accounting on or off. |
SYS_ADMIN | Perform a range of system administration operations. |
SYS_NICE | Raise process nice value (nice(2), setpriority(2)) and change the nice value for arbitrary processes. |
SYS_RESOURCE | Override resource Limits. |
SYS_TIME | Set system clock (settimeofday(2), stime(2), adjtimex(2)); set real-time (hardware) clock. |
SYS_TTY_CONFIG | Use vhangup(2); employ various privileged ioctl(2) operations on virtual terminals. |
AUDIT_CONTROL | Enable and disable kernel auditing; change auditing filter rules; retrieve auditing status and filtering rules. |
MAC_OVERRIDE | Allow MAC configuration or state changes. Implemented for the Smack LSM. |
MAC_ADMIN | Override Mandatory Access Control (MAC). Implemented for the Smack Linux Security Module (LSM). |
NET_ADMIN | Perform various network-related operations. |
SYSLOG | Perform privileged syslog(2) operations. |
DAC_READ_SEARCH | Bypass file read permission checks and directory read and execute permission checks. |
LINUX_IMMUTABLE | Set the FS_APPEND_FL and FS_IMMUTABLE_FL i-node flags. |
NET_BROADCAST | Make socket broadcasts, and listen to multicasts. |
IPC_LOCK | Lock memory (mlock(2), mlockall(2), mmap(2), shmctl(2)). |
IPC_OWNER | Bypass permission checks for operations on System V IPC objects. |
SYS_PTRACE | Trace arbitrary processes using ptrace(2). |
SYS_BOOT | Use reboot(2) and kexec_load(2), reboot and load a new kernel for later execution. |
LEASE | Establish leases on arbitrary files (see fcntl(2)). |
WAKE_ALARM | Trigger something that will wake up the system. |
BLOCK_SUSPEND | Employ features that can block system suspend. |
Further reference information is available on the capabilities(7) - Linux man page
兩個(gè)標(biāo)志都支持該值ALL
,所以如果運(yùn)營(yíng)商想要擁有所有功能,但MKNOD
可以使用:
$ docker run --cap-add=ALL --cap-drop=MKNOD ...
為了與網(wǎng)絡(luò)堆棧進(jìn)行交互,而不是使用--privileged
它們--cap-add=NET_ADMIN
來(lái)修改網(wǎng)絡(luò)接口。
$ docker run -it --rm ubuntu:14.04 ip link add dummy0 type dummy RTNETLINK answers: Operation not permitted $ docker run -it --rm --cap-add=NET_ADMIN ubuntu:14.04 ip link add dummy0 type dummy
要安裝基于 FUSE 的文件系統(tǒng),您需要將兩者--cap-add
和--device
:
$ docker run --rm -it --cap-add SYS_ADMIN sshfs sshfs sven@10.10.10.20:/home/sven /mnt fuse: failed to open /dev/fuse: Operation not permitted $ docker run --rm -it --device /dev/fuse sshfs sshfs sven@10.10.10.20:/home/sven /mnt fusermount: mount failed: Operation not permitted $ docker run --rm -it --cap-add SYS_ADMIN --device /dev/fuse sshfs # sshfs sven@10.10.10.20:/home/sven /mnt The authenticity of host '10.10.10.20 (10.10.10.20)' can't be established.ECDSA key fingerprint is 25:34:85:75:25:b0:17:46:05:19:04:93:b5:dd:5f:c6.Are you sure you want to continue connecting (yes/no)? yes sven@10.10.10.20's password:root@30aa0cfaf1b5:/# ls -la /mnt/src/docker total 1516drwxrwxr-x 1 1000 1000 4096 Dec 4 06:08 .drwxrwxr-x 1 1000 1000 4096 Dec 4 11:46 ..-rw-rw-r-- 1 1000 1000 16 Oct 8 00:09 .dockerignore-rwxrwxr-x 1 1000 1000 464 Oct 8 00:09 .drone.yml drwxrwxr-x 1 1000 1000 4096 Dec 4 06:11 .git-rw-rw-r-- 1 1000 1000 461 Dec 4 06:08 .gitignore....
默認(rèn)的 seccomp 配置文件將根據(jù)選定的功能進(jìn)行調(diào)整,以便允許使用功能所允許的設(shè)施,因此,自 Docker 1.12以來(lái),您無(wú)需對(duì)其進(jìn)行調(diào)整。在 Docker 1.10和1.11中,這沒有發(fā)生,可能需要使用自定義的 seccomp 配置文件或--security-opt seccomp=unconfined
在添加功能時(shí)使用。
容器可以具有與 Docker 守護(hù)程序不同的日志記錄驅(qū)動(dòng)程序。使用--log-driver=VALUE
with docker run
命令配置容器的日志記錄驅(qū)動(dòng)程序。支持以下選項(xiàng):
Driver | Description |
---|---|
none | Disables any logging for the container. docker logs won’t be available with this driver. |
json-file | Default logging driver for Docker. Writes JSON messages to file. No logging options are supported for this driver. |
syslog | Syslog logging driver for Docker. Writes log messages to syslog. |
journald | Journald logging driver for Docker. Writes log messages to journald. |
gelf | Graylog Extended Log Format (GELF) logging driver for Docker. Writes log messages to a GELF endpoint likeGraylog or Logstash. |
fluentd | Fluentd logging driver for Docker. Writes log messages to fluentd (forward input). |
awslogs | Amazon CloudWatch Logs logging driver for Docker. Writes log messages to Amazon CloudWatch Logs |
splunk | Splunk logging driver for Docker. Writes log messages to splunk using Event Http Collector. |
該docker logs
命令僅適用于json-file
和journald
日志記錄驅(qū)動(dòng)程序。有關(guān)使用記錄驅(qū)動(dòng)程序的詳細(xì)信息,請(qǐng)參閱配置記錄驅(qū)動(dòng)程序。
當(dāng)開發(fā)人員從Dockerfile構(gòu)建圖像或提交時(shí),開發(fā)人員可以設(shè)置許多默認(rèn)參數(shù),這些參數(shù)在圖像作為容器啟動(dòng)時(shí)生效。
在 Dockerfile 命令的四個(gè)不能在運(yùn)行時(shí)被覆蓋:FROM
,MAINTAINER
,RUN
,和ADD
。其他的都有相應(yīng)的覆蓋docker run
。我們將通過開發(fā)人員在每個(gè)Dockerfile指令中設(shè)置的內(nèi)容以及操作員如何覆蓋該設(shè)置。
CMD(默認(rèn)命令或選項(xiàng))
入口點(diǎn)(運(yùn)行時(shí)執(zhí)行的默認(rèn)命令)
EXPOSE(傳入端口)
ENV(環(huán)境變量)
HEALTHCHECK
VOLUME(共享文件系統(tǒng))
USER
WORKDIR
回想COMMAND
Docker命令行中的可選項(xiàng):
$ docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
該命令是可選的,因?yàn)閯?chuàng)建這個(gè)命令的人IMAGE
可能已經(jīng)COMMAND
使用 Dockerfile CMD
指令提供了默認(rèn)值。作為操作員(從圖像運(yùn)行容器的人員),CMD
只需指定一個(gè)新操作即可覆蓋該指令COMMAND
。
如果圖片還指定了一個(gè)ENTRYPOINT
then,CMD
或者COMMAND
將其作為參數(shù)附加到ENTRYPOINT
。
--entrypoint="": Overwrite the default entrypoint set by the image
該ENTRYPOINT
圖像是類似COMMAND
,因?yàn)樗付丝蓤?zhí)行文件運(yùn)行容器啟動(dòng)時(shí),但它是(故意)更難以覆蓋。在ENTRYPOINT
給出了一個(gè)容器,它的默認(rèn)性質(zhì)或行為,所以,當(dāng)你設(shè)置一個(gè)ENTRYPOINT
可以運(yùn)行的容器,就好像它是二進(jìn)制,完全使用默認(rèn)選項(xiàng),并且可以在通過更多的選擇傳球COMMAND
。但是,有時(shí)操作員可能想在容器內(nèi)部運(yùn)行其他內(nèi)容,因此可以ENTRYPOINT
在運(yùn)行時(shí)通過使用字符串來(lái)指定新的值來(lái)覆蓋默認(rèn)值ENTRYPOINT
。以下是如何在已經(jīng)設(shè)置為自動(dòng)運(yùn)行其他內(nèi)容(如/usr/bin/redis-server
)的容器中運(yùn)行shell的示例:
$ docker run -it --entrypoint /bin/bash example/redis
或者如何將更多參數(shù)傳遞給該入口點(diǎn)的兩個(gè)示例:
$ docker run -it --entrypoint /bin/bash example/redis -c ls -l $ docker run -it --entrypoint /usr/bin/redis-cli example/redis --help
您可以通過傳遞空字符串來(lái)重置容器入口點(diǎn),例如:
$ docker run -it --entrypoint="" mysql bash
注意:傳遞
--entrypoint
將清除圖像上設(shè)置的任何默認(rèn)命令(即CMD
用于構(gòu)建它的Dockerfile中的任何指令)。
以下run
命令選項(xiàng)適用于容器網(wǎng)絡(luò):
--expose=[]: Expose a port or a range of ports inside the container. These are additional to those exposed by the `EXPOSE` instruction-P : Publish all exposed ports to the host interfaces-p=[] : Publish a container?s port or a range of ports to the host format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort Both hostPort and containerPort can be specified as a range of ports. When specifying ranges for both, the number of container ports in the range must match the number of host ports in the range, for example: -p 1234-1236:1234-1236/tcp When specifying a range for hostPort only, the containerPort must not be a range. In this case the container port is published somewhere within the specified hostPort range. (e.g., `-p 1234-1236:1234/tcp`) (use 'docker port' to see the actual mapping)--link="" : Add link to another container (<name or id>:alias or <name or id>)
除EXPOSE
指令外,圖像開發(fā)人員對(duì)網(wǎng)絡(luò)控制不夠。該EXPOSE
指令定義了提供服務(wù)的初始傳入端口。這些端口可用于容器內(nèi)的進(jìn)程。操作員可以使用該--expose
選項(xiàng)添加到暴露的端口。
要顯示容器的內(nèi)部端口,操作員可以使用-P
或-p
標(biāo)志啟動(dòng)容器。暴露的端口可以在主機(jī)上訪問,并且端口可供任何可以連接到主機(jī)的客戶端使用。
該-P
選項(xiàng)將所有端口發(fā)布到主機(jī)接口。Docker 將每個(gè)暴露的端口綁定到主機(jī)上的隨機(jī)端口。端口范圍在由...定義的臨時(shí)端口范圍內(nèi)/proc/sys/net/ipv4/ip_local_port_range
。使用該-p
標(biāo)志來(lái)顯式映射單個(gè)端口或端口范圍。
容器(服務(wù)偵聽的地方)中的端口號(hào)不需要與容器外部(客戶端連接的地方)上公開的端口號(hào)相匹配。例如,在容器內(nèi),HTTP 服務(wù)正在端口80上進(jìn)行偵聽(因此圖像開發(fā)人員EXPOSE 80
在 Dockerfile 中指定)。在運(yùn)行時(shí),端口可能會(huì)綁定到主機(jī)上的42800。要找到主機(jī)端口和外露端口之間的映射,請(qǐng)使用docker port
。
如果運(yùn)營(yíng)商--link
在默認(rèn)網(wǎng)橋網(wǎng)絡(luò)中啟動(dòng)新的客戶端容器時(shí)使用,則客戶端容器可以通過專用網(wǎng)絡(luò)接口訪問公開的端口。如果--link
在 Docker 網(wǎng)絡(luò)概述中描述的在用戶定義的網(wǎng)絡(luò)中啟動(dòng)容器時(shí)使用,它將為要鏈接的容器提供一個(gè)命名別名。
Docker 在創(chuàng)建 Linux 容器時(shí)會(huì)自動(dòng)設(shè)置一些環(huán)境變量。在創(chuàng)建 Windows 容器時(shí),Docker 不會(huì)設(shè)置任何環(huán)境變量。
為 Linux 容器設(shè)置以下環(huán)境變量:
變量 | 值 |
---|---|
家 | 根據(jù)USER的值進(jìn)行設(shè)置 |
主機(jī)名 | 與容器關(guān)聯(lián)的主機(jī)名 |
路徑 | 包括流行的目錄,例如/ usr / local / sbin:/ usr / local / bin:/ usr / sbin:/ usr / bin:/ sbin:/ bin |
術(shù)語(yǔ) | xterm如果容器被分配了偽TTY |
另外,操作員可以通過使用一個(gè)或多個(gè)標(biāo)志來(lái)設(shè)置容器中的任何環(huán)境變量-e
,甚至覆蓋上面提到的那些標(biāo)志,或者已經(jīng)由開發(fā)人員用 Dockerfile 定義ENV
。如果操作符命名環(huán)境變量而不指定值,則命名變量的當(dāng)前值會(huì)傳播到容器的環(huán)境中:
$ export today=Wednesday $ docker run -e "deep=purple" -e today --rm alpine env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=d2219b854598 deep=purple today=Wednesday HOME=/root
PS C:\> docker run --rm -e "foo=bar" microsoft/nanoserver cmd /s /c setALLUSERSPROFILE=C:\ProgramData APPDATA=C:\Users\ContainerAdministrator\AppData\Roaming CommonProgramFiles=C:\Program Files\Common FilesCommonProgramFiles(x86)=C:\Program Files (x86)\Common Files CommonProgramW6432=C:\Program Files\Common Files COMPUTERNAME=C2FAEFCC8253 ComSpec=C:\Windows\system32\cmd.exe foo=bar LOCALAPPDATA=C:\Users\ContainerAdministrator\AppData\Local NUMBER_OF_PROCESSORS=8OS=Windows_NT Path=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Users\ContainerAdministrator\AppData\Local\Microsoft\WindowsApps PATHEXT=.COM;.EXE;.BAT;.CMD PROCESSOR_ARCHITECTURE=AMD64 PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 62 Stepping 4, GenuineIntel PROCESSOR_LEVEL=6PROCESSOR_REVISION=3e04ProgramData=C:\ProgramData ProgramFiles=C:\Program FilesProgramFiles(x86)=C:\Program Files (x86)ProgramW6432=C:\Program Files PROMPT=$P$G PUBLIC=C:\Users\Public SystemDrive=C:SystemRoot=C:\Windows TEMP=C:\Users\ContainerAdministrator\AppData\Local\Temp TMP=C:\Users\ContainerAdministrator\AppData\Local\Temp USERDOMAIN=User Manager USERNAME=ContainerAdministrator USERPROFILE=C:\Users\ContainerAdministrator windir=C:\Windows
同樣,操作員可以設(shè)置HOSTNAME(Linux)或COMPUTERNAME(Windows)-h
。
--health-cmd Command to run to check health --health-interval Time between running the check --health-retries Consecutive failures needed to report unhealthy --health-timeout Maximum time to allow one check to run --health-start-period Start period for the container to initialize before starting health-retries countdown --no-healthcheck Disable any container-specified HEALTHCHECK
例子:
$ docker run --name=test -d \ --health-cmd='stat /etc/passwd || exit 1' \ --health-interval=2s \ busybox sleep 1d $ sleep 2; docker inspect --format='{{.State.Health.Status}}' test healthy $ docker exec test rm /etc/passwd $ sleep 2; docker inspect --format='{{json .State.Health}}' test{ "Status": "unhealthy", "FailingStreak": 3, "Log": [ { "Start": "2016-05-25T17:22:04.635478668Z", "End": "2016-05-25T17:22:04.7272552Z", "ExitCode": 0, "Output": " File: /etc/passwd\n Size: 334 \tBlocks: 8 IO Block: 4096 regular file\nDevice: 32h/50d\tInode: 12 Links: 1\nAccess: (0664/-rw-rw-r--) Uid: ( 0/ root) Gid: ( 0/ root)\nAccess: 2015-12-05 22:05:32.000000000\nModify: 2015..." }, { "Start": "2016-05-25T17:22:06.732900633Z", "End": "2016-05-25T17:22:06.822168935Z", "ExitCode": 0, "Output": " File: /etc/passwd\n Size: 334 \tBlocks: 8 IO Block: 4096 regular file\nDevice: 32h/50d\tInode: 12 Links: 1\nAccess: (0664/-rw-rw-r--) Uid: ( 0/ root) Gid: ( 0/ root)\nAccess: 2015-12-05 22:05:32.000000000\nModify: 2015..." }, { "Start": "2016-05-25T17:22:08.823956535Z", "End": "2016-05-25T17:22:08.897359124Z", "ExitCode": 1, "Output": "stat: can't stat '/etc/passwd': No such file or directory\n" }, { "Start": "2016-05-25T17:22:10.898802931Z", "End": "2016-05-25T17:22:10.969631866Z", "ExitCode": 1, "Output": "stat: can't stat '/etc/passwd': No such file or directory\n" }, { "Start": "2016-05-25T17:22:12.971033523Z", "End": "2016-05-25T17:22:13.082015516Z", "ExitCode": 1, "Output": "stat: can't stat '/etc/passwd': No such file or directory\n" } ]}
docker ps
輸出中還顯示健康狀況。
--tmpfs=[]: Create a tmpfs mount with: container-dir[:<options>], where the options are identical to the Linux 'mount -t tmpfs -o' command.
下面的例子中安裝一個(gè)空的 tmpfs 與容器rw
,noexec
,nosuid
,和size=65536k
選項(xiàng)。
$ docker run -d --tmpfs /run:rw,noexec,nosuid,size=65536k my_image
-v, --volume=[host-src:]container-dest[:<options>]: Bind mount a volume.The comma-delimited `options` are [rw|ro], [z|Z],[[r]shared|[r]slave|[r]private], and [nocopy].The 'host-src' is an absolute path or a name value.If neither 'rw' or 'ro' is specified then the volume is mounted inread-write mode.The `nocopy` modes is used to disable automatic copying requested volume path in the container to the volume storage location.For named volumes, `copy` is the default mode. Copy modes are not supportedfor bind-mounted volumes.--volumes-from="": Mount all volumes from the given container(s)
注意:當(dāng)使用 systemd 管理 Docker 守護(hù)進(jìn)程的啟動(dòng)和停止時(shí),在 systemd 單元文件中,有一個(gè)選項(xiàng)可以控制 Docker 守護(hù)進(jìn)程本身的掛載傳播
MountFlags
。此設(shè)置的值可能會(huì)導(dǎo)致 Docker 無(wú)法看到掛載點(diǎn)在掛載點(diǎn)上進(jìn)行的掛載傳播更改。例如,如果此值為slave
,您可能無(wú)法在卷上使用shared
或rshared
傳播。
卷命令足夠復(fù)雜,可以在“ 管理容器中的數(shù)據(jù)”部分中擁有自己的文檔。開發(fā)人員可以定義VOLUME
與圖像關(guān)聯(lián)的一個(gè)或多個(gè)圖像,但只有操作員可以從一個(gè)容器訪問另一個(gè)容器(或從容器訪問主機(jī)上安裝的卷)。
在container-dest
必須始終是絕對(duì)路徑,例如/src/docs
。該host-src
可以是絕對(duì)路徑或name
值。如果你提供了一個(gè)絕對(duì)路徑host-dir
,Docker 綁定到你指定的路徑。如果你提供一個(gè)name
,Docker 通過它創(chuàng)建一個(gè)命名的卷name
。
一個(gè)name
值必須以字母數(shù)字字符,接著啟動(dòng)a-z0-9
,_
(下劃線), .
(周期)或-
(連字符)。絕對(duì)路徑以/
(正斜杠)開頭。
例如,您可以指定一個(gè)值/foo
或foo
一個(gè)host-src
值。如果你提供這個(gè)/foo
值,Docker 會(huì)創(chuàng)建一個(gè)綁定掛載。如果您提供foo
規(guī)范,Docker 將創(chuàng)建一個(gè)命名卷。
root
(id = 0)是容器內(nèi)的默認(rèn)用戶。圖像開發(fā)人員可以創(chuàng)建更多用戶。這些用戶可以通過名稱訪問。在傳遞數(shù)字標(biāo)識(shí)時(shí),用戶不必在容器中存在。
開發(fā)人員可以設(shè)置默認(rèn)用戶使用 Dockerfile USER
指令運(yùn)行第一個(gè)進(jìn)程。啟動(dòng)容器時(shí),操作員可以USER
通過傳遞-u
選項(xiàng)來(lái)覆蓋指令。
-u="", --user="": Sets the username or UID used and optionally the groupname or GID for the specified command.The followings examples are all valid:--user=[ user | user:group | uid | uid:gid | user:gid | uid:group ]
注意:如果你傳遞一個(gè)數(shù)字 uid,它必須在0-2147483647的范圍內(nèi)。
在容器中運(yùn)行二進(jìn)制文件的默認(rèn)工作目錄是根目錄(/
),但開發(fā)人員可以使用 Dockerfile WORKDIR
命令設(shè)置不同的默認(rèn)值。操作員可以通過以下方式覆蓋此項(xiàng):
-w="": Working directory inside the container