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 CLIdockerd 守護程序使用。
DOCKER_DRIVER要使用的儲存驅動。
DOCKER_RAMDISK如果設定,則停用 pivot_root
DOCKER_TLS_VERIFY設定後,Docker 使用 TLS 並驗證遠端。此變數同時被 docker CLIdockerd 守護程序使用。
DOCKER_TMPDIR守護程序建立的臨時檔案的位置。
HTTP_PROXYHTTP 請求的代理 URL,除非被 NoProxy 覆蓋。有關詳細資訊,請參閱 Go 規範
HTTPS_PROXYHTTPS 請求的代理 URL,除非被 NoProxy 覆蓋。有關詳細資訊,請參閱 Go 規範
MOBY_DISABLE_PIGZ即使已安裝 unpigz,也停用在拉取映象時並行解壓層的操作。
NO_PROXY逗號分隔的值,指定應從代理中排除的主機。有關詳細資訊,請參閱 Go 規範

示例

代理配置

注意

如果您正在執行 Docker Desktop,請參閱 Docker Desktop 手冊

如果您位於 HTTP 代理伺服器後面(例如在企業環境中),您可能需要配置 Docker 守護程序以使用代理伺服器進行拉取和推送映象等操作。守護程序可以透過三種方式配置:

  1. 使用環境變數(HTTP_PROXYHTTPS_PROXYNO_PROXY)。
  2. 守護程序配置檔案中使用 http-proxyhttps-proxyno-proxy 欄位(Docker Engine 23.0 或更高版本)。
  3. 使用 --http-proxy--https-proxy--no-proxy 命令列選項。(Docker Engine 23.0 或更高版本)。

命令列和配置檔案選項優先於環境變數。有關如何在使用 systemd 的主機上設定這些環境變數,請參閱 使用 systemd 控制和配置 Docker

守護程序套接字選項

Docker 守護程序可以透過三種不同型別的套接字監聽 Docker Engine API 請求:unixtcpfd

預設情況下,會在 /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_PROXYHTTPS_PROXYNO_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 埠或 Unix docker 使用者組會引入安全風險,因為它可能允許非 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 守護程序支援多種不同的映象層儲存驅動:overlay2fuse-overlayfsbtrfszfs

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 核心 namespacescgroupsSELinux 的介面。

配置容器執行時

預設情況下,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,支援的配置選項是 TypeUrlConfigPath。例如:

{
  "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。

您只能指定 cgroupfssystemd。如果您指定 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 pulldocker pushdocker 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 主機的配置中。

  1. 安裝您的發行版的 ca-certificates 包。
  2. 向您的網路管理員索取代理的 CA 證書,並將其附加到 /etc/pki/tls/certs/ca-bundle.crt
  3. 然後使用 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 rundocker 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 createdocker 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

以下示例執行守護程序,並啟用了 cdicontainerd-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 - 這使用 containerd runhcs 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