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 | HTTP 請求的代理 URL,除非被 NoProxy 覆蓋。有關詳細資訊,請參閱 Go 規範。 |
HTTPS_PROXY | HTTPS 請求的代理 URL,除非被 NoProxy 覆蓋。有關詳細資訊,請參閱 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
的主機上設定這些環境變數,請參閱 使用 systemd 控制和配置 Docker。
守護程序套接字選項
Docker 守護程序可以透過三種不同型別的套接字監聽 Docker Engine API 請求:unix
、tcp
和 fd
。
預設情況下,會在 /var/run/docker.sock
建立一個 unix
域套接字(或 IPC 套接字),需要 root
許可權或 docker
組的成員資格。
如果您需要遠端訪問 Docker 守護程序,則需要啟用 tcp 套接字。在使用 TCP 套接字時,Docker 守護程序預設提供對 Docker 守護程序的未加密和未經身份驗證的直接訪問。您應該使用 內建的 HTTPS 加密套接字 來保護守護程序,或者在其前面放置一個安全的 Web 代理。您可以使用 -H tcp://0.0.0.0:2375
偵聽所有網路介面上的埠 2375
,或使用其 IP 地址偵聽特定網路介面:-H tcp://192.168.59.103:2375
。通常,埠 2375
用於未加密通訊,埠 2376
用於與守護程序的加密通訊。
注意如果您使用 HTTPS 加密套接字,請記住僅支援 TLS 1.0 版及更高版本。出於安全原因,不支援 SSLv3 及以下協議。
在基於 systemd 的系統上,您可以透過 systemd 套接字啟用 與守護程序通訊,使用 dockerd -H fd://
。使用 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://
-> TCP 連線到127.0.0.1
,當 TLS 加密開啟時使用埠2376
,當通訊為純文字時使用埠2375
。tcp://host:2375
-> 在 host:2375 上建立 TCP 連線tcp://host:2375/path
-> 在 host:2375 上建立 TCP 連線,並將 path 新增到所有請求的前面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 應確保 size 不能小於 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 選項
size
指定建立用於容器的沙箱時使用的大小。預設為 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 --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
,在具有 systemd 的 cgroup v2 主機上使用 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
不安全的登錄檔
在本節中,“登錄檔”指的是私有登錄檔,myregistry:5000
是私有登錄檔的佔位符示例。
Docker 將私有登錄檔視為安全或不安全。安全登錄檔使用 TLS,並且其 CA 證書副本放置在 Docker 主機的 /etc/docker/certs.d/myregistry:5000/ca.crt
處。不安全登錄檔要麼不使用 TLS(即,監聽純文字 HTTP),要麼使用 TLS 但其 CA 證書不被 Docker 守護程序識別。後一種情況可能發生在證書未在 /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 守護程序,所有域名解析為 CIDR 語法描述的子網中的 IP 地址的登錄檔,都應被視為不安全。
該標誌可以多次使用,以允許將多個登錄檔標記為不安全。
如果一個不安全的登錄檔未被標記為不安全,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 的訪問授權可以透過授權外掛進行擴充套件,這些外掛可以由您的組織購買或自行構建。您可以在啟動 Docker daemon
時使用 --authorization-plugin=PLUGIN_ID
選項安裝一個或多個授權外掛。
$ sudo dockerd --authorization-plugin=plugin1 --authorization-plugin=plugin2,...
PLUGIN_ID
值是外掛的名稱或其規範檔案的路徑。外掛的實現決定了您是否可以指定名稱或路徑。請諮詢您的 Docker 管理員以獲取有關可用外掛的資訊。
一旦安裝了外掛,透過命令列或 Docker Engine API 對 daemon
發出的請求將由外掛允許或拒絕。如果您安裝了多個外掛,則每個外掛必須按順序允許請求才能完成。
有關如何建立授權外掛的資訊,請參閱授權外掛部分。
守護程序使用者名稱空間選項
Linux 核心的使用者名稱空間支援透過允許程序(因此也允許容器)擁有一個獨特的使用者和組 ID 範圍來提供額外的安全性,該範圍位於主機系統使用的傳統使用者和組範圍之外。最重要的安全改進之一是,預設情況下,以 root
使用者身份執行的容器程序在容器內部具有其預期的管理許可權(有一些限制),但在主機上實際上對映到非特權 uid
。
有關如何使用此功能以及限制的詳細資訊,請參閱 使用使用者名稱空間隔離容器。
配置主機閘道器 IP
Docker 守護程序支援 docker run
和 docker build
命令的 --add-host
標誌的特殊 host-gateway
值。此值解析為主機上的地址,以便容器可以連線到在主機上執行的服務。
預設情況下,host-gateway
解析為預設網橋的 IPv4 地址,如果它有 IPv6 地址,則解析為它的 IPv6 地址。
您可以使用 dockerd 命令列介面的 --host-gateway-ip
標誌,或守護程序配置檔案中的 host-gateway-ip
鍵來配置此項以解析為不同的 IP。
要在命令列上同時提供 IPv4 和 IPv6 地址,請使用兩個 --host-gateway-ip
選項。
要在守護程序配置檔案中提供地址,請使用 "host-gateway-ips"
和一個 JSON 陣列,如下所示。為了與守護程序的舊版本相容,單個 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"}
以下示例顯示了一個 daemon.json
配置檔案,其中設定了“log-format”;
{
"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 cgroups 的 --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
選項可以多次指定以配置多個功能。--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 插入檔案配置守護程序的示例,請參閱 自定義 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
- 這使用 containerdrunhcs
shim 來執行容器,並使用 Windows 中的 v2 HCS API。
功能選項
daemon.json
中的可選欄位 features
允許您啟用或停用特定的守護程序功能。
{
"features": {
"some-feature": true,
"some-disabled-feature-enabled-by-default": false
}
}
功能選項列表包括
containerd-snapshotter
:當設定為true
時,守護程序使用 containerd 快照程式而不是經典的儲存驅動來儲存映象和容器資料。有關更多資訊,請參閱 containerd 儲存。windows-dns-proxy
:當設定為true
時,守護程序的內部 DNS 解析器將請求轉發到外部伺服器。如果沒有此設定,容器中執行的大多數應用程式仍將能夠使用容器本身配置的輔助 DNS 伺服器,但nslookup
將無法解析外部名稱。當前預設值為false
,將在未來版本中更改為true
。此選項僅在 Windows 上允許。警告windows-dns-proxy
功能標誌將在未來版本中移除。
配置重新載入行為
某些選項可以在守護程序執行時重新配置,而無需重新啟動程序。守護程序在 Linux 中使用 SIGHUP
訊號進行重新載入,在 Windows 中使用鍵為 Global\docker-daemon-config-$PID
的全域性事件。您可以修改配置檔案中的選項,但守護程序仍會檢查與指定 CLI 標誌衝突的設定。如果存在衝突,守護程序將無法重新配置,但不會停止執行。
目前支援可重新配置的選項列表如下:
選項 | 描述 |
---|---|
除錯 | 切換守護程序的除錯模式。 |
labels | 將守護程序標籤替換為一組新標籤。 |
即時恢復 | 切換 即時恢復。 |
max-concurrent-downloads | 配置每個拉取操作的最大併發下載量。 |
max-concurrent-uploads | 配置每次推送的最大併發上傳數。 |
max-download-attempts | 配置每次拉取的最大下載嘗試次數。 |
預設執行時 | 配置在建立容器時未指定執行時將使用的執行時。 |
執行時 | 配置可用於執行容器的可用 OCI 執行時列表。 |
授權外掛 | 指定要使用的授權外掛。 |
不安全的登錄檔 | 指定守護程序應視為不安全的登錄檔列表。 |
registry-mirrors | 指定登錄檔映象列表。 |
關機超時 | 使用新的超時時間配置守護程序的現有配置超時,用於關閉所有容器。 |
功能 | 啟用或停用特定功能。 |
執行多個守護程序
注意在單個主機上執行多個守護程序被認為是實驗性的。您可能會遇到未解決的問題,並且在某些情況下可能無法按預期工作。
本節描述如何在單個主機上執行多個 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 規則,Docker 也不會新增 IP 偽裝規則,即使您將--ip-masq
設定為true
。如果沒有 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
網路驅動。有關可用驅動選項的概述,請參閱 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