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 CLI 和 dockerd 守护进程使用。 |
DOCKER_DRIVER | 要使用的存储驱动程序。 |
DOCKER_RAMDISK | 如果设置此项,则会禁用 pivot_root。 |
DOCKER_TLS_VERIFY | 设置后,Docker 使用 TLS 并验证远程连接。此变量同时被 docker CLI 和 dockerd 守护进程使用。 |
DOCKER_TMPDIR | 守护进程创建的临时文件的位置。 |
HTTP_PROXY | HTTP 请求的代理 URL,除非被 NoProxy 覆盖。有关详细信息,请参阅 Go 规范。 |
HTTPS_PROXY | 用于HTTPS请求的代理URL,除非被NoProxy覆盖。有关详细信息,请参阅 Go规范。 |
MOBY_DISABLE_PIGZ | 禁止使用
unpigz 并行解压层,即使已安装。 |
NO_PROXY | 指定应从代理中排除的主机,以逗号分隔。有关详细信息,请参阅 Go 规范。 |
示例
代理配置
注意
如果你正在运行 Docker Desktop,请参阅 Docker Desktop 手册。
如果您位于 HTTP 代理服务器之后,例如在企业环境中, 您可能需要配置 Docker 守护进程以使用代理服务器进行 拉取和推送镜像等操作。守护进程可以通过三种方式进行配置:
- 使用环境变量(
HTTP_PROXY、HTTPS_PROXY和NO_PROXY)。 - 在守护进程配置文件中使用
http-proxy、https-proxy和no-proxy字段(Docker Engine 版本 23.0 或更高版本)。 - 使用
--http-proxy、--https-proxy和--no-proxy命令行选项。(Docker Engine 版本 23.0 或更高版本)。
命令行和配置文件选项优先于环境变量。请参阅
使用 systemd 控制和配置 Docker
以使用 systemd 在主机上设置这些环境变量。
守护进程套接字选项
Docker 守护进程可以通过三种不同类型的 Socket 监听 Docker Engine API 请求:unix、tcp 和 fd。
默认情况下,在 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_PROXY、HTTPS_PROXY 和 NO_PROXY 环境变量(或其小写形式)。HTTPS_PROXY 优先于 HTTP_PROXY。
Docker 客户端支持通过 SSH 连接到远程守护进程:
$ docker -H ssh://me@example.com:22/var/run/docker.sock ps
$ docker -H ssh://me@example.com:22 ps
$ docker -H ssh://me@example.com ps
$ docker -H ssh://example.com ps
要使用 SSH 连接,您需要设置 ssh,以便它能够通过公钥认证访问远程主机。不支持密码认证。如果您的密钥受密码保护,则需要设置 ssh-agent。
将 Docker 绑定到另一个主机/端口或 Unix 套接字
警告
将默认的
docker守护进程绑定到 TCP 端口或 Unixdocker用户组会带来安全风险,因为这可能允许非 root 用户获得主机上的 root 访问权限。请确保控制对docker的访问。如果您绑定到 TCP 端口,任何有权访问该端口的人都拥有完整的 Docker 访问权限;因此不建议在开放网络上使用。
通过设置 -H,可以让 Docker 守护进程监听特定的 IP 和端口。默认情况下,它监听 unix:///var/run/docker.sock,仅允许 root 用户进行本地连接。您可以将其设置为 0.0.0.0:2375 或特定的主机 IP 以允许所有人访问,但这并不推荐,因为有人可能会获得运行守护进程的主机的 root 权限。
同样地,Docker 客户端可以使用 -H 连接到自定义端口。
Docker 客户端默认连接到 Linux 上的 unix:///var/run/docker.sock,以及 Windows 上的 tcp://127.0.0.1:2376。
-H 接受以下格式的主机和端口分配:
tcp://[host]:[port][path] or unix://path例如:
tcp://-> 与127.0.0.1的 TCP 连接,当启用 TLS 加密时使用端口2376,当通信为明文时使用端口2375。tcp://host:2375-> TCP connection on host:2375tcp://host:2375/path-> 在 host:2375 上建立 TCP 连接,并在所有请求前添加路径unix://path/to/socket-> 位于path/to/socket的 Unix 套接字
-H, 当为空时, 默认值与未传入 -H 时的值相同。
-H 也接受 TCP 绑定的简写形式:host: 或 host:port 或 :port
以守护进程模式运行 Docker:
$ sudo <path to>/dockerd -H 0.0.0.0:5555 &
下载一个 ubuntu 镜像:
$ docker -H :5555 pull ubuntu
您可以使用多个 -H,例如,如果您想同时监听 TCP 和 Unix 套接字
$ sudo dockerd -H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock &
# Download an ubuntu image, use default Unix socket
$ docker pull ubuntu
# OR use the TCP port
$ docker -H tcp://127.0.0.1:2375 pull ubuntu
守护进程存储驱动
在 Linux 上,Docker 守护进程支持多种不同的镜像层存储驱动程序:overlay2、fuse-overlayfs、btrfs 和 zfs。
overlay2 是所有当前支持的 Linux 发行版的首选存储驱动,
并会被默认选中。除非用户有充分的理由选择其他存储驱动,
否则应使用 overlay2。
您可以在 选择存储驱动 中了解有关存储驱动程序的更多信息以及如何选择一个。
在 Windows 上,Docker 守护进程仅支持 windowsfilter 存储驱动。
各存储驱动选项
特定的存储驱动可以使用通过 --storage-opt 标志指定的选项进行配置。 zfs 的选项以 zfs 开头,而 btrfs 的选项以 btrfs 开头。
ZFS 选项
zfs.fsname
指定守护进程在创建数据集时应使用的 ZFS 文件系统。
默认情况下,使用 /var/lib/docker 中的 ZFS 文件系统。
示例
$ sudo dockerd -s zfs --storage-opt zfs.fsname=zroot/docker
Btrfs 选项
btrfs.min_space
指定创建用于容器的子卷时要使用的最小大小。如果用户在使用 --storage-opt size 选项创建或运行容器时对 btrfs 使用磁盘配额,Docker 应确保 size 不能小于 btrfs.min_space。
示例
$ sudo dockerd -s btrfs --storage-opt btrfs.min_space=10G
Overlay2 选项
overlay2.size
设置容器的默认最大大小。仅当后备文件系统为 xfs 并以 pquota 挂载选项挂载时才支持。在这些条件下,用户可以传递任何小于后备文件系统大小的值。
示例
$ sudo dockerd -s overlay2 --storage-opt overlay2.size=1G
Windowsfilter 选项
size
指定创建用于容器的沙箱时要使用的大小。 默认为 20G。
示例
C:\> dockerd --storage-opt size=40G运行时选项
Docker 守护进程依赖于一个
OCI 兼容的运行时
(通过 containerd 守护进程调用)作为其与 Linux
内核 namespaces、cgroups 和 SELinux 的接口。
配置容器运行时
默认情况下,Docker 守护进程使用 runc 作为容器运行时。 您可以配置守护进程以添加额外的运行时。
安装在 PATH 上的 containerd shim 可以直接使用,无需编辑守护进程的配置。例如,如果您在 PATH 上安装了 Kata Containers shim (containerd-shim-kata-v2),那么您可以通过 docker run 选择该运行时,而无需编辑守护进程的配置:
$ 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,支持的配置选项是 TypeUrl 和 ConfigPath。
例如:
{
"runtimes": {
"gvisor": {
"runtimeType": "io.containerd.runsc.v1",
"options": {
"TypeUrl": "io.containerd.runsc.v1.options",
"ConfigPath": "/etc/containerd/runsc.toml"
}
}
}
}您可以使用相同的 runtimeType 配置多个运行时。例如:
{
"runtimes": {
"gvisor-foo": {
"runtimeType": "io.containerd.runsc.v1",
"options": {
"TypeUrl": "io.containerd.runsc.v1.options",
"ConfigPath": "/etc/containerd/runsc-foo.toml"
}
},
"gvisor-bar": {
"runtimeType": "io.containerd.runsc.v1",
"options": {
"TypeUrl": "io.containerd.runsc.v1.options",
"ConfigPath": "/etc/containerd/runsc-bar.toml"
}
}
}
}与 "runtimeType": "io.containerd.runc.v2" 一起使用时,options 字段采用一组特殊的配置参数。有关 runc
参数的更多信息,请参阅
CRI 插件配置指南 中的 runc 配置部分。
配置 runc 替换插件
如果您想注册的运行时可以作为 runc 的直接替代品,您可以使用守护进程配置文件注册该运行时,或者使用 --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。
您只能指定 cgroupfs 或 systemd。如果您指定了
systemd 且该值不可用,系统将报错。如果您省略了
native.cgroupdriver 选项,在 cgroup v1 主机上将使用 cgroupfs,在支持 systemd 的 cgroup v2 主机上则使用 systemd。
此示例将 cgroupdriver 设置为 systemd:
$ sudo dockerd --exec-opt native.cgroupdriver=systemd
设置此选项将应用于守护进程启动的所有容器。
配置容器隔离技术 (Windows)
对于 Windows 容器,您可以使用 --exec-opt isolation 标志来指定要使用的默认容器隔离技术。
以下示例将 hyperv 设为默认隔离技术:
> dockerd --exec-opt isolation=hyperv
如果在守护进程启动时未指定隔离值,在 Windows 客户端上,默认值为 hyperv,而在 Windows 服务器上,默认值为 process。
守护进程 DNS 选项
要为所有 Docker 容器设置 DNS 服务器,请使用:
$ sudo dockerd --dns 8.8.8.8
要为所有 Docker 容器设置 DNS 搜索域,请使用:
$ sudo dockerd --dns-search example.com
允许推送非分发工件
某些镜像(例如 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 pull、
docker push 和 docker 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 主机配置中:
- 安装适用于您发行版的
ca-certificates软件包 - 向您的网络管理员获取代理的 CA 证书,并将其附加到
/etc/pki/tls/certs/ca-bundle.crt - 然后使用
HTTPS_PROXY=http://username:password@proxy:port/ dockerd启动您的 Docker 守护进程。username:和password@是可选的 - 只有在您的代理设置为需要身份验证时才需要它们。
这仅将代理和身份验证添加到 Docker 守护进程的请求中。 要在构建镜像和运行容器时使用代理,请参阅 配置 Docker 使用代理服务器
默认 ulimit 设置
--default-ulimit 标志允许您设置用于所有容器的默认 ulimit 选项。它采用与 docker run 的 --ulimit 相同的选项。如果未设置这些默认值,则 ulimit 设置从 Docker 守护进程继承。传递给 docker run 的任何 --ulimit 选项都会覆盖守护进程默认值。
设置 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 run 和 docker 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 create 和 docker 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。
下面的示例在启用 cdi 和 containerd-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- 这将使用 containerdrunhcsshim 来运行容器,并在 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