docker container run
說明 | 從映像檔建立並執行新的容器 |
---|---|
用法 | docker container run [選項] 映像檔 [指令] [參數...] |
別名 | docker run |
說明
docker run
指令會在新容器中執行指令,如果需要,會提取映像檔並啟動容器。
您可以使用 docker start
重新啟動已停止的容器,並保留所有先前的變更。使用 docker ps -a
可以檢視所有容器的清單,包括已停止的容器。
選項
選項 | 預設值 | 說明 |
---|---|---|
--add-host | 新增自訂主機到 IP 的映射(主機:ip) | |
--annotation | API 1.43+ 新增註釋到容器(傳遞到 OCI 執行階段) | |
-a, --attach | 附加到 STDIN、STDOUT 或 STDERR | |
--blkio-weight | 區塊 IO(相對權重),介於 10 到 1000 之間,或 0 表示停用(預設值為 0) | |
--blkio-weight-device | 區塊 IO 權重(相對裝置權重) | |
--cap-add | 新增 Linux 功能 | |
--cap-drop | 捨棄 Linux 功能 | |
--cgroup-parent | 容器的選用父 cgroup | |
--cgroupns | API 1.41+ 要使用的 Cgroup 命名空間 (host|private) 'host': 在 Docker 主機的 cgroup 命名空間中執行容器 'private': 在容器自己的私有 cgroup 命名空間中執行容器 '': 使用由 daemon 上的 default-cgroupns-mode 選項設定的 cgroup 命名空間 (預設) | |
--cidfile | 將容器 ID 寫入檔案 | |
--cpu-count | CPU 個數(僅限 Windows) | |
--cpu-percent | CPU 百分比(僅限 Windows) | |
--cpu-period | 限制 CPU CFS(完全公平排程器)週期 | |
--cpu-quota | 限制 CPU CFS(完全公平排程器)配額 | |
--cpu-rt-period | API 1.25+ 限制 CPU 即時週期(以微秒為單位) | |
--cpu-rt-runtime | API 1.25+ 限制 CPU 即時執行時間(以微秒為單位) | |
-c, --cpu-shares | CPU 共享(相對權重) | |
--cpus | API 1.25+ CPU 數量 | |
--cpuset-cpus | 允許執行的 CPU (0-3, 0,1) | |
--cpuset-mems | 允許執行的記憶體 (0-3, 0,1) | |
-d, --detach | 在背景執行容器並印出容器 ID | |
--detach-keys | 覆寫分離容器的按鍵順序 | |
--device | 將主機裝置新增到容器 | |
--device-cgroup-rule | 將規則新增到 cgroup 允許的裝置清單 | |
--device-read-bps | 限制從裝置讀取的速率(每秒位元組數) | |
--device-read-iops | 限制從裝置讀取的速率(每秒 IO 次數) | |
--device-write-bps | 限制寫入裝置的速率(每秒位元組數) | |
--device-write-iops | 限制寫入裝置的速率(每秒 IO 次數) | |
--disable-content-trust | true | 略過映像檔驗證 |
--dns | 設定自訂 DNS 伺服器 | |
--dns-option | 設定 DNS 選項 | |
--dns-search | 設定自訂 DNS 搜尋網域 | |
--domainname | 容器 NIS 網域名稱 | |
--entrypoint | 覆寫映像檔的預設 ENTRYPOINT | |
-e, --env | 設定環境變數 | |
--env-file | 讀取環境變數檔案 | |
--expose | 公開一個埠或一個埠範圍 | |
--gpus | API 1.40+ 要加入容器的 GPU 裝置('all' 表示傳遞所有 GPU) | |
--group-add | 加入額外的群組 | |
--health-cmd | 用於檢查健康的指令 | |
--health-interval | 執行檢查的間隔時間 (毫秒|秒|分|小時) (預設 0 秒) | |
--health-retries | 回報不健康的連續失敗次數 | |
--health-start-interval | API 1.44+ 啟動期間執行檢查的間隔時間 (毫秒|秒|分|小時) (預設 0 秒) | |
--health-start-period | API 1.29+ 容器在開始 health-retries 倒數計時之前的初始化啟動期間 (毫秒|秒|分|小時) (預設 0 秒) | |
--health-timeout | 允許單次檢查執行的最長時間 (毫秒|秒|分|小時) (預設 0 秒) | |
--help | 顯示使用方法 | |
-h, --hostname | 容器主機名稱 | |
--init | API 1.25+ 在容器內執行一個 init 程序,用於轉發訊號和回收子程序 | |
-i, --interactive | 即使未附加,也保持 STDIN 開啟 | |
--io-maxbandwidth | 系統磁碟機的最大 IO 頻寬限制 (僅限 Windows) | |
--io-maxiops | 系統磁碟機的最大 IOps 限制 (僅限 Windows) | |
--ip | IPv4 位址 (例如:172.30.100.104) | |
--ip6 | IPv6 位址 (例如:2001:db8::33) | |
--ipc | 要使用的 IPC 模式 | |
--isolation | 容器隔離技術 | |
--kernel-memory | 核心記憶體限制 | |
-l, --label | 設定容器的元數據 | |
--label-file | 讀取以換行符號分隔的標籤檔案 | |
--link | 新增連結到另一個容器 | |
--link-local-ip | 容器 IPv4/IPv6 鏈路本地位址 | |
--log-driver | 容器的日誌驅動程式 | |
--log-opt | 日誌驅動程式選項 | |
--mac-address | 容器 MAC 位址 (例如:92:d0:c6:0a:29:33) | |
-m, --memory | 記憶體限制 | |
--memory-reservation | 記憶體軟限制 | |
--memory-swap | 交換空間限制等於記憶體加上交換空間:'-1' 表示啟用無限制交換空間 | |
--memory-swappiness | -1 | 調整容器記憶體交換頻率 (0 到 100) |
--mount | 將檔案系統掛載到容器 | |
--name | 指定容器的名稱 | |
--network | 將容器連接到網路 | |
--network-alias | 為容器新增網路範圍的別名 | |
--no-healthcheck | 停用任何容器指定的 HEALTHCHECK | |
--oom-kill-disable | 停用 OOM Killer | |
--oom-score-adj | 調整主機的 OOM 偏好設定 (-1000 到 1000) | |
--pid | 要使用的 PID 命名空間 | |
--pids-limit | 調整容器 pids 限制 (設定 -1 表示無限制) | |
--platform | API 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-proxy | true | 將接收到的訊號代理到程序 |
--stop-signal | 停止容器的訊號 | |
--stop-timeout | API 1.25+ 停止容器的逾時時間(以秒為單位) | |
--storage-opt | 容器的儲存驅動程式選項 | |
--sysctl | Sysctl 選項 | |
--tmpfs | 掛載 tmpfs 目錄 | |
-t, --tty | 配置一個偽終端 (pseudo-TTY) | |
--ulimit | Ulimit 選項 | |
-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`
使用
--pid=host
選項執行 alpine 容器$ docker run --rm -it --pid=host alpine
在容器中安裝
htop
/ # apk add --quiet htop
執行
htop
命令。/ # htop
範例:加入另一個容器的 PID 命名空間
加入另一個容器的 PID 命名空間對於除錯該容器很有用。
啟動一個執行 Redis 伺服器的容器
$ docker run --rm --name my-nginx -d nginx:alpine
執行一個 Alpine 容器,將
--pid
命名空間附加到my-nginx
容器$ docker run --rm -it --pid=container:my-nginx \ --cap-add SYS_PTRACE \ --security-opt seccomp=unconfined \ alpine
在 Alpine 容器中安裝
strace
/ # apk add strace
附加到程序 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。此選項僅適用於 btrfs
、overlay2
、windowsfilter
和 zfs
儲存驅動程式。
對於 overlay2
儲存驅動程式,僅當後端檔案系統為 xfs
並使用 pquota
掛載選項掛載時,大小選項才可用。在這些條件下,您可以傳遞任何小於後端檔案系統大小的大小。
對於 windowsfilter
、btrfs
和 zfs
儲存驅動程式,您不能傳遞小於預設 BaseFS 大小的值。
掛載 tmpfs (--tmpfs)
--tmpfs
旗標允許您建立 tmpfs
掛載。
您可以傳遞給 --tmpfs
的選項與 Linux mount -t tmpfs -o
命令相同。以下範例使用 rw
、noexec
、nosuid
、size=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
。您也可以指定 udp
和 sctp
連接埠。網路概覽頁面 詳細說明瞭如何使用 Docker 發佈連接埠。
**注意**
如果您在發佈容器的連接埠時未指定 IP 位址(例如,使用
-p 80:80
而不是-p 127.0.0.1:80:80
),Docker 預設會在所有介面(位址0.0.0.0
)上發佈該連接埠。這些連接埠可從外部存取。即使您已將 UFW 設定為封鎖此特定連接埠,這也適用,因為 Docker 會管理自己的 iptables 規則。了解更多
$ docker run --expose 80 nginx:alpine
這會公開容器的 80
連接埠,但不會將連接埠發佈到主機系統的介面。
發佈所有公開的連接埠 (-P, --publish-all)
$ docker run -P nginx:alpine
-P
或 --publish-all
旗標會將所有公開的連接埠發佈到主機。Docker 會將每個公開的連接埠繫結到主機上的隨機連接埠。
-P
旗標僅發佈明確標記為公開的連接埠號,可以使用 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 位址) | --ip | IPv4 位址 (例如:172.30.100.104) |
ip6(IPv6 位址) | --ip6 | IPv6 位址 (例如: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=1
和 net.ipv4.conf.eth0.forwarding=0
,並分配 IPv4 位址 192.0.2.42
。
$ docker network create --subnet 192.0.2.0/24 my-net
$ docker run -itd --network=name=my-net,\"driver-opt=com.docker.network.endpoint.sysctls=net.ipv4.conf.IFNAME.log_martians=1,net.ipv4.conf.IFNAME.forwarding=0\",ip=192.0.2.42 busybox
**注意**
網路驅動程式可能會限制可以修改的 sysctl 設定,並且為了保護網路的運作,未來可能會新增更多限制。
有關在使用 run
命令時將容器連接到網路的更多資訊,請參閱 Docker 網路概觀。
從容器掛載磁碟區 (--volumes-from)
$ docker run --volumes-from 777f7dc92da7 --volumes-from ba8c0c54f0f2:ro -i -t ubuntu pwd
--volumes-from
旗標會掛載參考容器中所有已定義的磁碟區。您可以透過重複使用 --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
(單個小寫英文字母)@
(小老鼠符號)[
(左括號)\\
(兩個反斜線)_
(底線)^
(插入符號)
a
、ctrl-a
、X
或 ctrl-\\
都是有效的按鍵序列範例。要為所有容器設定不同的預設按鍵序列,請參閱 設定檔章節。
將主機裝置新增到容器 (--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 為 裝置介面類別 GUID