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 使用不同的二进制文件来处理守护进程和客户端。要运行守护进程,您需要输入 dockerd

要以调试输出运行守护进程,请使用 dockerd --debug 或将 "debug": true 添加到 the daemon.json 文件

注意

启用实验性功能

通过使用--experimental标志启动dockerd或在daemon.json文件中添加"experimental": true来启用实验性功能。

环境变量

以下环境变量列表由dockerd守护程序支持。 其中一些环境变量由Docker守护程序和docker CLI共同支持。请参考 环境变量 以了解docker CLI支持的环境变量。

VariableDescription
DOCKER_CERT_PATHLocation of your authentication keys. This variable is used both by the docker CLI and the dockerd daemon.
DOCKER_DRIVERThe storage driver to use.
DOCKER_RAMDISKIf set this disables pivot_root.
DOCKER_TLS_VERIFYWhen set Docker uses TLS and verifies the remote. This variable is used both by the docker CLI and the dockerd daemon.
DOCKER_TMPDIRLocation for temporary files created by the daemon.
HTTP_PROXYProxy URL for HTTP requests unless overridden by NoProxy. See the Go 规范 for details.
HTTPS_PROXYProxy URL for HTTPS requests unless overridden by NoProxy. See the Go 规范 for details.
MOBY_DISABLE_PIGZDisables the use of unpigz to decompress layers in parallel when pulling images, even if it is installed.
NO_PROXYComma-separated values specifying hosts that should be excluded from proxying. See the Go 规范 for details.

示例

代理配置

注意

请参考 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守护进程可以监听 Docker Engine API 通过三种不同类型的Socket请求:unixtcpfd

默认情况下,会在/var/run/docker.sock创建一个unix域套接字(或IPC套接字),需要root权限或docker组成员身份。

如果您需要远程访问Docker守护进程,您需要启用TCP套接字。当使用TCP套接字时,Docker守护进程默认提供未加密和未认证的直接访问。您应该使用内置的HTTPS加密套接字,或者在其前面放置一个安全的Web代理来保护守护进程。您可以在所有网络接口上监听端口2375,使用-H tcp://0.0.0.0: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端口或Unixdocker用户组会带来安全风险,因为它可能允许非root用户在主机上获得root访问权限。请确保你控制对docker的访问。如果你绑定到TCP端口,任何能够访问该端口的人都有完全的Docker访问权限;因此在开放网络上不建议这样做。

使用-H可以使Docker守护进程监听特定的IP和端口。默认情况下,它监听unix:///var/run/docker.sock,只允许root用户进行本地连接。您可以将其设置为0.0.0.0:2375或特定的主机IP,以允许所有人访问,但这不推荐,因为有人可能会获得运行守护进程的主机的root访问权限。

同样地,Docker客户端可以使用-H来连接到自定义端口。 Docker客户端默认连接到Linux上的unix:///var/run/docker.sock, 以及Windows上的tcp://127.0.0.1:2376

-H 接受以下格式的主机和端口分配:

tcp://[host]:[port][path] or unix://path

例如:

  • tcp:// -> 当TLS加密开启时,连接到127.0.0.1的TCP连接,端口为2376;当通信为明文时,端口为2375
  • tcp://host:2375 -> 主机上的TCP连接: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 shims可以直接使用,无需编辑守护进程的配置。例如,如果您在PATH上安装了Kata Containers shim(containerd-shim-kata-v2),那么您可以通过docker run选择该运行时,而无需编辑守护进程的配置:

$ docker run --runtime io.containerd.kata.v2

未实现containerd shims的容器运行时,或安装在PATH之外的containerd shims,必须通过配置文件或使用--add-runtime命令行标志向守护进程注册。

有关如何使用其他容器运行时的示例,请参阅 替代容器运行时

使用daemon.json配置运行时

要使用守护进程的配置文件注册和配置容器运行时,请在runtimes下添加运行时作为条目:

{
  "runtimes": {
    "<runtime>": {}
  }
}

条目的键(在前面的示例中为)表示运行时的名称。这是您在运行容器时引用的名称,使用docker run --runtime

运行时入口包含一个对象,该对象指定了您的运行时配置。该对象的属性取决于您希望注册的运行时类型:

  • 如果运行时实现了自己的containerd shim,对象应包含一个runtimeType字段和一个可选的options字段。

    {
      "runtimes": {
        "<runtime>": {
          "runtimeType": "<name-or-path>",
          "options": {}
        }
      }
    }

    参见 配置shims

  • 如果运行时设计为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 二进制文件的路径。

    如果您在PATH之外安装了containerd shim二进制文件,此选项将非常有用。

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命令行界面的--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选项,cgroupfs会在cgroup v1主机上使用,systemd会在有systemd可用的cgroup v2主机上使用。

这个例子将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-nondirect-distributable-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),要么使用了 Docker 守护程序不知道的 CA 证书的 TLS。后者可能发生在证书未在 /etc/docker/certs.d/myregistry:5000/ 下找到,或者证书验证失败(即错误的 CA)时。

默认情况下,Docker 假定所有注册表都是安全的,除了本地注册表。 如果 Docker 假定注册表是安全的,则无法与不安全的注册表通信。 为了与不安全的注册表通信,Docker 守护进程需要以下两种形式之一的 --insecure-registry

  • --insecure-registry myregistry:5000 告诉 Docker 守护进程,myregistry:5000 应被视为不安全的。
  • --insecure-registry 10.1.0.0/16 告诉 Docker 守护进程,所有域名解析到由 CIDR 语法描述的子网内的 IP 地址的注册表,都应被视为不安全的。

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

如果一个不安全的注册表没有被标记为不安全,docker pulldocker pushdocker search会导致错误消息,提示用户要么保护注册表,要么按照上述描述将--insecure-registry标志传递给Docker守护进程。

本地注册表,其IP地址落在127.0.0.0/8范围内,自Docker 1.3.2起自动标记为不安全。不建议依赖此功能,因为它可能在将来发生变化。

启用--insecure-registry,即允许未加密和/或不受信任的通信,在运行本地注册表时可能很有用。然而,由于其使用会创建安全漏洞,因此应仅用于测试目的。为了提高安全性,用户应将其CA添加到系统的受信任CA列表中,而不是启用--insecure-registry

Legacy Registries

不再支持仅支持旧版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范围来提供额外的安全性,这些ID范围超出了主机系统使用的传统用户和组范围。最重要的安全改进之一是,默认情况下,以root用户身份运行的容器进程在容器内拥有预期的管理权限(有一些限制),但在主机上实际上映射到一个无特权的uid

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

配置主机网关IP

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

默认情况下,host-gateway 解析为默认桥接的IP地址。 您可以通过使用 --host-gateway-ip 标志为 dockerd 命令行界面配置此选项,或者通过守护进程配置文件中的 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"}

以下示例显示了一个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 通过切片表示层次结构,切片的名称编码了树中的位置。 因此,systemd cgroups 的 --cgroup-parent 应该是一个切片名称。名称 可以由一系列用破折号分隔的名称组成,这些名称描述了从根切片到切片的路径。 例如,--cgroup-parent=user-a-b.slice 表示容器的内存 cgroup 是在 /sys/fs/cgroup/memory/user.slice/user-a.slice/user-a-b.slice/docker-.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 选项以配置多个功能。--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 drop-in文件配置守护进程的示例。

在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 - 这是Docker自Windows支持首次添加以来使用的内置运行时,并在Windows中使用v1 HCS API。
  • io.containerd.runhcs.v1 - 这是使用 containerd 的 runhcs shim 来运行容器,并在 Windows 中使用 v2 HCS API。

功能选项

可选字段 featuresdaemon.json 中允许您启用或禁用特定的守护进程功能。

{
  "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标志是否存在冲突设置。如果存在冲突,守护进程将无法重新配置自身,但不会停止执行。

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

OptionDescription
debugToggles debug mode of the daemon.
labelsReplaces the daemon labels with a new set of labels.
live-restoreToggles 实时恢复.
max-concurrent-downloadsConfigures the max concurrent downloads for each pull.
max-concurrent-uploadsConfigures the max concurrent uploads for each push.
max-download-attemptsConfigures the max download attempts for each pull.
default-runtimeConfigures the runtime to be used if not is specified at container creation.
runtimesConfigures the list of available OCI runtimes that can be used to run containers.
authorization-pluginSpecifies the authorization plugins to use.
allow-nondistributable-artifactsSpecifies a list of registries to which the daemon will push non-distributable artifacts.
insecure-registriesSpecifies a list of registries that the daemon should consider insecure.
registry-mirrorsSpecifies a list of registry mirrors.
shutdown-timeoutConfigures the daemon's existing configuration timeout with a new timeout for shutting down all containers.
featuresEnables or disables specific 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

默认网络选项

daemon.json 配置文件中的 default-network-opts 键,以及等效的 --default-network-opt CLI 标志,允许您为新网络的驱动程序网络选项指定默认值。

以下示例展示了如何使用daemon.json文件配置bridge驱动程序的选项。

{
  "default-network-opts": {
    "bridge": {
      "com.docker.network.bridge.host_binding_ipv4": "127.0.0.1",
      "com.docker.network.driver.mtu": "1234"
    }
  }
}

此示例使用bridge网络驱动程序。请参阅 桥接网络驱动程序页面 以获取可用驱动程序选项的概述。

更改配置并重新启动守护进程后,您创建的新网络将使用这些选项配置作为默认值。

$ docker network create mynet
$ docker network inspect mynet --format "{{json .Options}}"
{"com.docker.network.bridge.host_binding_ipv4":"127.0.0.1","com.docker.network.driver.mtu":"1234"}

请注意,更改此守护程序配置不会影响已存在的网络。

使用--default-network-opt CLI标志对于测试和调试目的非常有用,但您应该更倾向于使用daemon.json文件进行持久的守护进程配置。CLI标志期望一个具有以下格式的值:driver=opt=value,例如:

$ sudo dockerd \
  --default-network-opt bridge=com.docker.network.bridge.host_binding_ipv4=127.0.0.1 \
  --default-network-opt bridge=com.docker.network.driver.mtu=1234