docker container run

說明從映像檔建立並執行新的容器
用法docker container run [選項] 映像檔 [指令] [參數...]
別名
docker run

說明

docker run 指令會在新容器中執行指令,如果需要,會提取映像檔並啟動容器。

您可以使用 docker start 重新啟動已停止的容器,並保留所有先前的變更。使用 docker ps -a 可以檢視所有容器的清單,包括已停止的容器。

選項

選項預設值說明
--add-host新增自訂主機到 IP 的映射(主機:ip)
--annotationAPI 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
--cgroupnsAPI 1.41+ 要使用的 Cgroup 命名空間 (host|private)
'host': 在 Docker 主機的 cgroup 命名空間中執行容器
'private': 在容器自己的私有 cgroup 命名空間中執行容器
'': 使用由 daemon 上的
default-cgroupns-mode 選項設定的 cgroup 命名空間 (預設)
--cidfile將容器 ID 寫入檔案
--cpu-countCPU 個數(僅限 Windows)
--cpu-percentCPU 百分比(僅限 Windows)
--cpu-period限制 CPU CFS(完全公平排程器)週期
--cpu-quota限制 CPU CFS(完全公平排程器)配額
--cpu-rt-periodAPI 1.25+ 限制 CPU 即時週期(以微秒為單位)
--cpu-rt-runtimeAPI 1.25+ 限制 CPU 即時執行時間(以微秒為單位)
-c, --cpu-sharesCPU 共享(相對權重)
--cpusAPI 1.25+ CPU 數量
--cpuset-cpus允許執行的 CPU (0-3, 0,1)
--cpuset-mems允許執行的記憶體 (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-trusttrue略過映像檔驗證
--dns設定自訂 DNS 伺服器
--dns-option設定 DNS 選項
--dns-search設定自訂 DNS 搜尋網域
--domainname容器 NIS 網域名稱
--entrypoint覆寫映像檔的預設 ENTRYPOINT
-e, --env設定環境變數
--env-file讀取環境變數檔案
--expose公開一個埠或一個埠範圍
--gpusAPI 1.40+ 要加入容器的 GPU 裝置('all' 表示傳遞所有 GPU)
--group-add加入額外的群組
--health-cmd用於檢查健康的指令
--health-interval執行檢查的間隔時間 (毫秒|秒|分|小時) (預設 0 秒)
--health-retries回報不健康的連續失敗次數
--health-start-intervalAPI 1.44+ 啟動期間執行檢查的間隔時間 (毫秒|秒|分|小時) (預設 0 秒)
--health-start-periodAPI 1.29+ 容器在開始 health-retries 倒數計時之前的初始化啟動期間 (毫秒|秒|分|小時) (預設 0 秒)
--health-timeout允許單次檢查執行的最長時間 (毫秒|秒|分|小時) (預設 0 秒)
--help顯示使用方法
-h, --hostname容器主機名稱
--initAPI 1.25+ 在容器內執行一個 init 程序,用於轉發訊號和回收子程序
-i, --interactive即使未附加,也保持 STDIN 開啟
--io-maxbandwidth系統磁碟機的最大 IO 頻寬限制 (僅限 Windows)
--io-maxiops系統磁碟機的最大 IOps 限制 (僅限 Windows)
--ipIPv4 位址 (例如:172.30.100.104)
--ip6IPv6 位址 (例如: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 表示無限制)
--platformAPI 1.32+ 如果伺服器支援多平台,則設定平台
--privileged授予此容器擴充權限
-p, --publish將容器的埠發佈到主機
-P, --publish-all將所有公開的埠發佈到隨機埠
--pull遺漏在執行之前拉取映像檔(`always`、`missing`、`never`)
-q, --quiet隱藏拉取輸出
--read-only將容器的根檔案系統掛載為唯讀
--restart容器退出時套用的重新啟動策略
--rm容器退出時自動移除容器及其關聯的匿名磁碟區
--runtime用於此容器的執行階段
--security-opt安全性選項
--shm-size/dev/shm 的大小
--sig-proxytrue將接收到的訊號代理到程序
--stop-signal停止容器的訊號
--stop-timeoutAPI 1.25+ 停止容器的逾時時間(以秒為單位)
--storage-opt容器的儲存驅動程式選項
--sysctlSysctl 選項
--tmpfs掛載 tmpfs 目錄
-t, --tty配置一個偽終端 (pseudo-TTY)
--ulimitUlimit 選項
-u, --user使用者名稱或 UID (格式:<名稱|uid>[:<群組|gid>])
--userns要使用的使用者命名空間
--uts要使用的 UTS 命名空間
-v, --volume繫結掛載磁碟區
--volume-driver容器的選用磁碟區驅動程式
--volumes-from從指定的容器掛載磁碟區
-w, --workdir容器內的工作目錄

範例

指定名稱 (--name)

使用 `--name` 旗標,您可以為容器指定自定義識別碼。以下範例使用 `nginx:alpine` 映像檔以分離模式 執行名為 `test` 的容器。

$ 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 run` 退出時,Docker 會關閉此檔案。

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`

  1. 使用 --pid=host 選項執行 alpine 容器

    $ docker run --rm -it --pid=host alpine
    
  2. 在容器中安裝 htop

    / # apk add --quiet htop
    
  3. 執行 htop 命令。

    / # htop
    

範例:加入另一個容器的 PID 命名空間

加入另一個容器的 PID 命名空間對於除錯該容器很有用。

  1. 啟動一個執行 Redis 伺服器的容器

    $ docker run --rm --name my-nginx -d nginx:alpine
    
  2. 執行一個 Alpine 容器,將 --pid 命名空間附加到 my-nginx 容器

    $ docker run --rm -it --pid=container:my-nginx \
      --cap-add SYS_PTRACE \
      --security-opt seccomp=unconfined \
      alpine
    
  3. 在 Alpine 容器中安裝 strace

    / # apk add strace
    
  4. 附加到程序 1,即 my-nginx 容器的程序 ID

    / # strace -p 1
    strace: Process 1 attached
    

停用容器的命名空間重新映射 (--userns)

如果您在守護程序上啟用使用者命名空間,則預設情況下所有容器都會在啟用使用者命名空間的情況下啟動。要停用特定容器的使用者命名空間重新映射,您可以將 --userns 旗標設定為 host

docker run --userns=host hello-world

host--userns 旗標唯一有效的値。

更多資訊,請參閱 使用使用者命名空間隔離容器.

UTS 設定 (--uts)

--uts=""  : Set the UTS namespace mode for the container
            'host': use the host's UTS namespace inside the container

UTS 命名空間用於設定在該命名空間中執行的程序可見的主機名稱和網域。預設情況下,所有容器,包括使用 --network=host 的容器,都有自己的 UTS 命名空間。將 --uts 設定為 host 會導致容器使用與主機相同的 UTS 命名空間。

**注意**

Docker 不允許將 --hostname--domainname 旗標與 --uts=host 結合使用。這是為了防止在主機的 UTS 命名空間中執行的容器嘗試更改主機的設定。

如果您希望容器的主機名稱隨著主機主機名稱的更改而更改,您可能希望與主機共享 UTS 命名空間。更進階的用例是從容器更改主機的主機名稱。

IPC 設定 (--ipc)

--ipc="MODE"  : Set the IPC mode for the container

--ipc 旗標接受以下值

說明
""使用守護程序的預設值。
"none"擁有私有的 IPC 命名空間,且未掛載 /dev/shm。
"private"擁有私有的 IPC 命名空間。
"shareable"擁有私有的 IPC 命名空間,可以與其他容器共享。
"container:<_名稱或 ID_>"加入另一個(「可共享」)容器的 IPC 命名空間。
"host"使用主機系統的 IPC 命名空間。

如果未指定,則使用守護程序預設值,可以是 "private""shareable",具體取決於守護程序版本和設定。

System V 进程间通信 (IPC) 命名空間提供命名共享內存段、信號量和消息隊列的分隔。

共享內存段用於以內存速度加速進程間通信,而不是通過管道或網絡堆棧。共享內存通常由資料庫和定制構建(通常是 C/OpenMPI、C++/使用 boost 庫)的高性能應用程序用於科學計算和金融服務行業。如果這些類型的應用程序被分解成多個容器,您可能需要共享容器的 IPC 機制,對主(即「捐贈者」)容器使用 "shareable" 模式,對其他容器使用 "container:<捐贈者名稱或 ID>" 模式。

提升容器權限 (--privileged)

--privileged 旗標授予容器以下功能

  • 啟用所有 Linux 內核功能
  • 停用預設的 seccomp 設定檔
  • 停用預設的 AppArmor 設定檔
  • 停用 SELinux 程序標籤
  • 授予所有主機設備的訪問權限
  • 使 /sys 可讀寫
  • 使 cgroups 掛載可讀寫

換句話說,容器幾乎可以執行主機可以執行的所有操作。此旗標的存在是為了允許特殊用例,例如在 Docker 中執行 Docker。

**警告**

謹慎使用 --privileged 旗標。使用 --privileged 的容器不是安全沙盒化的程序。此模式下的容器可以在主機上取得 root shell 並控制系統。

對於大多數用例,此旗標不應是首選解決方案。如果您的容器需要提升權限,您應該優先明確授予必要的權限,例如使用 --cap-add 添加個別的內核功能。

更多資訊,請參閱 執行時權限和 Linux 功能

以下範例無法運作,因為預設情況下,Docker 會捨棄大多數潛在危險的內核功能,包括 CAP_SYS_ADMIN(掛載檔案系統所需)。

$ docker run -t -i --rm ubuntu bash
root@bc338942ef20:/# mount -t tmpfs none /mnt
mount: permission denied

當您添加 --privileged 旗標時,它可以運作

$ docker run -t -i --privileged ubuntu bash
root@50e3f57e16e6:/# mount -t tmpfs none /mnt
root@50e3f57e16e6:/# df -h
Filesystem      Size  Used Avail Use% Mounted on
none            1.9G     0  1.9G   0% /mnt

設定工作目錄 (-w, --workdir)

$ docker run -w /path/to/dir/ -i -t ubuntu pwd

-w 選項會在指定的目錄(在本例中為 /path/to/dir/)中執行在容器內執行的命令。如果路徑不存在,Docker 會在容器內建立它。

針對每個容器設定儲存驅動程式選項 (--storage-opt)

$ docker run -it --storage-opt size=120G fedora /bin/bash

這(大小)會在建立時將容器檔案系統大小限制為 120G。此選項僅適用於 btrfsoverlay2windowsfilterzfs 儲存驅動程式。

對於 overlay2 儲存驅動程式,僅當後端檔案系統為 xfs 並使用 pquota 掛載選項掛載時,大小選項才可用。在這些條件下,您可以傳遞任何小於後端檔案系統大小的大小。

對於 windowsfilterbtrfszfs 儲存驅動程式,您不能傳遞小於預設 BaseFS 大小的值。

掛載 tmpfs (--tmpfs)

--tmpfs 旗標允許您建立 tmpfs 掛載。

您可以傳遞給 --tmpfs 的選項與 Linux mount -t tmpfs -o 命令相同。以下範例使用 rwnoexecnosuidsize=65536k 選項將空的 tmpfs 掛載到容器中。

$ 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

上面的範例使用 -v 旗標將目前目錄中的 content 目錄掛載到容器中的 /content 路徑,將其設定為工作目錄,然後在容器內執行 pwd 命令。

$ docker run -v /doesnt/exist:/foo -w /foo -i -t ubuntu bash

當綁定掛載磁碟區的主機目錄不存在時,Docker 會自動在主機上為您建立此目錄。在上面的範例中,Docker 會在啟動容器之前建立 /doesnt/exist 資料夾。

以唯讀方式掛載磁碟區 (--read-only)

$ docker run --read-only -v /icanwrite busybox touch /icanwrite/here

您可以搭配使用磁碟區與 --read-only 旗標來控制容器寫入檔案的位置。--read-only 旗標會將容器的根檔案系統掛載為唯讀,禁止寫入容器指定磁碟區以外的位置。

$ docker run -t -i -v /var/run/docker.sock:/var/run/docker.sock -v /path/to/static-docker-binary:/usr/bin/docker busybox sh

透過繫結掛載 Docker Unix Socket 和靜態連結的 Docker 二進制檔(參考 取得 Linux 二進制檔),您可以讓容器擁有建立和操作主機 Docker Daemon 的完整權限。

在 Windows 上,您必須使用 Windows 路徑語法指定路徑。

PS C:\> docker run -v c:\foo:c:\dest microsoft/nanoserver cmd /s /c type c:\dest\somefile.txt
Contents of file

PS C:\> docker run -v c:\foo:d: microsoft/nanoserver cmd /s /c type d:\somefile.txt
Contents of file

以下範例在使用 Windows 容器時會失敗,因為容器內磁碟區或繫結掛載的目標必須是:不存在或空的目錄;或是 C: 以外的磁碟機。此外,繫結掛載的來源必須是本機目錄,而不是檔案。

net use z: \\remotemachine\share
docker run -v z:\foo:c:\dest ...
docker run -v \\uncpath\to\directory:c:\dest ...
docker run -v c:\foo\somefile.txt:c:\dest ...
docker run -v c:\foo:c: ...
docker run -v c:\foo:c:\existing-directory-with-contents ...

有關磁碟區的詳細資訊,請參閱 管理容器中的資料

使用 --mount 旗標新增繫結掛載或磁碟區

--mount 旗標允許您在容器中掛載磁碟區、主機目錄和 tmpfs 掛載。

--mount 旗標支援 -v--volume 旗標支援的大多數選項,但使用不同的語法。有關 --mount 旗標的詳細資訊,以及 --volume--mount 之間的比較,請參閱 繫結掛載

儘管沒有棄用 --volume 的計畫,但建議使用 --mount

範例

$ docker run --read-only --mount type=volume,target=/icanwrite busybox touch /icanwrite/here
$ docker run -t -i --mount type=bind,src=/data,dst=/data busybox sh

發佈或公開連接埠 (-p, --expose)

$ docker run -p 127.0.0.1:80:8080/tcp nginx:alpine

這會將容器的 8080 連接埠繫結到主機 127.0.0.1 上的 TCP 連接埠 80。您也可以指定 udpsctp 連接埠。網路概覽頁面 詳細說明瞭如何使用 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 旗標僅發佈明確標記為公開的連接埠號,可以使用 Dockerfile EXPOSE 指述或 docker run 命令的 --expose 旗標。

連接埠範圍在 /proc/sys/net/ipv4/ip_local_port_range 定義的*臨時連接埠範圍*內。使用 -p 旗標明確對應單一連接埠或連接埠範圍。

設定提取策略 (--pull)

使用 --pull 旗標在建立(和執行)容器時設定映像檔提取策略。

--pull 旗標可以採用以下其中一個值

說明
missing(預設)如果在映像檔快取中找不到映像檔,則提取映像檔,否則使用快取的映像檔。
never即使映像檔遺失,也不要提取映像檔,如果映像檔快取中不存在映像檔,則產生錯誤。
always在建立容器之前始終執行提取。

從映像檔建立(和執行)容器時,daemon 會檢查映像檔是否存在於本機映像檔快取中。如果映像檔遺失,則會將錯誤返回 CLI,允許其啟動提取。

預設值(missing)是僅在 daemon 的映像檔快取中不存在映像檔時才提取映像檔。此預設值允許您執行僅在本機存在的映像檔(例如,您從 Dockerfile 建建但尚未推送至 registry 的映像檔),並減少網路使用。

always 選項始終在建立容器之前啟動提取。此選項可確保映像檔是最新的,並防止您使用過時的映像檔,但在您想要在推送之前測試本地建置的映像檔的情況下可能不適用(因為提取映像檔會覆蓋映像檔快取中的現有映像檔)。

never 選項會在建立容器時停用(隱式)提取映像檔,並且僅使用映像檔快取中可用的映像檔。如果找不到指定的映像檔,則會產生錯誤,且不會建立容器。此選項在網路不可用或要防止在建立容器時隱式提取映像檔的情況下很有用。

以下範例顯示設定了 --pull=never 選項的 docker run,由於映像檔快取中缺少映像檔,因此會產生錯誤

$ docker run --pull=never hello-world
docker: Error response from daemon: No such image: hello-world:latest.

設定環境變數 (-e, --env, --env-file)

$ docker run -e MYVAR1 --env MYVAR2=foo --env-file ./env.list ubuntu bash

使用 -e--env--env-file 旗標在您執行的容器中設定簡單的(非陣列)環境變數,或覆蓋您執行的映像檔的 Dockerfile 中定義的變數。

您可以在執行容器時定義變數及其值

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

您也可以使用匯出到本機環境的變數

export VAR1=value1
export VAR2=value2

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

執行命令時,Docker CLI 用戶端會檢查變數在本機環境中的值,並將其傳遞給容器。如果未提供 = 且該變數未在本機環境中匯出,則容器中的變數將會取消設定。

您也可以從檔案載入環境變數。此檔案應使用語法 <變數>=值(將變數設定為指定值)或 <變數>(從本機環境取得值),以及 # 作為註解。以 # 開頭的行會被視為行註解並被忽略,而行中其他任何位置出現的 # 則會被視為變數值的一部分。

$ 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)

標籤是一個 鍵=值 對,用於將中繼資料套用至容器。要使用兩個標籤標記容器

$ docker run -l my-label --label com.example.foo=bar ubuntu bash

my-label 鍵未指定值,因此標籤預設為空字串 ("")。要新增多個標籤,請重複標籤旗標 (-l--label)。

鍵=值 必須是唯一的,以避免覆蓋標籤值。如果您使用相同的鍵但不同的值指定標籤,則每個後續值都會覆蓋前一個值。Docker 會使用您提供的最後一個 鍵=值

使用 --label-file 旗標從檔案載入多個標籤。使用 EOL 標記分隔檔案中的每個標籤。以下範例從目前目錄中的標籤檔案載入標籤

$ docker run --label-file ./labels ubuntu bash

標籤檔案格式類似於載入環境變數的格式。(與環境變數不同,標籤對容器內執行的程序不可見。)以下範例顯示標籤檔案格式

com.example.label1="a label"

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

您可以透過提供多個 --label-file 旗標來載入多個標籤檔案。

有關使用標籤的更多資訊,請參閱 標籤

將容器連線到網路 (--network)

要啟動容器並將其連線到網路,請使用 --network 選項。

如果您要將正在執行的容器新增到網路,請使用 docker network connect 子命令。

您可以將多個容器連接到同一個網路。連接後,容器只需使用另一個容器的 IP 位址或名稱即可進行通訊。對於支援多主機連線的 overlay 網路或自訂外掛程式,連接到同一個多主機網路但從不同引擎啟動的容器也可以透過這種方式進行通訊。

**注意**

預設的橋接網路僅允許容器使用內部 IP 位址相互通訊。使用者建立的橋接網路則提供使用容器名稱在容器之間進行 DNS 解析。

您可以使用 docker network disconnect 命令將容器從網路中斷開連線。

以下命令會建立一個名為 my-net 的網路,並將一個 busybox 容器新增到 my-net 網路。

$ docker network create my-net
$ docker run -itd --network=my-net busybox

您也可以在使用者定義的網路上啟動容器時,使用 --ip--ip6 旗標為容器選擇 IP 位址。要將靜態 IP 分配給容器,您必須指定網路的子網路區塊。

$ 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 位址)--ipIPv4 位址 (例如:172.30.100.104)
ip6(IPv6 位址)--ip6IPv6 位址 (例如:2001:db8::33)
mac-address(MAC 位址)--mac-address容器 MAC 位址 (例如:92:d0:c6:0a:29:33)
link-local-ip(鏈路本地 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

net.ipv4.net.ipv6.net.mpls. 開頭的 sysctl 設定可以使用 driver-opt 標籤 com.docker.network.endpoint.sysctls 針對每個介面進行設定。介面名稱必須是字串 IFNAME

要為一個介面設定多個 sysctl,請將整個 driver-opt 欄位用引號括起來,並在必要時使用跳脫字元來避免 shell 誤判引號。例如,如果 my-net 的介面名稱為 eth0,則以下範例會設定 sysctl net.ipv4.conf.eth0.log_martians=1net.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 旗標會掛載參考容器中所有已定義的磁碟區。您可以透過重複使用 --volumes-from 參數來指定多個容器。容器 ID 後面可以選擇性地加上 :ro:rw,以分別以唯讀或讀寫模式掛載磁碟區。預設情況下,Docker 會以參考容器的相同模式(唯讀或讀寫)掛載磁碟區。

像 SELinux 這樣的標籤系統需要在掛載到容器中的磁碟區內容上放置適當的標籤。如果沒有標籤,安全系統可能會阻止容器內執行的程序使用該內容。預設情況下,Docker 不會更改作業系統設定的標籤。

若要在容器上下文中更改標籤,您可以將兩個後綴 :z:Z 之一新增到磁碟區掛載點。這些後綴會指示 Docker 重新標記共用磁碟區上的檔案物件。z 選項會告訴 Docker 兩個容器共用磁碟區內容。因此,Docker 會使用共用內容標籤來標記內容。共用磁碟區標籤允許所有容器讀取/寫入內容。Z 選項會告訴 Docker 使用私有的非共用標籤來標記內容。只有目前的容器可以使用私有磁碟區。

分離模式 (-d, --detach)

--detach(或 -d)旗標會將容器作為背景程序啟動,不會佔用您的終端機視窗。根據設計,以分離模式啟動的容器會在用於執行容器的根程序結束時退出,除非您也指定了 --rm 選項。如果您將 -d--rm 一起使用,則容器會在退出或守護行程結束時移除,以先發生的事件為準。

不要將 service x start 命令傳遞給分離的容器。例如,以下命令嘗試啟動 nginx 服務。

$ docker run -d -p 80:80 my_image service nginx start

這個命令會成功在容器內啟動 nginx 服務。但是,它違反了分離容器的模式,因為根程序 (service nginx start) 會返回,並且分離的容器會按設計停止。因此,nginx 服務會啟動,但無法使用。相反地,要啟動像是 nginx 網頁伺服器這樣的程序,請執行以下操作:

$ docker run -d -p 80:80 my_image nginx -g 'daemon off;'

要與分離的容器進行輸入/輸出,請使用網路連線或共用磁碟區。這些是必要的,因為容器不再監聽執行 docker run 的命令列。

覆寫分離序列 (--detach-keys)

使用 --detach-keys 選項可以覆寫 Docker 的分離按鍵序列。如果 Docker 的預設序列與您用於其他應用程式的按鍵序列衝突,這會很有用。您可以透過兩種方式定義您自己的分離按鍵序列:作為每個容器的覆寫,或作為整個設定檔的設定屬性。

要覆寫個別容器的序列,請在 docker attach 命令中使用 --detach-keys="<sequence>" 旗標。<sequence> 的格式可以是一個字母 [a-Z],或是 ctrl- 與以下任一項組合:

  • a-z(單個小寫英文字母)
  • @(小老鼠符號)
  • [(左括號)
  • \\(兩個反斜線)
  • _(底線)
  • ^(插入符號)

actrl-aXctrl-\\ 都是有效的按鍵序列範例。要為所有容器設定不同的預設按鍵序列,請參閱 設定檔章節

將主機裝置新增到容器 (--device)

$ docker run -it --rm \
    --device=/dev/sdc:/dev/xvdc \
    --device=/dev/sdd \
    --device=/dev/zero:/dev/foobar \
    ubuntu ls -l /dev/{xvdc,sdd,foobar}

brw-rw---- 1 root disk 8, 2 Feb  9 16:05 /dev/xvdc
brw-rw---- 1 root disk 8, 3 Feb  9 16:05 /dev/sdd
crw-rw-rw- 1 root root 1, 5 Feb  9 16:05 /dev/foobar

通常需要將裝置直接公開給容器。--device 選項可以做到這一點。例如,將特定的區塊儲存裝置、迴圈裝置或音訊裝置新增到原本沒有特殊權限的容器(沒有 --privileged 旗標),並讓應用程式直接存取它。

預設情況下,容器可以對這些裝置執行 read(讀取)、write(寫入)和 mknod(建立裝置節點)。可以使用第三組 :rwm 選項覆寫每個 --device 旗標的權限。如果容器以特殊權限模式執行,則 Docker 會忽略指定的權限。

$ docker run --device=/dev/sda:/dev/xvdc --rm -it ubuntu fdisk  /dev/xvdc

Command (m for help): q
$ docker run --device=/dev/sda:/dev/xvdc:r --rm -it ubuntu fdisk  /dev/xvdc
You will not be able to write the partition table.

Command (m for help): q

$ docker run --device=/dev/sda:/dev/xvdc:rw --rm -it ubuntu fdisk  /dev/xvdc

Command (m for help): q

$ docker run --device=/dev/sda:/dev/xvdc:m --rm -it ubuntu fdisk  /dev/xvdc
fdisk: unable to open /dev/xvdc: Operation not permitted

**注意**

--device 選項不能安全地與暫時性裝置一起使用。您不應該使用 --device 將可能被移除的區塊裝置新增到不受信任的容器。

對於 Windows 系統,傳遞給 --device 選項的字串格式為 --device=<IdType>/<Id>。從 Windows Server 2019 和 Windows 10 2018 年 10 月更新版開始,Windows 僅支援 class 作為 IdType,且 Id 為 裝置介面類別 GUIDWindows 容器文件

**注意**

--device 選項僅支援行程隔離的 Windows 容器,如果容器隔離為 hyperv,則會產生錯誤。

CDI 裝置

**注意**

CDI 功能尚在實驗階段,可能會有所變更。CDI 目前僅支援 Linux 容器。

容器裝置介面 (CDI)

這會啟動一個 ubuntu 容器,並允許其存取指定的 CDI 裝置 vendor.com/class=device-name,前提是

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

--attach(或 -a)旗標會指示 docker run 繫結到容器的 STDINSTDOUTSTDERR。這使得可以根據需要操作輸出和輸入。您可以指定要連接到哪三個標準串流 (STDINSTDOUTSTDERR) 中的哪一個,如下所示

$ docker run -a stdin -a stdout -i -t ubuntu /bin/bash

以下範例將資料管道傳輸到容器中,並僅附加到容器的 STDIN 來列印容器的 ID。

$ echo "test" | docker run -i -a stdin ubuntu cat -

以下範例除非發生錯誤,否則不會在主控台中列印任何內容,因為輸出僅附加到容器的 STDERR。容器的日誌仍然會儲存寫入 STDERRSTDOUT 的內容。

$ docker run -a stderr ubuntu echo test

以下範例顯示使用 --attach 將檔案管道傳輸到容器的方法。該指令會在建置完成後列印容器的 ID,您可以使用 docker logs 擷取建置日誌。如果您需要將檔案或其他內容管道傳輸到容器中,並在容器完成執行後擷取容器的 ID,這會很有用。

$ cat somefile | docker run -i -a stdin mybuilder dobuild

**注意**

在容器內以 PID 1 執行的行程會被 Linux 特別處理:它會忽略任何具有預設動作的訊號。因此,除非程式碼中有撰寫對應處理,否則行程不會在 SIGINTSIGTERM 上終止。

另請參閱 docker cp 指令

保持 STDIN 開啟 (-i, --interactive)

--interactive(或 -i)旗標會保持容器的 STDIN 開啟,並允許您透過標準輸入將輸入傳送到容器。

$ echo hello | docker run --rm -i busybox cat
hello

-i 旗標最常與 --tty 旗標一起使用,以將容器的 I/O 串流繫結到虛擬終端機,為容器建立互動式終端機會話。請參閱 配置虛擬終端機 (pseudo-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 守護行程的系統路徑中找到的第一個 docker-init 可執行檔。這個包含在預設安裝中的 docker-init 二進位檔案是由 tini配置虛擬終端機 (pseudo-TTY) (-t, --tty)

--tty(或 -t)旗標會將虛擬終端機附加到容器,將您的終端機連接到容器的 I/O 串流。將虛擬終端機配置給容器表示您可以存取 TTY 裝置提供的輸入和輸出功能。

例如,以下指令會在 debian 容器中執行 passwd 指令,以設定 root 使用者的新密碼。

如果您只使用 -i 旗標(允許您將文字傳送到容器的 STDIN)執行此命令,passwd 提示符會以純文字顯示密碼。但是,如果您嘗試同樣的操作,但同時添加 -t 旗標,則密碼會被隱藏。

這是因為 passwd 可以使用關閉迴音的 TTY 功能來抑制字元輸出到終端機。

您可以不使用 -i 旗標而使用 -t 旗標。這仍然會為容器分配一個虛擬 TTY,但無法寫入 STDIN。只有在容器的輸出需要 TTY 環境時,這才有用。

指定自定義 cgroup

使用 --cgroup-parent 旗標,您可以傳遞一個特定的 cgroup 來運行容器。這允許您自行創建和管理 cgroup。您可以為這些 cgroup 定義自定義資源,並將容器置於共同的父群組下。

使用動態創建的設備 (--device-cgroup-rule)

Docker 在創建時會將可用的設備分配給容器。分配的設備會添加到 cgroup.allow 檔案中,並在容器運行時創建到容器中。當您需要向正在運行的容器添加新設備時,這會造成問題。

一種解決方案是向容器添加更寬鬆的規則,允許它訪問更廣泛的設備。例如,假設容器需要訪問主編號為 42 且次編號為任意數字(隨著新設備的出現而添加)的字元設備,請添加以下規則

$ docker run -d --device-cgroup-rule='c 42:* rmw' --name my-container my-image

然後,使用者可以要求 udev 執行一個腳本,該腳本會在添加所需設備時執行 docker exec my-container mknod newDevX c 42 <minor>

**注意**

您仍然需要在 docker run / docker create 命令中明確添加初始存在的設備。

訪問 NVIDIA GPU

--gpus 旗標允許您訪問 NVIDIA GPU 資源。首先,您需要安裝 nvidia-container-runtime

**注意**

您也可以使用 --device 旗標將 GPU 指定為 CDI 設備,請參閱CDI 設備

閱讀指定容器的資源以了解更多資訊。

要使用 --gpus,請指定要使用的 GPU(或全部)。如果您未提供任何值,Docker 將使用所有可用的 GPU。以下範例公開所有可用的 GPU。

$ docker run -it --rm --gpus all ubuntu nvidia-smi

使用 device 選項來指定 GPU。以下範例公開特定的 GPU。

$ docker run -it --rm --gpus device=GPU-3a23c669-1f69-c64e-cf85-44e9b07e7a2a ubuntu nvidia-smi

以下範例公開第一個和第三個 GPU。

$ docker run -it --rm --gpus '"device=0,2"' ubuntu nvidia-smi

重新啟動策略 (--restart)

使用 --restart 旗標來指定容器的*重新啟動策略*。重新啟動策略控制 Docker Daemon 在容器退出後是否重新啟動容器。Docker 支援以下重新啟動策略

旗標說明
不要自動重新啟動容器。(預設)
on-failure[:max-retries]如果容器由於錯誤(表現為非零退出代碼)而退出,則重新啟動容器。或者,使用 :max-retries 選項限制 Docker Daemon 嘗試重新啟動容器的次數。on-failure 策略僅在容器因失敗而退出時才會提示重新啟動。如果 Daemon 重新啟動,它不會重新啟動容器。
always如果容器停止,則始終重新啟動容器。如果是手動停止,則僅在 Docker Daemon 重新啟動或容器本身手動重新啟動時才會重新啟動。
unless-stoppedalways 類似,不同之處在於當容器停止(手動或其他方式)時,即使在 Docker Daemon 重新啟動後也不會重新啟動。
$ docker run --restart=always redis

這會以**始終**重新啟動策略運行 redis 容器。如果容器退出,Docker 會重新啟動它。

當容器上啟用重新啟動策略時,它會在 docker ps 中顯示為 UpRestarting。使用 docker events 來查看有效的重新啟動策略也很有用。

每次重新啟動前都會增加延遲(先前延遲的兩倍,從 100 毫秒開始),以防止伺服器氾濫。這表示 Daemon 會等待 100 毫秒,然後是 200 毫秒、400、800、1600,依此類推,直到達到 on-failure 限制(最大延遲為 1 分鐘),或者您對容器執行 docker stopdocker rm -f 為止。

如果容器成功重新啟動(容器已啟動並運行至少 10 秒),則延遲將重置為其預設值 100 毫秒。

指定重新啟動嘗試的限制

使用**on-failure** 策略時,您可以指定 Docker 嘗試重新啟動容器的最大次數。預設情況下,Docker 永遠不會停止嘗試重新啟動容器。

以下範例以**on-failure** 的重新啟動策略和最大重新啟動計數 10 運行 redis 容器。

$ docker run --restart=on-failure:10 redis

如果 redis 容器連續 10 次以上以非零退出狀態退出,Docker 將停止嘗試重新啟動容器。提供最大重新啟動限制僅對**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。僅移除未指定名稱的磁碟區。例如,運行以下命令時,會移除磁碟區 /foo,但不會移除 /bar

$ docker run --rm -v /foo -v awesome:/bar busybox top

透過 --volumes-from 繼承的磁碟區將使用相同的邏輯移除:如果原始磁碟區是用名稱指定的,則不會移除它。

將項目添加到容器 hosts 檔案 (--add-host)

您可以使用一個或多個 --add-host 旗標將其他主機添加到容器的 /etc/hosts 檔案中。此範例為名為 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 旗標支援一個特殊的 host-gateway 值,該值會解析為主機的內部 IP 地址。當您希望容器連接到主機上運行的服務時,這很有用。

習慣上使用 host.docker.internal 作為指稱 host-gateway 的主機名稱。Docker Desktop 會自動解析此主機名稱,請參閱探索網路功能

以下範例說明特殊值 host-gateway 的運作方式。此範例會執行一個 HTTP 伺服器,透過解析為主機內部 IP 的主機名稱 host.docker.internal,將主機上的檔案提供給容器。

$ echo "hello from host!" > ./hello
$ python3 -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
$ docker run \
  --add-host host.docker.internal=host-gateway \
  curlimages/curl -s host.docker.internal:8000/hello
hello from host!

--add-host 旗標也接受 : 作為分隔符號,例如

$ docker run --add-host=my-hostname:8.8.8.8 --rm -it alpine

記錄驅動程式 (--log-driver)

容器可以使用與 Docker Daemon 不同的記錄驅動程式。使用 --log-driver=<DRIVER> 搭配 docker run 指令來設定容器的記錄驅動程式。

若要了解支援的記錄驅動程式以及如何使用它們,請參閱設定記錄驅動程式

若要停用容器的記錄功能,請將 --log-driver 旗標設為 none

$ docker run --log-driver=none -d nginx:alpine
5101d3b7fe931c27c2ba0e65fd989654d297393ad65ae238f20b97a020e7295b
$ docker logs 5101d3b
Error response from daemon: configured logging driver does not support reading

在容器中設定 ulimits (--ulimit)

由於在容器中設定 ulimit 需要預設容器中沒有的額外權限,您可以使用 --ulimit 旗標進行設定。使用格式 <type>=<soft limit>[:<hard limit>] 指定 --ulimit 的軟體和硬體限制。例如

$ docker run --ulimit nofile=1024:1024 --rm debian sh -c "ulimit -n"
1024

**注意**

如果您沒有提供硬體限制值,Docker 會將軟體限制值同時用於兩個值。如果您沒有提供任何值,它們將會繼承自 Daemon 上設定的預設 ulimits

**注意**

as 選項已棄用。換句話說,不支援以下腳本

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

Docker 會將值傳送至適當的作業系統 syscall,並且不會執行任何位元組轉換。設定值時請考慮這一點。

關於 nproc 的使用

使用 ulimit 旗標設定 nproc 時要小心,因為 Linux 使用 nproc 來設定使用者可用的最大程序數,而不是容器可用的最大程序數。例如,以 daemon 使用者啟動四個容器

$ docker run -d -u daemon --ulimit nproc=3 busybox top

$ docker run -d -u daemon --ulimit nproc=3 busybox top

$ docker run -d -u daemon --ulimit nproc=3 busybox top

$ docker run -d -u daemon --ulimit nproc=3 busybox top

第四個容器會失敗並回報「[8] 系統錯誤:資源暫時不可用」錯誤。這是因為呼叫者設定了 nproc=3,導致前三個容器用盡了為 daemon 使用者設定的三個程序配額。

使用訊號停止容器 (--stop-signal)

--stop-signal 旗標會將系統呼叫訊號傳送至容器以使其退出。此訊號可以是格式為 SIG<NAME> 的訊號名稱,例如 SIGKILL,也可以是與核心 syscall 表中位置相符的無符號數字,例如 9

預設值由映像檔中的 STOPSIGNAL 定義,如果映像檔沒有定義 STOPSIGNAL,則為 SIGTERM

選用安全性選項 (--security-opt)

選項說明
--security-opt="label=user:USER"設定容器的標籤使用者
--security-opt="label=role:ROLE"設定容器的標籤角色
--security-opt="label=type:TYPE"設定容器的標籤類型
--security-opt="label=level:LEVEL"設定容器的標籤層級
--security-opt="label=disable"關閉容器的標籤限制
--security-opt="apparmor=PROFILE"設定要套用至容器的 AppArmor 設定檔
--security-opt="no-new-privileges=true"停用容器程序取得新的權限
--security-opt="seccomp=unconfined"關閉容器的 Seccomp 限制
--security-opt="seccomp=builtin"使用容器的預設(內建)Seccomp 設定檔。這可以用於啟用在已設定自定義預設設定檔或已停用 Seccomp(「unconfined」)的 Daemon 上執行的容器的 Seccomp。
--security-opt="seccomp=profile.json"將白名單系統呼叫 Seccomp JSON 檔案用作 Seccomp 過濾器
--security-opt="systempaths=unconfined"關閉容器的系統路徑限制(遮罩路徑、唯讀路徑)

--security-opt 旗標可讓您覆寫容器的預設標籤配置。在以下指令中指定層級可讓您在容器之間共用相同的內容。

$ docker run --security-opt label=level:s0:c100,c200 -it fedora bash

**注意**

不支援 MLS 標籤的自動轉譯。

若要完全停用容器的安全性標籤,您可以使用 label=disable

$ docker run --security-opt label=disable -it ubuntu bash

如果您想要對容器內的程序實施更嚴格的安全性策略,您可以指定自定義 type 標籤。以下範例執行一個僅允許在 Apache 連接埠上監聽的容器

$ docker run --security-opt label=type:svirt_apache_t -it ubuntu bash

**注意**

您必須撰寫定義 svirt_apache_t 類型的策略。

若要防止您的容器程序取得額外權限,您可以使用以下指令

$ docker run --security-opt no-new-privileges -it ubuntu bash

這表示提高權限的指令(例如 susudo)將無法運作。它還會導致任何 Seccomp 過濾器在權限降低後套用,這可能意味著您可以使用更嚴格的過濾器集。如需詳細資訊,請參閱核心文件

在 Windows 上,您可以使用 --security-opt 旗標來指定 credentialspec 選項。credentialspec 必須採用 file://spec.txtregistry://keyname 的格式。

使用逾時停止容器 (--stop-timeout)

--stop-timeout 旗標設定在傳送預先定義的(請參閱 --stop-signal)系統呼叫訊號後,等待容器停止的秒數。如果容器在逾時到期後仍未退出,則會使用 SIGKILL 訊號強制終止它。

如果您將 --stop-timeout 設為 -1,則不會套用逾時,Daemon 會無限期地等待容器退出。

Daemon 決定預設值,Linux 容器為 10 秒,Windows 容器為 30 秒。

指定容器的隔離技術 (--isolation)

當您在 Windows 上執行 Docker 容器時,此選項很有用。--isolation=<value> 選項設定容器的隔離技術。在 Linux 上,唯一支援的選項是使用 Linux 命名空間的 default 選項。這兩個指令在 Linux 上是等效的

$ docker run -d busybox top
$ docker run -d --isolation default busybox top

在 Windows 上,--isolation 可以採用以下其中一個值

說明
default使用 Docker Daemon 的 --exec-opt 或系統預設值指定的值(請參閱下文)。
process共用核心命名空間隔離。
hypervHyper-V 虛擬機器管理程式分割區隔離。

Windows 伺服器作業系統上的預設隔離是 process,而 Windows 用戶端作業系統(例如 Windows 10)上的預設隔離是 hyperv。程序隔離具有更好的效能,但需要映像檔和主機使用相同的核心版本。

在 Windows 伺服器上,假設為預設設定,這些指令是等效的,並會導致 process 隔離

PS C:\> docker run -d microsoft/nanoserver powershell echo process
PS C:\> docker run -d --isolation default microsoft/nanoserver powershell echo process
PS C:\> docker run -d --isolation process microsoft/nanoserver powershell echo process

如果您在 Docker daemon 上設定了 --exec-opt isolation=hyperv 選項,或者正在針對基於 Windows 用戶端的 Daemon 執行,則這些指令是等效的,並會導致 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 上,這會根據您使用的隔離類型以不同的方式影響容器。

在執行階段設定具有命名空間的核心參數 (sysctl) (--sysctl)

--sysctl 可在容器中設定具有命名空間的核心參數 (sysctl)。例如,若要在容器的網路命名空間中開啟 IP 轉送,請執行以下指令

$ docker run --sysctl net.ipv4.ip_forward=1 someimage

**注意**

並非所有 sysctl 都有命名空間。Docker 不支援在容器內更改也會修改主機系統的 sysctl。隨著核心不斷發展,我們預計會有更多 sysctl 具有命名空間。

目前支援的 sysctl

IPC 命名空間

網路命名空間