dockerd
守護程序
Usage: dockerd [OPTIONS]
A self-sufficient runtime for containers.
Options:
--add-runtime runtime Register an additional OCI compatible runtime (default [])
--allow-direct-routing Allow remote access to published ports on container IP addresses
--authorization-plugin list Authorization plugins to load
--bip string IPv4 address for the default bridge
--bip6 string IPv6 address for the default bridge
-b, --bridge string Attach containers to a network bridge
--cdi-spec-dir list CDI specification directories to use
--cgroup-parent string Set parent cgroup for all containers
--config-file string Daemon configuration file (default "/etc/docker/daemon.json")
--containerd string containerd grpc address
--containerd-namespace string Containerd namespace to use (default "moby")
--containerd-plugins-namespace string Containerd namespace to use for plugins (default "plugins.moby")
--cpu-rt-period int Limit the CPU real-time period in microseconds for the
parent cgroup for all containers (not supported with cgroups v2)
--cpu-rt-runtime int Limit the CPU real-time runtime in microseconds for the
parent cgroup for all containers (not supported with cgroups v2)
--cri-containerd start containerd with cri
--data-root string Root directory of persistent Docker state (default "/var/lib/docker")
-D, --debug Enable debug mode
--default-address-pool pool-options Default address pools for node specific local networks
--default-cgroupns-mode string Default mode for containers cgroup namespace ("host" | "private") (default "private")
--default-gateway ip Default gateway IPv4 address for the default bridge network
--default-gateway-v6 ip Default gateway IPv6 address for the default bridge network
--default-ipc-mode string Default mode for containers ipc ("shareable" | "private") (default "private")
--default-network-opt mapmap Default network options (default map[])
--default-runtime string Default OCI runtime for containers (default "runc")
--default-shm-size bytes Default shm size for containers (default 64MiB)
--default-ulimit ulimit Default ulimits for containers (default [])
--dns list DNS server to use
--dns-opt list DNS options to use
--dns-search list DNS search domains to use
--exec-opt list Runtime execution options
--exec-root string Root directory for execution state files (default "/var/run/docker")
--experimental Enable experimental features
--feature map Enable feature in the daemon
--fixed-cidr string IPv4 subnet for the default bridge network
--fixed-cidr-v6 string IPv6 subnet for the default bridge network
-G, --group string Group for the unix socket (default "docker")
--help Print usage
-H, --host list Daemon socket(s) to connect to
--host-gateway-ip list IP addresses that the special 'host-gateway' string in --add-host resolves to.
Defaults to the IP addresses of the default bridge
--http-proxy string HTTP proxy URL to use for outgoing traffic
--https-proxy string HTTPS proxy URL to use for outgoing traffic
--icc Enable inter-container communication for the default bridge network (default true)
--init Run an init in the container to forward signals and reap processes
--init-path string Path to the docker-init binary
--insecure-registry list Enable insecure registry communication
--ip ip Host IP for port publishing from the default bridge network (default 0.0.0.0)
--ip-forward Enable IP forwarding in system configuration (default true)
--ip-forward-no-drop Do not set the filter-FORWARD policy to DROP when enabling IP forwarding
--ip-masq Enable IP masquerading for the default bridge network (default true)
--ip6tables Enable addition of ip6tables rules (default true)
--iptables Enable addition of iptables rules (default true)
--ipv6 Enable IPv6 networking for the default bridge network
--label list Set key=value labels to the daemon
--live-restore Enable live restore of docker when containers are still running
--log-driver string Default driver for container logs (default "json-file")
--log-format string Set the logging format ("text"|"json") (default "text")
-l, --log-level string Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info")
--log-opt map Default log driver options for containers (default map[])
--max-concurrent-downloads int Set the max concurrent downloads (default 3)
--max-concurrent-uploads int Set the max concurrent uploads (default 5)
--max-download-attempts int Set the max download attempts for each pull (default 5)
--metrics-addr string Set default address and port to serve the metrics api on
--mtu int Set the MTU for the default "bridge" network (default 1500)
--network-control-plane-mtu int Network Control plane MTU (default 1500)
--no-new-privileges Set no-new-privileges by default for new containers
--no-proxy string Comma-separated list of hosts or IP addresses for which the proxy is skipped
--node-generic-resource list Advertise user-defined resource
-p, --pidfile string Path to use for daemon PID file (default "/var/run/docker.pid")
--raw-logs Full timestamps without ANSI coloring
--registry-mirror list Preferred registry mirror
--rootless Enable rootless mode; typically used with RootlessKit
--seccomp-profile string Path to seccomp profile. Set to "unconfined" to disable the default seccomp profile (default "builtin")
--selinux-enabled Enable selinux support
--shutdown-timeout int Set the default shutdown timeout (default 15)
-s, --storage-driver string Storage driver to use
--storage-opt list Storage driver options
--swarm-default-advertise-addr string Set default address or interface for swarm advertised address
--tls Use TLS; implied by --tlsverify
--tlscacert string Trust certs signed only by this CA (default "~/.docker/ca.pem")
--tlscert string Path to TLS certificate file (default "~/.docker/cert.pem")
--tlskey string Path to TLS key file (default "~/.docker/key.pem")
--tlsverify Use TLS and verify the remote
--userland-proxy Use userland proxy for loopback traffic (default true)
--userland-proxy-path string Path to the userland proxy binary
--userns-remap string User/Group setting for user namespaces
--validate Validate daemon configuration and exit
-v, --version Print version information and quit帶有 [] 的選項可以指定多次。
描述
dockerd 是管理容器的持久性程序。Docker 為守護程序和客戶端使用不同的二進制檔。要執行守護程序,請輸入 dockerd。
若要以偵錯輸出執行守護程序,請使用 dockerd --debug 或將 "debug": true 新增至 daemon.json 檔案。
注意啟用實驗性功能
透過使用
--experimental旗標啟動dockerd或將"experimental": true新增至daemon.json檔案來啟用實驗性功能。
環境變數
dockerd 守護程序支援以下環境變數列表。其中一些環境變數同時受 Docker 守護程序和 docker CLI 支援。請參閱 環境變數 以了解 docker CLI 支援的環境變數。
| 變數 | 描述 |
|---|---|
DOCKER_CERT_PATH | 您的驗證金鑰位置。此變數同時受 docker CLI 和 dockerd 守護程序使用。 |
DOCKER_DRIVER | 要使用的儲存驅動程式。 |
DOCKER_RAMDISK | 如果設定,這將禁用 pivot_root。 |
DOCKER_TLS_VERIFY | 設定時,Docker 會使用 TLS 並驗證遠端。此變數同時受 docker CLI 和 dockerd 守護程序使用。 |
DOCKER_TMPDIR | 守護程序建立的暫存檔案位置。 |
HTTP_PROXY | 除非被 NoProxy 覆寫,否則為 HTTP 請求的代理 URL。詳情請參閱 Go 規範。 |
HTTPS_PROXY | 除非被 NoProxy 覆寫,否則為 HTTPS 請求的代理 URL。詳情請參閱 Go 規範。 |
MOBY_DISABLE_PIGZ | 禁用使用 unpigz 在提取映像時平行解壓縮層,即使已安裝亦然。 |
NO_PROXY | 逗號分隔的值,指定應從代理中排除的主機。詳情請參閱 Go 規範。 |
範例
代理設定
注意如果您正在執行 Docker Desktop,請參閱 Docker Desktop 手冊。
如果您在 HTTP 代理伺服器後方,例如在企業環境中,您可能需要設定 Docker 守護程序以使用代理伺服器來執行提取和推送映像等操作。守護程序可以透過三種方式進行設定:
- 使用環境變數(
HTTP_PROXY、HTTPS_PROXY和NO_PROXY)。 - 在 守護程序組態檔 中使用
http-proxy、https-proxy和no-proxy欄位(Docker Engine 23.0 版或更高版本)。 - 使用
--http-proxy、--https-proxy和--no-proxy命令列選項。(Docker Engine 23.0 版或更高版本)。
命令列和組態檔選項優先於環境變數。請參閱 使用 systemd 控制和設定 Docker 以了解如何在使用 systemd 的主機上設定這些環境變數。
守護程序通訊端選項
Docker 守護程序可以透過三種不同類型的通訊端監聽 Docker Engine API 請求:unix、tcp 和 fd。
依預設,會在 /var/run/docker.sock 建立一個 unix 網域通訊端(或 IPC 通訊端),需要 root 權限或 docker 群組成員資格。
如果您需要遠端存取 Docker 守護程序,您需要啟用 TCP 通訊端。使用 TCP 通訊端時,Docker 守護程序依預設提供對 Docker 守護程序的未加密和未驗證直接存取。您應該使用 內建的 HTTPS 加密通訊端 或在其前方放置安全的網路代理來保護守護程序。您可以使用 -H tcp://0.0.0.0:2375 在所有網路介面上監聽連接埠 2375,或使用其 IP 位址在特定網路介面上監聽:-H tcp://192.168.59.103:2375。習慣上使用連接埠 2375 進行未加密通訊,連接埠 2376 進行與守護程序的加密通訊。
注意如果您正在使用 HTTPS 加密通訊端,請記住僅支援 TLS 1.0 版及更高版本。基於安全考量,不支援 SSLv3 及以下協定。
在基於 systemd 的系統上,您可以使用 dockerd -H fd:// 透過 systemd 通訊端啟用 與守護程序通訊。使用 fd:// 適用於大多數設定,但您也可以指定個別通訊端:dockerd -H fd://3。如果找不到指定的通訊端啟動檔案,守護程序將會退出。您可以在 Docker 原始碼樹 中找到將 systemd 通訊端啟用與 Docker 和 systemd 一起使用的範例。
您可以使用多個 -H 選項同時設定 Docker 守護程序監聽多個通訊端。
以下範例執行守護程序,監聽預設的 Unix 通訊端以及此主機上的 2 個特定 IP 位址。
$ sudo dockerd -H unix:///var/run/docker.sock -H tcp://192.168.59.106 -H tcp://10.10.10.2
Docker 客戶端遵循 DOCKER_HOST 環境變數以設定客戶端的 -H 旗標。請使用以下命令中的一個:
$ docker -H tcp://0.0.0.0:2375 ps
$ export DOCKER_HOST="tcp://0.0.0.0:2375"
$ docker ps
將 DOCKER_TLS_VERIFY 環境變數設定為非空字串的任何值,等同於設定 --tlsverify 旗標。以下兩者等效:
$ docker --tlsverify ps
# or
$ export DOCKER_TLS_VERIFY=1
$ docker ps
Docker 客戶端遵循 HTTP_PROXY、HTTPS_PROXY 和 NO_PROXY 環境變數(或其小寫版本)。HTTPS_PROXY 優先於 HTTP_PROXY。
Docker 客戶端支援透過 SSH 連接到遠端守護程序。
$ docker -H ssh://me@example.com:22/var/run/docker.sock ps
$ docker -H ssh://me@example.com:22 ps
$ docker -H ssh://me@example.com ps
$ docker -H ssh://example.com ps
要使用 SSH 連線,您需要設定 ssh 以便能夠透過公開金鑰驗證到達遠端主機。不支援密碼驗證。如果您的金鑰受密碼保護,您需要設定 ssh-agent。
將 Docker 綁定到另一個主機/連接埠或 Unix 通訊端
警告將預設的
docker守護程序綁定更改為 TCP 連接埠或 Unixdocker使用者群組會引入安全風險,因為它可能允許非 root 使用者在主機上獲得 root 存取權。請確保您控制對docker的存取。如果您綁定到 TCP 連接埠,任何有權存取該連接埠的人都擁有完整的 Docker 存取權;因此不建議在開放網路中使用。
使用 -H 可以讓 Docker 守護程序監聽特定 IP 和連接埠。依預設,它會監聽 unix:///var/run/docker.sock 以僅允許 root 使用者的本機連線。您可以將其設定為 0.0.0.0:2375 或特定主機 IP 以授予所有人存取權,但不建議這樣做,因為有人可能獲得執行守護程序的主機上的 root 存取權。
同樣地,Docker 客戶端可以使用 -H 連接到自訂連接埠。Docker 客戶端在 Linux 上預設連接到 unix:///var/run/docker.sock,在 Windows 上預設連接到 tcp://127.0.0.1:2376。
-H 接受以下格式的主機和連接埠指定:
tcp://[host]:[port][path] or unix://path例如
tcp://-> 當 TLS 加密開啟時,TCP 連接到127.0.0.1上的連接埠2376,或當通訊為純文字時,連接到連接埠2375。tcp://host:2375-> 在 host:2375 上的 TCP 連線tcp://host:2375/path-> 在 host:2375 上的 TCP 連線並將路徑前置到所有請求unix://path/to/socket-> 位於path/to/socket的 Unix 通訊端
-H 在為空時,預設值與未傳遞 -H 時相同。
-H 也接受 TCP 綁定的簡寫形式:host: 或 host:port 或 :port
在守護程序模式下執行 Docker
$ sudo <path to>/dockerd -H 0.0.0.0:5555 &
下載 ubuntu 映像
$ docker -H :5555 pull ubuntu
您可以使用多個 -H,例如,如果您想同時監聽 TCP 和 Unix 通訊端。
$ sudo dockerd -H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock &
# Download an ubuntu image, use default Unix socket
$ docker pull ubuntu
# OR use the TCP port
$ docker -H tcp://127.0.0.1:2375 pull ubuntu
守護程序儲存驅動程式
在 Linux 上,Docker 守護程序支援多種不同的映像層儲存驅動程式:overlay2、fuse-overlayfs、btrfs 和 zfs。
overlay2 是所有目前支援的 Linux 發行版的首選儲存驅動程式,並依預設選擇。除非使用者有充分理由偏好其他儲存驅動程式,否則應使用 overlay2。
您可以在 選擇儲存驅動程式 中找到有關儲存驅動程式以及如何選擇驅動程式的更多資訊。
在 Windows 上,Docker 守護程序僅支援 windowsfilter 儲存驅動程式。
每個儲存驅動程式的選項
特定儲存驅動程式可以使用 --storage-opt 旗標指定的選項進行設定。zfs 的選項以 zfs 開頭,btrfs 的選項以 btrfs 開頭。
ZFS 選項
zfs.fsname
指定守護程序應使用以建立其資料集的 ZFS 檔案系統。依預設,會使用 /var/lib/docker 中的 ZFS 檔案系統。
範例
$ sudo dockerd -s zfs --storage-opt zfs.fsname=zroot/docker
Btrfs 選項
btrfs.min_space
指定建立用於容器的子磁區時要使用的最小大小。如果使用者在建立或執行容器時使用 --storage-opt size 選項為 btrfs 使用磁碟配額,Docker 應確保大小不能小於 btrfs.min_space。
範例
$ sudo dockerd -s btrfs --storage-opt btrfs.min_space=10G
Overlay2 選項
overlay2.size
設定容器的預設最大大小。僅當後端檔案系統為 xfs 並以 pquota 掛載選項掛載時才支援。在這些條件下,使用者可以傳遞任何小於後端檔案系統大小的值。
範例
$ sudo dockerd -s overlay2 --storage-opt overlay2.size=1G
Windowsfilter 選項
大小
指定建立用於容器的沙箱時要使用的大小。預設為 20G。
範例
C:\> dockerd --storage-opt size=40G執行時選項
Docker 守護程序依賴符合 OCI 標準的執行時(透過 containerd 守護程序調用),作為其與 Linux 核心 namespaces、cgroups 和 SELinux 的介面。
配置容器執行時
依預設,Docker 守護程序使用 runc 作為容器執行時。您可以設定守護程序以新增額外的執行時。
安裝在 PATH 上的 containerd shim 可以直接使用,無需編輯守護程序的組態。例如,如果您在 PATH 上安裝 Kata Containers shim (containerd-shim-kata-v2),那麼您可以使用 docker run 選取該執行時,而無需編輯守護程序的組態。
$ docker run --runtime io.containerd.kata.v2
不實作 containerd shim 的容器執行時,或安裝在 PATH 之外的 containerd shim,必須透過組態檔或使用 --add-runtime 命令列旗標向守護程序註冊。
有關如何使用其他容器執行時的範例,請參閱 替代容器執行時
使用 daemon.json 配置執行時
若要使用守護程序的組態檔註冊和配置容器執行時,請將執行時作為條目新增至 runtimes 下方。
{
"runtimes": {
"<runtime>": {}
}
}條目的鍵(上一個範例中的 <runtime>)代表執行時的名稱。這是您在執行容器時,使用 docker run --runtime <runtime> 參考的名稱。
執行時條目包含一個物件,用於指定您執行時的組態。物件的屬性取決於您要註冊哪種類型的執行時。
如果執行時實作自己的 containerd shim,則物件應包含一個
runtimeType欄位和一個可選的options欄位。{ "runtimes": { "<runtime>": { "runtimeType": "<name-or-path>", "options": {} } } }請參閱 配置 shim。
如果執行時設計為 runc 的即時替換,則物件包含一個
path欄位和一個可選的runtimeArgs欄位。{ "runtimes": { "<runtime>": { "path": "/path/to/bin", "runtimeArgs": ["...args"] } } }請參閱 配置 runc 即時替換。
在組態檔中更改執行時組態後,您必須重新載入或重新啟動守護程序才能使更改生效。
$ sudo systemctl reload dockerd
配置 containerd shim
如果您要註冊的執行時實作 containerd shim,或者您想註冊使用 runc shim 的執行時,請對執行時條目使用以下格式:
{
"runtimes": {
"<runtime>": {
"runtimeType": "<name-or-path>",
"options": {}
}
}
}runtimeType 指的是以下其中一種:
containerd shim 的完整合格名稱。
shim 的完整合格名稱與用於在 containerd 的 CRI 組態中註冊執行時的
runtime_type相同。例如,io.containerd.runsc.v1。containerd shim 二進制檔的路徑。
如果您將 containerd shim 二進制檔安裝在
PATH之外,此選項很有用。
options 是可選的。它讓您可以指定要用於 shim 的執行時組態。您可以在 options 中指定的組態參數取決於您要註冊的執行時。對於大多數 shim,支援的組態選項是 TypeUrl 和 ConfigPath。例如:
{
"runtimes": {
"gvisor": {
"runtimeType": "io.containerd.runsc.v1",
"options": {
"TypeUrl": "io.containerd.runsc.v1.options",
"ConfigPath": "/etc/containerd/runsc.toml"
}
}
}
}您可以使用相同的 runtimeType 配置多個執行時。例如:
{
"runtimes": {
"gvisor-foo": {
"runtimeType": "io.containerd.runsc.v1",
"options": {
"TypeUrl": "io.containerd.runsc.v1.options",
"ConfigPath": "/etc/containerd/runsc-foo.toml"
}
},
"gvisor-bar": {
"runtimeType": "io.containerd.runsc.v1",
"options": {
"TypeUrl": "io.containerd.runsc.v1.options",
"ConfigPath": "/etc/containerd/runsc-bar.toml"
}
}
}
}當與 "runtimeType": "io.containerd.runc.v2" 一起使用時,options 欄位會採用一組特殊的組態參數。有關 runc 參數的更多資訊,請參閱 CRI 外掛程式組態指南 中的 runc 組態部分。
配置 runc 即時替換
如果您要註冊的執行時可以作為 runc 的即時替換,您可以透過守護程序組態檔或使用 dockerd CLI 的 --add-runtime 旗標來註冊該執行時。
當您使用組態檔時,條目使用以下格式:
{
"runtimes": {
"<runtime>": {
"path": "/path/to/binary",
"runtimeArgs": ["...args"]
}
}
}其中 path 是執行時可執行檔的絕對路徑,或是安裝在 PATH 上的可執行檔名稱。
{
"runtimes": {
"runc": {
"path": "runc"
}
}
}而 runtimeArgs 讓您可以選擇性地將額外參數傳遞給執行時。具有此格式的條目使用 containerd runc shim 來調用自訂執行時二進制檔。
當您使用 --add-runtime CLI 旗標時,請使用以下格式:
$ sudo dockerd --add-runtime <runtime>=<path>
不支援透過命令列定義執行時參數。
有關 runc 即時替換的範例組態,請參閱 替代容器執行時 > youki
配置預設容器執行時
您可以指定 containerd 執行時 shim 的完整合格名稱,或已註冊執行時的名稱。您可以透過守護程序組態檔,或使用 dockerd CLI 的 --default-runtime 旗標來指定預設執行時。
當您使用組態檔時,條目使用以下格式:
{
"default-runtime": "io.containerd.runsc.v1"
}當您使用 --default-runtime CLI 旗標時,請使用以下格式:
$ dockerd --default-runtime io.containerd.runsc.v1
獨立執行 containerd
依預設,Docker 守護程序會自動啟動 containerd。如果您想控制 containerd 啟動,請手動啟動 containerd 並使用 --containerd 旗標傳遞 containerd 通訊端路徑。例如:
$ sudo dockerd --containerd /run/containerd/containerd.sock
配置 cgroup 驅動程式
您可以使用 --exec-opt native.cgroupdriver CLI 旗標來配置執行時應如何管理容器 cgroup。
您只能指定 cgroupfs 或 systemd。如果您指定 systemd 且其不可用,系統將會報錯。如果您省略 native.cgroupdriver 選項,則在 cgroup v1 主機上使用 cgroupfs,在 cgroup v2 主機且 systemd 可用時使用 systemd。
此範例將 cgroupdriver 設定為 systemd。
$ sudo dockerd --exec-opt native.cgroupdriver=systemd
設定此選項會應用於守護程序啟動的所有容器。
配置容器隔離技術 (Windows)
對於 Windows 容器,您可以使用 --exec-opt isolation 旗標指定要使用的預設容器隔離技術。
以下範例使 hyperv 成為預設的隔離技術。
> dockerd --exec-opt isolation=hyperv
如果在守護程序啟動時未指定隔離值,在 Windows 客戶端上,預設為 hyperv,在 Windows 伺服器上,預設為 process。
守護程序 DNS 選項
要為所有 Docker 容器設定 DNS 伺服器,請使用:
$ sudo dockerd --dns 8.8.8.8
要為所有 Docker 容器設定 DNS 搜尋網域,請使用:
$ sudo dockerd --dns-search example.com
不安全的註冊表
在此部分中,「registry」指的是私有註冊表,而 myregistry:5000 是私有註冊表的佔位符範例。
Docker 將私有註冊表分為安全或不安全。安全註冊表使用 TLS,其 CA 憑證副本放置在 Docker 主機的 /etc/docker/certs.d/myregistry:5000/ca.crt。不安全註冊表則是不使用 TLS(即,監聽純文字 HTTP),或是使用 Docker 守護程序未知的 CA 憑證進行 TLS。後者可能發生在憑證未在 /etc/docker/certs.d/myregistry:5000/ 下找到,或憑證驗證失敗(即,錯誤的 CA)時。
依預設,Docker 假設所有註冊表都是安全的,除了本機註冊表。如果 Docker 假設某個註冊表是安全的,則無法與不安全註冊表通訊。為了與不安全註冊表通訊,Docker 守護程序需要以下兩種形式之一的 --insecure-registry:
--insecure-registry myregistry:5000告訴 Docker 守護程序,myregistry:5000 應被視為不安全。--insecure-registry 10.1.0.0/16告訴 Docker 守護程序,所有網域解析為 IP 位址屬於 CIDR 語法描述的子網路的註冊表,都應被視為不安全。
該旗標可以使用多次,以允許將多個註冊表標記為不安全。
如果未將不安全註冊表標記為不安全,docker pull、docker push 和 docker search 將會導致錯誤訊息,提示使用者要嘛保護或依照上述說明將 --insecure-registry 旗標傳遞給 Docker 守護程序。
從 Docker 1.3.2 版開始,IP 位址落在 127.0.0.0/8 範圍內的本機註冊表會自動標記為不安全。不建議依賴此設定,因為未來可能會更改。
啟用 --insecure-registry,即允許未加密和/或不受信任的通訊,在執行本機註冊表時會很有用。然而,由於其使用會產生安全漏洞,因此僅應為測試目的啟用。為了提高安全性,使用者應將其 CA 新增到其系統的信任 CA 列表,而不是啟用 --insecure-registry。
舊版註冊表
不再支援僅支援舊版 v1 協定的註冊表操作。具體來說,守護程序不會嘗試推送、提取或登入 v1 註冊表。例外情況是 search,它仍可在 v1 註冊表上執行。
在 HTTPS_PROXY 後方執行 Docker 守護程序
在內部網路中使用 HTTPS 代理時,代理的憑證會取代 Docker Hub 的憑證。這些憑證必須新增到您的 Docker 主機組態中:
- 為您的發行版安裝
ca-certificates套件。 - 向您的網路管理員索取代理的 CA 憑證,並將其附加到
/etc/pki/tls/certs/ca-bundle.crt。 - 然後使用
HTTPS_PROXY=http://username:password@proxy:port/ dockerd啟動您的 Docker 守護程序。username:和password@是可選的 - 僅當您的代理設定為需要驗證時才需要。
這只會將代理和驗證新增到 Docker 守護程序的請求中。要在建置映像和執行容器時使用代理,請參閱 配置 Docker 使用代理伺服器
預設 ulimit 設定
--default-ulimit 旗標可讓您設定所有容器要使用的預設 ulimit 選項。它採用與 docker run 的 --ulimit 相同的選項。如果未設定這些預設值,ulimit 設定將從 Docker 守護程序繼承。傳遞給 docker run 的任何 --ulimit 選項都會覆寫守護程序的預設值。
設定 ulimit 旗標時請小心設定 nproc,因為 nproc 由 Linux 設計用於設定使用者可用的最大程序數,而不是容器。詳情請參閱 docker run 參考。
存取授權
Docker 的存取授權可以透過您的組織可以購買或自行建置的授權外掛程式來擴展。您可以在使用 --authorization-plugin=PLUGIN_ID 選項啟動 Docker 守護程序時安裝一個或多個授權外掛程式。
$ sudo dockerd --authorization-plugin=plugin1 --authorization-plugin=plugin2,...
PLUGIN_ID 值是外掛程式的名稱或其規格檔案的路徑。外掛程式的實作決定您可以指定名稱還是路徑。請諮詢您的 Docker 管理員以獲取有關您可用的外掛程式資訊。
安裝外掛程式後,透過命令列或 Docker Engine API 向 守護程序發出的請求將由外掛程式允許或拒絕。如果您安裝了多個外掛程式,每個外掛程式必須依序允許請求才能完成。
有關如何建立授權外掛程式的資訊,請參閱 授權外掛程式 部分。
守護程序使用者命名空間選項
Linux 核心 使用者命名空間支援 透過讓程序(進而容器)擁有獨立的使用者和群組 ID 範圍(這些 ID 範圍位於主機系統使用的傳統使用者和群組範圍之外),提供額外的安全性。其中最重要的安全改進之一是,依預設,以 root 使用者身份執行的容器程序在容器內部擁有其預期的管理權限(帶有一些限制),但在主機上實際對應到一個非特權 uid。
有關如何使用此功能以及其限制的詳情,請參閱 使用使用者命名空間隔離容器。
配置主機閘道 IP
Docker 守護程序支援 docker run 和 docker build 命令的 --add-host 旗標的特殊 host-gateway 值。此值解析為主機上的位址,以便容器可以連接到主機上執行的服務。
依預設,host-gateway 解析為預設橋接器的 IPv4 位址,如果有的話,還會解析為其 IPv6 位址。
您可以使用 dockerd 命令列介面的 --host-gateway-ip 旗標,或守護程序組態檔中的 host-gateway-ip 鍵來配置此選項以解析為不同的 IP。
要在命令列上提供 IPv4 和 IPv6 位址,請使用兩個 --host-gateway-ip 選項。
要在守護程序組態檔中提供位址,請使用帶有 JSON 陣列的 "host-gateway-ips",如下所示。為了與較舊版本的守護程序相容,單個 IP 位址也可以在選項 "host-gateway-ip" 中指定為 JSON 字串。
$ cat > /etc/docker/daemon.json
{ "host-gateway-ips": ["192.0.2.1", "2001:db8::1111"]}
$ sudo systemctl restart docker
$ docker run -it --add-host host.docker.internal:host-gateway \
busybox ping host.docker.internal
PING host.docker.internal (192.0.2.1): 56 data bytes
$ docker run -it --add-host host.docker.internal:host-gateway \
busybox ping -6 host.docker.internal
PING host.docker.internal (2001:db8::1111): 56 data bytes
配置 CDI 裝置
容器裝置介面 (CDI) 是一種 標準化 機制,用於容器執行時建立能夠與第三方裝置互動的容器。
CDI 目前僅支援 Linux 容器,並自 Docker Engine 28.3.0 版起預設啟用。
如果請求的裝置規格在守護程序的檔案系統上可用,Docker 守護程序支援執行帶有 CDI 裝置的容器。
預設規格目錄是:
/etc/cdi/用於靜態 CDI 規格/var/run/cdi用於生成的 CDI 規格
設定自訂位置
要設定 CDI 規格的自訂位置,請使用 daemon.json 組態檔中的 cdi-spec-dirs 選項,或 dockerd CLI 的 --cdi-spec-dir 旗標。
{
"cdi-spec-dirs": ["/etc/cdi/", "/var/run/cdi"]
}您可以使用 docker info 命令查看已配置的 CDI 規格目錄。
禁用 CDI 裝置
此功能依預設啟用。要禁用它,請使用 deamon.json 檔案中的 cdi 選項。
"features": {
"cdi": false
},要檢查 CDI 裝置的狀態,請執行 docker info。
守護程序日誌格式
在 守護程序組態檔 中的 --log-format 選項或「log-format」選項可讓您設定守護程序生成的日誌格式。日誌格式只能透過 --log-format 命令列選項或組態檔中的「log-format」欄位進行配置;同時使用命令列選項和組態檔中的「log-format」欄位會產生錯誤。如果未設定此選項,預設為「text」。
以下範例透過 --log-format 命令列選項配置守護程序以使用 json 格式的日誌:
$ dockerd --log-format=json
# ...
{"level":"info","msg":"API listen on /var/run/docker.sock","time":"2024-09-16T11:06:08.558145428Z"}
以下範例顯示了一個設定了「log-format」的 daemon.json 組態檔:
{
"log-format": "json"
}雜項選項
IP 偽裝使用位址轉換,允許沒有公共 IP 的容器與網際網路上的其他機器通訊。這可能會干擾某些網路拓撲,並可以使用 --ip-masq=false 禁用。
Docker 支援 Docker 資料目錄 (/var/lib/docker) 和 /var/lib/docker/tmp 的軟連結。DOCKER_TMPDIR 和資料目錄可以這樣設定:
$ export DOCKER_TMPDIR=/mnt/disk2/tmp
$ sudo -E dockerd --data-root /var/lib/docker -H unix://
預設 cgroup 父級
--cgroup-parent 選項可讓您設定容器的預設 cgroup 父級。如果未設定此選項,則對於 cgroupfs 驅動程式預設為 /docker,對於 systemd cgroup 驅動程式預設為 system.slice。
如果 cgroup 帶有前導斜線 (/),則 cgroup 會在根 cgroup 下建立;否則,cgroup 會在守護程序 cgroup 下建立。
假設守護程序在 cgroup daemoncgroup 中執行,--cgroup-parent=/foobar 會在 /sys/fs/cgroup/memory/foobar 中建立一個 cgroup,而使用 --cgroup-parent=foobar 則會在 /sys/fs/cgroup/memory/daemoncgroup/foobar 中建立 cgroup。
systemd cgroup 驅動程式對 --cgroup-parent 有不同的規則。systemd 透過 slice 表示層次結構,slice 的名稱編碼了樹中的位置。因此,systemd cgroup 的 --cgroup-parent 應該是 slice 名稱。名稱可以由連字號分隔的一系列名稱組成,描述了從根 slice 到該 slice 的路徑。例如,--cgroup-parent=user-a-b.slice 意味著容器的記憶體 cgroup 將在 /sys/fs/cgroup/memory/user.slice/user-a.slice/user-a-b.slice/docker-<id>.scope 中建立。
此設定也可以每個容器進行設定,使用 docker create 和 docker run 上的 --cgroup-parent 選項,並優先於守護程序上的 --cgroup-parent 選項。
守護程序度量指標
--metrics-addr 選項接受一個 TCP 位址來提供度量指標 API。此功能仍處於實驗階段,因此,守護程序必須在實驗模式下執行此功能才能運作。
要在 localhost:9323 上提供度量指標 API,您將指定 --metrics-addr 127.0.0.1:9323,允許您在 127.0.0.1:9323/metrics 上發出 API 請求以接收 prometheus 格式的度量指標。
連接埠 9323 是 與 Docker 度量指標相關聯的預設連接埠,以避免與其他 Prometheus 匯出工具和服務衝突。
如果您正在執行 Prometheus 伺服器,您可以將此位址新增到您的抓取配置中,讓 Prometheus 收集 Docker 的度量指標。有關更多資訊,請參閱 使用 Prometheus 收集 Docker 度量指標。
節點通用資源
--node-generic-resources 選項接受一個鍵值對列表(key=value),讓您可以在 Swarm 叢集中宣告使用者定義的資源。
目前預期的使用案例是宣告 NVIDIA GPU,以便請求 NVIDIA-GPU=[0-16] 的服務可以落在具有足夠 GPU 來執行任務的節點上。
使用範例
{
"node-generic-resources": [
"NVIDIA-GPU=UUID1",
"NVIDIA-GPU=UUID2"
]
}啟用守護程序中的功能 (--feature)
--feature 選項可讓您在守護程序中啟用或禁用某個功能。此選項與 daemon.json 組態檔 中的「features」欄位相對應。功能只能透過 --feature 命令列選項或組態檔中的「features」欄位進行配置;同時使用命令列選項和組態檔中的「features」欄位會產生錯誤。可以多次指定功能選項以配置多個功能。--feature 選項接受名稱和可選的布林值。當省略該值時,預設為 true。
以下範例執行守護程序,並啟用 cdi 和 containerd-snapshotter 功能。cdi 選項帶有一個值;
$ dockerd --feature cdi=true --feature containerd-snapshotter
以下範例是使用 daemon.json 組態檔的等效設定:
{
"features": {
"cdi": true,
"containerd-snapshotter": true
}
}守護程序組態檔
--config-file 選項允許您以 JSON 格式設定守護程序的任何組態選項。此檔案使用與旗標名稱相同的鍵,除了允許多個條目的旗標,在這種情況下,它使用旗標名稱的複數形式,例如,labels 對應 label 旗標。
組態檔中設定的選項不得與使用旗標設定的選項衝突。如果檔案和旗標之間重複了一個選項,無論其值如何,Docker 守護程序都將無法啟動。這是故意的,避免了在重新載入組態時默默地忽略引入的更改。例如,如果您在組態檔中設定了守護程序標籤,並且還透過 --label 旗標設定了守護程序標籤,則守護程序將無法啟動。當守護程序啟動時,檔案中不存在的選項將被忽略。
--validate 選項允許驗證組態檔而不啟動 Docker 守護程序。對於無效的組態檔,將返回非零結束碼。
$ dockerd --validate --config-file=/tmp/valid-config.json
configuration OK
$ echo $?
0
$ dockerd --validate --config-file /tmp/invalid-config.json
unable to configure the Docker daemon with file /tmp/invalid-config.json: the following directives don't match any configuration option: unknown-option
$ echo $?
1
在 Linux 上
在 Linux 上,組態檔的預設位置是 /etc/docker/daemon.json。使用 --config-file 旗標指定非預設位置。
以下是在 Linux 上允許的組態選項的完整範例:
{
"allow-direct-routing": false,
"authorization-plugins": [],
"bip": "",
"bip6": "",
"bridge": "",
"builder": {
"gc": {
"enabled": true,
"defaultKeepStorage": "10GB",
"policy": [
{ "keepStorage": "10GB", "filter": ["unused-for=2200h"] },
{ "keepStorage": "50GB", "filter": ["unused-for=3300h"] },
{ "keepStorage": "100GB", "all": true }
]
}
},
"cgroup-parent": "",
"containerd": "/run/containerd/containerd.sock",
"containerd-namespace": "docker",
"containerd-plugins-namespace": "docker-plugins",
"data-root": "",
"debug": true,
"default-address-pools": [
{
"base": "172.30.0.0/16",
"size": 24
},
{
"base": "172.31.0.0/16",
"size": 24
}
],
"default-cgroupns-mode": "private",
"default-gateway": "",
"default-gateway-v6": "",
"default-network-opts": {},
"default-runtime": "runc",
"default-shm-size": "64M",
"default-ulimits": {
"nofile": {
"Hard": 64000,
"Name": "nofile",
"Soft": 64000
}
},
"dns": [],
"dns-opts": [],
"dns-search": [],
"exec-opts": [],
"exec-root": "",
"experimental": false,
"features": {
"cdi": true,
"containerd-snapshotter": true
},
"fixed-cidr": "",
"fixed-cidr-v6": "",
"group": "",
"host-gateway-ip": "",
"hosts": [],
"proxies": {
"http-proxy": "http://proxy.example.com:80",
"https-proxy": "https://proxy.example.com:443",
"no-proxy": "*.test.example.com,.example.org"
},
"icc": false,
"init": false,
"init-path": "/usr/libexec/docker-init",
"insecure-registries": [],
"ip": "0.0.0.0",
"ip-forward": false,
"ip-masq": false,
"iptables": false,
"ip6tables": false,
"ipv6": false,
"labels": [],
"live-restore": true,
"log-driver": "json-file",
"log-format": "text",
"log-level": "",
"log-opts": {
"cache-disabled": "false",
"cache-max-file": "5",
"cache-max-size": "20m",
"cache-compress": "true",
"env": "os,customer",
"labels": "somelabel",
"max-file": "5",
"max-size": "10m"
},
"max-concurrent-downloads": 3,
"max-concurrent-uploads": 5,
"max-download-attempts": 5,
"mtu": 0,
"no-new-privileges": false,
"node-generic-resources": [
"NVIDIA-GPU=UUID1",
"NVIDIA-GPU=UUID2"
],
"pidfile": "",
"raw-logs": false,
"registry-mirrors": [],
"runtimes": {
"cc-runtime": {
"path": "/usr/bin/cc-runtime"
},
"custom": {
"path": "/usr/local/bin/my-runc-replacement",
"runtimeArgs": [
"--debug"
]
}
},
"seccomp-profile": "",
"selinux-enabled": false,
"shutdown-timeout": 15,
"storage-driver": "",
"storage-opts": [],
"swarm-default-advertise-addr": "",
"tls": true,
"tlscacert": "",
"tlscert": "",
"tlskey": "",
"tlsverify": true,
"userland-proxy": false,
"userland-proxy-path": "/usr/libexec/docker-proxy",
"userns-remap": ""
}注意您不能在
daemon.json中設定已在守護程序啟動時以旗標設定的選項。在使用 systemd 啟動 Docker 守護程序的系統上,-H已設定,因此您不能在daemon.json中使用hosts鍵來新增監聽位址。有關如何使用 systemd drop-in 檔案配置守護程序的範例,請參閱 自訂 Docker 守護程序選項。
在 Windows 上
在 Windows 上,組態檔的預設位置是 %programdata%\docker\config\daemon.json。使用 --config-file 旗標指定非預設位置。
以下是在 Windows 上允許的組態選項的完整範例:
{
"authorization-plugins": [],
"bridge": "",
"containerd": "\\\\.\\pipe\\containerd-containerd",
"containerd-namespace": "docker",
"containerd-plugins-namespace": "docker-plugins",
"data-root": "",
"debug": true,
"default-network-opts": {},
"default-runtime": "",
"default-ulimits": {},
"dns": [],
"dns-opts": [],
"dns-search": [],
"exec-opts": [],
"experimental": false,
"features": {},
"fixed-cidr": "",
"group": "",
"host-gateway-ip": "",
"hosts": [],
"insecure-registries": [],
"labels": [],
"log-driver": "",
"log-format": "text",
"log-level": "",
"max-concurrent-downloads": 3,
"max-concurrent-uploads": 5,
"max-download-attempts": 5,
"mtu": 0,
"pidfile": "",
"raw-logs": false,
"registry-mirrors": [],
"shutdown-timeout": 15,
"storage-driver": "",
"storage-opts": [],
"swarm-default-advertise-addr": "",
"tlscacert": "",
"tlscert": "",
"tlskey": "",
"tlsverify": true
}default-runtime 選項依預設為未設定,在這種情況下,dockerd 會自動偵測執行時。此偵測基於是否設定了 containerd 旗標。
接受的值
com.docker.hcsshim.v1- 這是 Docker 自首次新增 Windows 支援以來一直使用的內建執行時,並使用 Windows 中的 v1 HCS API。io.containerd.runhcs.v1- 這使用 containerdrunhcsshim 來執行容器,並使用 Windows 中的 v2 HCS API。
功能選項
daemon.json 中的可選欄位 features 可讓您啟用或禁用特定的守護程序功能。
{
"features": {
"some-feature": true,
"some-disabled-feature-enabled-by-default": false
}
}功能選項列表包括:
containerd-snapshotter: 當設定為true時,守護程序使用 containerd snapshotters 而不是傳統儲存驅動程式來儲存映像和容器資料。有關更多資訊,請參閱 containerd 儲存。windows-dns-proxy: 當設定為true時,守護程序的內部 DNS 解析器會將請求轉發到外部伺服器。若無此設定,在容器中執行的大多數應用程式仍能使用容器本身設定的輔助 DNS 伺服器,但nslookup將無法解析外部名稱。目前的預設值為false,未來版本將更改為true。此選項僅在 Windows 上允許。警告windows-dns-proxy功能旗標將在未來版本中移除。
組態重新載入行為
某些選項可以在守護程序執行時重新配置,而無需重新啟動程序。守護程序在 Linux 中使用 SIGHUP 訊號進行重新載入,在 Windows 中使用鍵為 Global\docker-daemon-config-$PID 的全域事件。您可以修改組態檔中的選項,但守護程序仍會檢查與指定 CLI 旗標的衝突設定。如果存在衝突,守護程序將無法重新配置自身,但它不會停止執行。
目前支援的可重新配置選項列表如下:
| 選項 | 描述 |
|---|---|
偵錯 | 切換守護程序的偵錯模式。 |
labels | 將守護程序標籤替換為一組新的標籤。 |
即時還原 | 切換 即時還原。 |
最大並行下載數 | 配置每次提取的最大並行下載數。 |
最大並行上傳數 | 配置每次推送的最大並行上傳數。 |
最大下載嘗試次數 | 配置每次提取的最大下載嘗試次數。 |
預設執行時 | 配置在容器建立時未指定情況下要使用的執行時。 |
執行時 | 配置可用於執行容器的 OCI 執行時列表。 |
授權外掛程式 | 指定要使用的授權外掛程式。 |
不安全註冊表 | 指定守護程序應視為不安全的註冊表列表。 |
註冊表鏡像 | 指定註冊表鏡像列表。 |
關機逾時 | 使用新的關閉所有容器的逾時時間來配置守護程序現有的組態逾時。 |
功能 | 啟用或禁用特定功能。 |
執行多個守護程序
注意在單一主機上執行多個守護程序被視為實驗性功能。您可能會遇到未解決的問題,並且在某些情況下可能無法如預期般運作。
此部分描述如何在單一主機上執行多個 Docker 守護程序。要執行多個守護程序,您必須配置每個守護程序,使其不與同一主機上的其他守護程序衝突。您可以透過提供旗標或使用 守護程序組態檔 來設定這些選項。
每個守護程序都必須配置以下守護程序選項:
-b, --bridge= Attach containers to a network bridge
--exec-root=/var/run/docker Root of the Docker execdriver
--data-root=/var/lib/docker Root of persisted Docker data
-p, --pidfile=/var/run/docker.pid Path to use for daemon PID file
-H, --host=[] Daemon socket(s) to connect to
--iptables=true Enable addition of iptables rules
--config-file=/etc/docker/daemon.json Daemon configuration file
--tlscacert="~/.docker/ca.pem" Trust certs signed only by this CA
--tlscert="~/.docker/cert.pem" Path to TLS certificate file
--tlskey="~/.docker/key.pem" Path to TLS key file當您的守護程序對這些旗標使用不同的值時,您可以在同一主機上執行它們而不會有任何問題。重要的是要了解這些選項的含義並正確使用它們。
-b, --bridge=旗標設定為docker0作為預設橋接網路。它在您安裝 Docker 時自動建立。如果您不使用預設值,則必須手動建立和配置橋接器,或將其設定為「none」:--bridge=none。--exec-root是儲存容器狀態的路徑。預設值為/var/run/docker。在此處指定您執行中守護程序的路徑。--data-root是儲存持久性資料(例如映像、磁碟區和叢集狀態)的路徑。預設值為/var/lib/docker。為了避免與其他守護程序發生任何衝突,請為每個守護程序單獨設定此參數。-p, --pidfile=/var/run/docker.pid是儲存守護程序程序 ID 的路徑。在此處指定您的 PID 檔案路徑。--host=[]指定 Docker 守護程序監聽客戶端連線的位置。如果未指定,則預設為/var/run/docker.sock。--iptables=false阻止 Docker 守護程序新增 iptables 規則。如果多個守護程序管理 iptables 規則,它們可能會覆寫另一個守護程序設定的規則。請注意,禁用此選項需要您手動新增 iptables 規則以公開容器連接埠。如果您阻止 Docker 新增 iptables 規則,即使您將--ip-masq設定為true,Docker 也不會新增 IP 偽裝規則。如果沒有 IP 偽裝規則,當使用非預設橋接網路時,Docker 容器將無法連接到外部主機或網際網路。--config-file=/etc/docker/daemon.json是儲存組態檔的路徑。您可以使用它而不是守護程序旗標。為每個守護程序指定路徑。--tls*Docker 守護程序支援--tlsverify模式,該模式強制執行加密和驗證的遠端連線。--tls*選項允許為個別守護程序使用特定的憑證。
不帶網路的 Docker 守護程序獨立「引導」實例的範例指令碼
$ sudo dockerd \
-H unix:///var/run/docker-bootstrap.sock \
-p /var/run/docker-bootstrap.pid \
--iptables=false \
--ip-masq=false \
--bridge=none \
--data-root=/var/lib/docker-bootstrap \
--exec-root=/var/run/docker-bootstrap
預設網路選項
daemon.json 組態檔中的 default-network-opts 鍵,以及等效的 --default-network-opt CLI 旗標,可讓您為新網路的驅動程式網路驅動程式選項指定預設值。
以下範例展示如何使用 daemon.json 檔案配置 bridge 驅動程式的選項。
{
"default-network-opts": {
"bridge": {
"com.docker.network.bridge.host_binding_ipv4": "127.0.0.1",
"com.docker.network.driver.mtu": "1234"
}
}
}此範例使用 bridge 網路驅動程式。有關可用驅動程式選項的概述,請參閱 橋接網路驅動程式頁面。
更改組態並重新啟動守護程序後,您建立的新網路將使用這些選項組態作為預設值。
$ docker network create mynet
$ docker network inspect mynet --format "{{json .Options}}"
{"com.docker.network.bridge.host_binding_ipv4":"127.0.0.1","com.docker.network.driver.mtu":"1234"}
請注意,更改此守護程序組態不會影響現有的網路。
使用 --default-network-opt CLI 旗標對於測試和偵錯目的很有用,但您應該優先使用 daemon.json 檔案進行持久性守護程序組態。CLI 旗標預期值的格式如下:driver=opt=value,例如:
$ sudo dockerd \
--default-network-opt bridge=com.docker.network.bridge.host_binding_ipv4=127.0.0.1 \
--default-network-opt bridge=com.docker.network.driver.mtu=1234