dockerd

守护进程

Usage: dockerd [OPTIONS]

A self-sufficient runtime for containers.

Options:
      --add-runtime runtime                   Register an additional OCI compatible runtime (default [])
      --allow-nondistributable-artifacts list Allow push of nondistributable artifacts to registry
      --api-cors-header string                Set CORS headers in the Engine API
      --authorization-plugin list             Authorization plugins to load
      --bip string                            Specify network bridge IP
  -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                    Container default gateway IPv4 address
      --default-gateway-v6 ip                 Container default gateway IPv6 address
      --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 fixed IPs
      --fixed-cidr-v6 string                  IPv6 subnet for fixed IPs
  -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 ip                    IP address that the special 'host-gateway' string in --add-host resolves to.
                                              Defaults to the IP address 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 (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                                 Default IP when binding container ports (default 0.0.0.0)
      --ip-forward                            Enable net.ipv4.ip_forward (default true)
      --ip-masq                               Enable IP masquerading (default true)
      --ip6tables                             Enable addition of ip6tables rules (experimental)
      --iptables                              Enable addition of iptables rules (default true)
      --ipv6                                  Enable IPv6 networking
      --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 containers network MTU (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
      --oom-score-adjust int                  Set the oom_score_adj for the daemon
  -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. Use "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 为守护进程和客户端使用不同的Binaries。要运行守护进程,请输入 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_PROXY用于HTTPS请求的代理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 控制和配置 Docker 以使用 systemd 在主机上设置这些环境变量。

守护进程套接字选项

Docker 守护进程可以通过三种不同类型的 Socket 监听 Docker Engine API 请求:unixtcpfd

默认情况下,在 unix 处创建一个 /var/run/docker.sock 域套接字(或 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 源码树中找到使用 Docker 和 systemd 进行 systemd 套接字激活的示例。

您可以将 Docker 守护进程配置为使用多个 -H 选项同时监听多个套接字:

下面的示例运行守护进程,监听默认的 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:// -> 与 127.0.0.1 的 TCP 连接,当启用 TLS 加密时使用端口 2376,当通信为明文时使用端口 2375
  • tcp://host:2375 -> TCP connection on host:2375
  • 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 守护进程支持多种不同的镜像层存储驱动程序: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 选择该运行时,而无需编辑守护进程的配置:

$ 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": {}
        }
      }
    }

    参见 配置垫片

  • 如果运行时被设计为 runc 的直接替代品, 该对象包含一个 path 字段,以及一个可选的 runtimeArgs 字段。

    {
      "runtimes": {
        "<runtime>": {
          "path": "/path/to/bin",
          "runtimeArgs": ["...args"]
        }
      }
    }

    参见 配置 runc 替代组件

在配置文件中更改运行时配置后, 必须重新加载或重启守护进程才能使更改生效:

$ sudo systemctl reload dockerd
配置 containerd shims

如果您要注册的运行时实现了 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 Binaries的路径。

    如果您在 PATH 之外安装了 containerd shim Binaries,此选项将非常有用。

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 的直接替代品,您可以使用守护进程配置文件注册该运行时,或者使用 --add-runtime 标志为 dockerd cli。

使用配置文件时,条目采用以下格式:

{
  "runtimes": {
    "<runtime>": {
      "path": "/path/to/binary",
      "runtimeArgs": ["...args"]
    }
  }
}

其中 path 是运行时可执行文件的绝对路径,或者是安装在 PATH 上的可执行文件的名称:

{
  "runtimes": {
    "runc": {
      "path": "runc"
    }
  }
}

并且 runtimeArgs 允许您选择向运行时传递额外的参数。 使用此格式的条目通过 containerd runc shim 调用自定义 运行时Binaries。

当您使用 --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 标志来配置运行时应如何管理容器 cgroups。

您只能指定 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

允许推送非分发工件

某些镜像(例如 Windows 基础镜像)包含受许可证限制分发的工件。当这些镜像被推送到仓库时,受限制的工件不会被包含在内。

要针对特定注册表覆盖此行为,请在以下形式之一中使用 --allow-nondistributable-artifacts 选项:

  • --allow-nondistributable-artifacts myregistry:5000 指示 Docker 守护进程 将不可分发的工件推送到 myregistry:5000。
  • --allow-nondistributable-artifacts 10.1.0.0/16 告诉 Docker 守护进程将不可分发的构件推送到所有解析后的 IP 地址位于 CIDR 语法描述的子网内的镜像仓库。

此选项可多次使用。

当将包含不可分发制品的镜像推送到隔离网络上的镜像仓库时,此选项非常有用,这样该网络上的主机无需连接到其他服务器即可拉取镜像。

警告

不可分发的构件通常在分发和共享的方式及地点上有限制。仅将此功能用于将构件推送到私有注册表,并确保您遵守涵盖重新分发不可分发构件的任何条款。

不安全的镜像仓库

在本节中,“registry”指的是私有仓库,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 守护进程,所有域名解析 IP 地址属于 CIDR 语法描述的子网范围内的仓库,都应被视为不安全的。

该标志可以多次使用,以允许将多个注册表标记为不安全。

如果不安全的镜像仓库未被标记为不安全,docker pulldocker pushdocker search 将导致错误消息,提示 用户按照上述描述保护镜像仓库安全或向 Docker 守护进程传递 --insecure-registry 标志。

从 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 选项都会覆盖守护进程默认值。

设置 nproc 时请小心使用 ulimit 标志,因为 nproc 是由 Linux 设计用来设置用户可用的最大进程数,而不是容器可用的最大进程数。 有关详细信息,请参阅 docker run 参考

访问授权

Docker 的访问授权可以通过您的组织购买或自行构建的授权插件进行扩展。您可以在启动 Docker daemon 时使用 --authorization-plugin=PLUGIN_ID 选项安装一个或多个授权插件。

$ sudo dockerd --authorization-plugin=plugin1 --authorization-plugin=plugin2,...

PLUGIN_ID 值可以是插件的名称,也可以是指向其规范文件的路径。插件的实现决定了您可以指定名称还是路径。请咨询您的 Docker 管理员以获取有关您可用插件的信息。

一旦安装了插件,通过命令行或 Docker 引擎 API 向 daemon 发起的请求将由插件决定允许或拒绝。如果您安装了多个插件,则每个插件必须依次允许该请求,请求才能完成。

有关如何创建授权插件的信息,请参阅 授权插件 部分。

守护进程用户命名空间选项

Linux 内核 用户命名空间支持 通过使进程(以及容器)拥有独立于主机系统使用的传统用户和组 ID 范围之外的独特用户和组 ID 范围,提供了额外的安全性。最重要的安全改进之一是,默认情况下,以 root 用户身份运行的容器进程在容器内部拥有预期的管理特权(有一些限制),但在主机上有效地映射为非特权 uid

有关如何使用此功能以及限制的详细信息,请参阅 使用用户命名空间隔离容器

配置主机网关 IP

Docker 守护进程为 docker rundocker build 命令的 --add-host 标志支持特殊的 host-gateway 值。该值解析为主机的网关 IP,并允许容器连接到主机上运行的服务。

默认情况下,host-gateway 解析为默认网桥的 IP 地址。 您可以使用 dockerd 命令行界面的 --host-gateway-ip 标志, 或守护进程配置文件中的 host-gateway-ip 键,将其配置为解析为不同的 IP。

$ cat > /etc/docker/daemon.json
{ "host-gateway-ip": "192.0.2.0" }
$ 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.0): 56 data bytes

启用 CDI 设备

注意

这是一个实验性功能,因此不代表稳定的 API。

默认情况下未启用此功能。要启用此功能,请在 daemon.json 配置文件中将 features.cdi 设置为 true

容器设备接口 (CDI) 是一种 标准化 机制,供容器运行时创建能够与第三方设备交互的容器。

如果请求的设备规范在守护进程的文件系统上可用,Docker 守护进程支持使用 CDI 设备运行容器。

默认规范目录为:

  • /etc/cdi/ 用于静态 CDI 规范
  • /var/run/cdi 用于生成的 CDI 规范

或者,您可以使用 daemon.json 配置文件中的 cdi-spec-dirs 选项,或 dockerd CLI 的 --cdi-spec-dir 标志来设置 CDI 规范的自定义位置。

{
  "features": {
     "cdi": true
  },
  "cdi-spec-dirs": ["/etc/cdi/", "/var/run/cdi"]
}

当为守护进程启用 CDI 时,您可以使用 docker info 命令查看配置的 CDI 规范目录。

守护进程日志格式

--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 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 中。

此设置也可以针对每个容器进行设置,使用 --cgroup-parent 选项在 docker createdocker run 上,并且优先于守护进程上的 --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

下面的示例在启用 cdicontainerd-snapshotter 功能的情况下运行守护进程。 cdi 选项提供了一个值;

$ dockerd --feature cdi=true --feature containerd-snapshotter

下面的示例是使用 daemon.json 配置文件的等效示例;

{
  "features": {
    "cdi": true,
    "containerd-snapshotter": true
  }
}

守护进程配置文件

--config-file 选项允许您以 JSON 格式为守护进程设置任何配置选项。该文件使用与标志名称相同的键名,但对于允许有多个条目的标志,则使用标志名称的复数形式,例如,对于 label 标志,使用 labels

配置文件中设置的选项不得与使用标志设置的选项冲突。如果选项在文件和标志中重复出现,无论其值如何,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-nondistributable-artifacts": [],
  "api-cors-header": "",
  "authorization-plugins": [],
  "bip": "",
  "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"
  ],
  "oom-score-adjust": 0,
  "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 键来添加监听地址。 参见 自定义 Docker 守护进程选项 以获取有关如何使用 systemd 插入文件配置守护进程的示例。

在 Windows 上

Windows 上配置文件的默认位置是 %programdata%\docker\config\daemon.json。使用 --config-file 标志 以指定非默认位置。

以下是 Windows 上允许的配置选项的完整示例:

{
  "allow-nondistributable-artifacts": [],
  "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 - 这是自首次添加 Windows 支持以来 Docker 使用的内置运行时,并使用 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 标志冲突的设置。如果存在冲突,守护进程将无法重新配置自身,但不会停止执行。

当前支持的可重新配置选项列表如下:

选项描述
debug切换守护进程的调试模式。
labels使用一组新的标签替换守护进程标签。
live-restore开关 实时恢复
max-concurrent-downloads配置每次拉取的最大并发下载数。
max-concurrent-uploads配置每次推送的最大并发上传数。
max-download-attempts配置每次拉取的最大下载尝试次数。
default-runtime配置在容器创建时未指定运行时所使用的运行时。
runtimes配置可用于运行容器的 OCI 运行时列表。
authorization-plugin指定要使用的授权插件。
allow-nondistributable-artifacts指定守护进程将推送非可分发工件的注册表列表。
insecure-registries指定守护进程应视为不安全的仓库列表。
registry-mirrors指定注册表镜像列表。
shutdown-timeout使用新的超时时间配置守护进程的现有配置超时,以便关闭所有容器。
features启用或禁用特定功能。

运行多个守护进程

注意

在单个主机上运行多个守护进程被视为实验性功能。 您可能会遇到未解决的问题,在某些情况下,情况可能不如预期般工作。

本节介绍如何在单台主机上运行多个 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 守护进程独立“bootstrap”实例的示例脚本:

$ 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

默认网络选项

default-network-opts 配置文件中的 daemon.json 键,以及等效的 --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