码头工人

预计阅读时间: 54分钟

守护程序

Usage:	dockerd COMMAND

A self-sufficient runtime for containers.

Options:
      --add-runtime runtime                   Register an additional OCI compatible runtime (default [])
      --allow-nondistributable-artifacts list Push nondistributable artifacts to specified registries (default [])
      --api-cors-header string                Set CORS headers in the Engine API
      --authorization-plugin list             Authorization plugins to load (default [])
      --bip string                            Specify network bridge IP
  -b, --bridge string                         Attach containers to a network bridge
      --cgroup-parent string                  Set parent cgroup for all containers
      --cluster-advertise string              Address or interface name to advertise
      --cluster-store string                  URL of the distributed storage backend
      --cluster-store-opt map                 Set cluster store options (default map[])
      --config-file string                    Daemon configuration file (default "/etc/docker/daemon.json")
      --containerd string                     Path to containerd socket
      --cpu-rt-period int                     Limit the CPU real-time period in microseconds
      --cpu-rt-runtime int                    Limit the CPU real-time runtime in microseconds
      --data-root string                      Root directory of persistent Docker state (default "/var/lib/docker")
  -D, --debug                                 Enable debug mode
      --default-gateway ip                    Container default gateway IPv4 address
      --default-gateway-v6 ip                 Container default gateway IPv6 address
      --default-address-pool                  Set the default address pool for local node networks
      --default-runtime string                Default OCI runtime for containers (default "runc")
      --default-ulimit ulimit                 Default ulimits for containers (default [])
      --dns list                              DNS server to use (default [])
      --dns-opt list                          DNS options to use (default [])
      --dns-search list                       DNS search domains to use (default [])
      --exec-opt list                         Runtime execution options (default [])
      --exec-root string                      Root directory for execution state files (default "/var/run/docker")
      --experimental                          Enable experimental features
      --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 (default [])
      --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 (default [])
      --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)
      --iptables                              Enable addition of iptables rules (default true)
      --ipv6                                  Enable IPv6 networking
      --label list                            Set key=value labels to the daemon (default [])
      --live-restore                          Enable live restore of docker when containers are still running
      --log-driver string                     Default driver for container logs (default "json-file")
  -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 for each pull (default 3)
      --max-concurrent-uploads int            Set the max concurrent uploads for each push (default 5)
      --metrics-addr string                   Set default address and port to serve the metrics api on
      --mtu int                               Set the containers network MTU
      --node-generic-resources list           Advertise user-defined resource
      --no-new-privileges                     Set no-new-privileges by default for new containers
      --oom-score-adjust int                  Set the oom_score_adj for the daemon (default -500)
  -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 Docker registry mirror (default [])
      --seccomp-profile string                Path to seccomp profile
      --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 (default [])
      --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
  -v, --version                               Print version information and quit

带有[]的选项可以多次指定。

描述

dockerd是管理容器的持久性过程。Docker为守护程序和客户端使用不同的二进制文件。要运行守护程序,请键入dockerd

要使用调试输出运行守护程序,请使用dockerd -D或在daemon.json文件中添加"debug": true

注意 :在Docker 1.13及更高版本中,通过使用--experimental标志启动dockerd或在daemon.json文件中添加"experimental": true来启用实验性功能。在早期的Docker版本中,需要其他版本才能启用实验性功能。

例子

守护程序套接字选项

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

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

如果需要远程访问Docker守护程序,则需要启用tcp Socket。请注意,默认设置可提供对Docker守护程序的未加密和未经身份验证的直接访问-并应使用内置的HTTPS加密套接字或在其前面放置安全的Web代理来保护其安全。您可以使用-H tcp://0.0.0.0:2375 2375在所有网络接口上的端口2375上监听,也可以使用其IP地址-H tcp://192.168.59.103:2375在特定的网络接口上监听端口-H tcp://192.168.59.103:2375 。通常使用端口2375进行未加密,使用端口2376进行与守护程序的加密通信。

注意 :如果您使用的是HTTPS加密套接字,请记住仅支持TLS1.0和更高版本。出于安全原因,不再支持SSLv3及以下协议。

在基于Systemd的系统上,可以通过dockerd -H fd:// 套接字激活与守护程序通信,请使用dockerd -H fd:// 。使用fd://可以在大多数设置中完美运行,但是您也可以指定单个套接字: dockerd -H fd://3 。如果找不到指定的套接字激活文件,则Docker将退出。您可以在Docker源代码树中找到在Docker和Systemd中使用Systemd套接字激活的示例。

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

# listen using the default unix socket, and on 2 specific IP addresses on this host.

$ 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 18.09开始,Docker客户端支持通过SSH连接到远程守护程序:

$ 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 binary 18.09或更高版本。

将Docker绑定到另一个主机/端口或Unix套接字

警告 :将默认的docker守护程序绑定到TCP端口或Unix docker用户组,将使非root用户获得对主机的root访问权限,从而增加安全风险。确保控制对docker访问。如果绑定到TCP端口,则有权访问该端口的任何人都具有完全的Docker访问权限;因此建议不要在开放式网络上使用。

使用-H ,可以使Docker守护程序监听特定的IP和端口。默认情况下,它将在unix:///var/run/docker.sockunix:///var/run/docker.sock以仅允许root用户进行本地连接。您可以将其设置为0.0.0.0:2375或特定的主机IP来授予所有人访问权限,但是不建议这样做,因为这样对于某人获得对运行守护程序的主机的根访问权限很简单。

同样,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加密打开时,在端口2376上的TCP连接到127.0.0.1 ,或者在通信为纯文本时,在端口2375上的TCP连接。
  • tcp://host:2375 > host:2375上的TCP连接
  • tcp://host:2375/path > host:2375上的TCP连接,并在所有请求之前添加路径
  • unix://path/to/socket >位于path/to/socket Unix path/to/socket

-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

例如,如果您想同时监听TCP和Unix套接字,则可以使用多个-H

# Run docker in daemon mode
$ sudo <path to>/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守护程序支持几种不同的图像层存储驱动程序: aufsdevicemapperbtrfszfsoverlayoverlay2

aufs驱动程序是最早的驱动程序,但是基于Linux内核补丁集,该补丁集不太可能合并到主内核中。还已知这些会导致严重的内核崩溃。但是aufs允许容器共享可执行文件和共享库的内存,因此在使用相同程序或库运行数千个容器时,这是一个有用的选择。

devicemapper驱动程序使用精简配置和写入时复制(CoW)快照。对于每个devicemapper图形位置-通常为/var/lib/docker/devicemapper基于两个块设备创建一个精简池,一个用于数据,另一个用于元数据。默认情况下,这些块设备是通过使用自动创建的稀疏文件的环回安装来自动创建的。有关如何自定义此设置的方法,请参考下面的Devicemapper选项〜jpetazzo /使用Device Mapper插件调整Docker容器大小的文章介绍了如何在不使用选项的情况下调整现有设置。

btrfs驱动程序对于docker build非常快-但就像devicemapper不会在设备之间共享可执行内存。使用dockerd -s btrfs -g /mnt/btrfs_partition

zfs驱动程序可能不如btrfs快,但在稳定性方面的记录则更长。多亏了Single Copy ARC ,克隆之间的共享块将仅被缓存一次。使用dockerd -s zfs 。要选择其他zfs文件系统,请按照ZFS options中所述设置zfs.fsname选项。

overlay是一个非常快速的联合文件系统。从3.18.0开始,它现在已合并到主要的Linux内核中。 overlay还支持页面缓存共享,这意味着访问同一文件的多个容器可以共享一个(或多个)页面缓存条目,这使overlayaufs驱动程序一样有效。调用dockerd -s overlay以使用它。

注意 :与overlay ,该功能还很年轻,不应该在生产中使用。最值得注意的是,使用overlay可能导致过多的inode消耗(尤其是随着图像数量的增长),并且与RPM的使用不兼容。

overlay2使用相同的快速联合文件系统,但利用Linux内核4.0中添加的其他功能来避免过多的inode消耗。调用dockerd -s overlay2以使用它。

注意btrfs或任何“写入时复制”文件系统当前均不支持overlayoverlay2 ,并且仅应在ext4分区上使用。

在Windows上,Docker守护程序支持单个映像层存储驱动程序,具体取决于映像平台:Windows映像的windowsfilter和Windows上的Linux容器的lcow

每个存储驱动程序的选项

可以使用--storage-opt标志指定的选项来配置特定的存储驱动程序。对于选项devicemapper的前缀为dm ,用于选择zfs下手zfs ,用于期权btrfs开始btrfs和选项lcow下手lcow

Devicemapper选项

这是Linux上devicemapper的配置文件示例:

{
  "storage-driver": "devicemapper",
  "storage-opts": [
    "dm.thinpooldev=/dev/mapper/thin-pool",
    "dm.use_deferred_deletion=true",
    "dm.use_deferred_removal=true"
  ]
}
dm.thinpooldev

指定用于精简池的自定义块存储设备。

如果将块设备用于设备映射器存储,则最好使用lvm创建和管理精简池卷。然后将该卷交给Docker以专门创建映像和容器所需的快照卷。

管理Engine外部的精简池是使Docker利用设备映射器精简资源调配作为Docker容器的后备存储的功能最丰富的方法。基于lvm的精简池管理功能的重点包括:自动或交互式精简池调整大小支持,动态更改精简池功能,当lvm激活精简池时自动进行精简元数据检查等。

如果没有提供精简池,则作为回退,将创建回送文件。环回速度非常慢,但是无需任何预先配置的存储即可使用。强烈建议您在生产中不要使用环回。确保您的Engine守护程序提供了--storage-opt dm.thinpooldev参数。

例:
$ sudo dockerd --storage-opt dm.thinpooldev=/dev/mapper/thin-pool
dm.directlvm_device

作为提供上述精简池的替代方法,Docker可以为您设置一个块设备。

例:
$ sudo dockerd --storage-opt dm.directlvm_device=/dev/xvdf
dm.thinp_percent

设置用于存储的传入块设备的百分比。

例:
$ sudo dockerd --storage-opt dm.thinp_percent=95
dm.thinp_metapercent

设置传入的块设备用于元数据存储的百分比。

例:
$ sudo dockerd --storage-opt dm.thinp_metapercent=1
dm.thinp_autoextend_threshold

设置lvm尝试自动扩展可用空间之前使用的空间百分比值[100 =禁用]

例:
$ sudo dockerd --storage-opt dm.thinp_autoextend_threshold=80
dm.thinp_autoextend_percent

设置值百分比值,以在lvm尝试自动扩展可用空间时增加精简池[100 =禁用]

例:
$ sudo dockerd --storage-opt dm.thinp_autoextend_percent=20
dm.basesize

指定创建基本设备时要使用的大小,这会限制图像和容器的大小。默认值为10G。请注意,瘦设备本来就是“稀疏”的,所以一个几乎是空的10G设备不会在池上使用10 GB的空间。但是,如果设备更大,则文件系统将为空情况使用更多空间。

可以在守护程序重新启动时增加基本设备的大小,这将使所有将来的映像和容器(基于这些新映像)都具有新的基本设备大小。

例子
$ sudo dockerd --storage-opt dm.basesize=50G

这会将基本设备的大小增加到50G。如果现有基本设备大小大于50G,则Docker守护程序将引发错误。用户可以使用此选项扩展基本设备的大小,但是不允许缩小。

此值会影响系统范围的“基本”空文件系统,该文件系统可能已被拉取的映像初始化和继承。通常,对此值进行更改需要其他步骤才能生效:

$ sudo service docker stop

$ sudo rm -rf /var/lib/docker

$ sudo service docker start
dm.loopdatasize

注意 :此选项配置devicemapper环回,不应在生产中使用。

指定在为精简池使用的“数据”设备创建回送文件时使用的大小。默认大小为100G。该文件稀疏,因此最初不会占用太多空间。

$ sudo dockerd --storage-opt dm.loopdatasize=200G
dm.loopmetadatasize

注意 :此选项配置devicemapper环回,不应在生产中使用。

指定在为精简池使用的“元数据”设备创建回送文件时使用的大小。默认大小为2G。该文件稀疏,因此最初不会占用太多空间。

$ sudo dockerd --storage-opt dm.loopmetadatasize=4G
文件

指定用于基本设备的文件系统类型。支持的选项是“ ext4”和“ xfs”。默认值为“ xfs”

$ sudo dockerd --storage-opt dm.fs=ext4
dm.mkfsarg

指定在创建基本设备时要使用的其他mkfs参数。

$ sudo dockerd --storage-opt "dm.mkfsarg=-O ^has_journal"
dm.mountopt

指定在安装瘦设备时使用的额外安装选项。

$ sudo dockerd --storage-opt dm.mountopt=nodiscard
dm.datadev

(已弃用,请使用dm.thinpooldev

指定用于精简池数据的自定义块设备。

如果使用一个块设备为设备映射存储,理想地既datadevmetadatadev应指定完全避免使用环回装置。

$ sudo dockerd \
      --storage-opt dm.datadev=/dev/sdb1 \
      --storage-opt dm.metadatadev=/dev/sdc1
dm.metadatadev

(已弃用,请使用dm.thinpooldev

指定用于精简池元数据的自定义块设备。

为了获得最佳性能,元数据应该与数据位于不同的主轴上,甚至最好位于SSD上。

如果设置新的元数据池,则必须有效。这可以通过将前4k设为零以指示空的元数据来实现,如下所示:

$ dd if=/dev/zero of=$metadata_dev bs=4096 count=1
$ sudo dockerd \
      --storage-opt dm.datadev=/dev/sdb1 \
      --storage-opt dm.metadatadev=/dev/sdc1
dm.blocksize

指定用于精简池的自定义块大小。默认的块大小为64K。

$ sudo dockerd --storage-opt dm.blocksize=512K
dm.blkdiscard

在删除devicemapper设备时启用或禁用blkdiscard的使用。默认情况下(仅)在使用环回设备时启用此功能,并且在删除图像/容器时需要重新解析环回文件。

对回禁用这可能会导致更快的容器取出时间,但会在使用的空间/var/lib/docker容器中取出时不返回到系统用于其他用途的目录。

例子
$ sudo dockerd --storage-opt dm.blkdiscard=false
dm.override_udev_sync_check

覆盖devicemapperudev之间的udev同步检查。 udev是Linux内核的设备管理器。

要查看使用devicemapper驱动程序的Docker守护程序的udev同步支持,请运行:

$ docker info
[...]
Udev Sync Supported: true
[...]

如果udev sync支持为true ,则devicemapper和udev可以协调容器的设备激活和停用。

如果udev sync支持为false ,则在创建和清理期间devicemapperudev之间会发生竞争状态。竞争条件会导致错误和失败。(有关这些失败的信息,请参阅docker#4036

要允许docker守护程序启动,无论不支持udev同步如何,请将dm.override_udev_sync_check设置为true:

$ sudo dockerd --storage-opt dm.override_udev_sync_check=true

当此值为truedevicemapper继续并仅警告您正在发生的错误。

注意 :理想的情况是追求一个不支持与udev同步的docker守护程序和环境。有关此主题的更多讨论,请参阅docker#4036 。否则,请设置此标志以将现有Docker守护程序迁移到具有受支持环境的守护程序。

dm.use_deferred_removal

如果libdm和内核驱动程序支持该机制,则启用延迟设备删除功能。

延迟设备删除意味着如果在删除/停用设备时设备正忙,则计划在设备上进行延迟删除。当设备的最后一个用户退出时,设备会自动消失。

例如,当容器退出时,其关联的瘦设备将被移除。如果该设备泄漏到其他安装名称空间中并且无法删除,则容器退出仍然成功,并且此选项导致系统安排该设备进行延迟删除。它不会在循环中尝试删除忙碌的设备。

$ sudo dockerd --storage-opt dm.use_deferred_removal=true
dm.use_deferred_deletion

启用对精简池设备使用延迟的设备删除。默认情况下,精简池设备删除是同步的。在删除容器之前,Docker守护程序会删除所有关联的设备。如果存储驱动程序无法删除设备,则容器删除失败并返回守护程序。

Error deleting container: Error response from daemon: Cannot destroy container

为避免此故障,请在守护程序上同时启用延迟的设备删除和延迟的设备删除。

$ sudo dockerd \
      --storage-opt dm.use_deferred_deletion=true \
      --storage-opt dm.use_deferred_removal=true

启用这两个选项后,如果在驱动程序删除容器时设备正忙,则驱动程序会将设备标记为已删除。以后,当不使用该设备时,驱动程序将其删除。

通常,默认情况下启用此选项应该很安全。当跨多个安装名称空间意外发生安装点泄漏时,它将提供帮助。

dm.min_free_space

指定精简池中成功创建新设备所需的最小可用空间百分比。此检查适用于可用数据空间以及可用元数据空间。有效值为0%-99%。值0%禁用可用空间检查逻辑。如果用户未为此选项指定值,则引擎将使用默认值10%。

每当创建新的精简池设备时(在docker pull期间或容器创建期间),引擎都会检查是否有最小可用空间。如果没有足够的空间,则设备创建将失败,并且任何相关的docker操作都会失败。

要从此错误中恢复,必须在精简池中创建更多可用空间以从错误中恢复。您可以通过从精简池中删除一些图像和容器来创建可用空间。您还可以向精简池添加更多存储。

要向LVM(逻辑卷管理)瘦池添加更多空间,只需向卷组容器瘦池添加更多存储空间即可;这应该会自动解决所有错误。如果您的配置使用循环设备,则停止Engine守护程序,增大循环文件的大小,然后重新启动该守护程序以解决问题。

$ sudo dockerd --storage-opt dm.min_free_space=10%
dm.xfs_nospace_max_retries

指定基础存储设备返回ENOSPC(无空间)错误时XFS应该尝试完成IO的最大重试次数。

默认情况下,XFS无限次重试以完成IO,这可能会导致无法终止的过程。要更改此行为,可以将xfs_nospace_max_retries设置为0,并且XFS在获取ENOSPC之后将不重试IO,并且将关闭文件系统。

$ sudo dockerd --storage-opt dm.xfs_nospace_max_retries=0
dm.libdm_log_level

指定将转发到dockerd日志的最大libdm日志级别(由--log-level指定)。此选项主要用于调试涉及libdm问题。使用默认值以外的值可能会导致记录错误肯定的警告。

指定的值必须在有效的libdm日志级别的范围内。在撰写本文时,以下是libdm日志级别以及dockerd输出时的相应级别的dockerd

libdm级别 -日志级别
_LOG_FATAL 2 错误
_LOG_ERR 3 错误
_LOG_WARN 4 警告
_LOG_NOTICE 5 信息
_LOG_INFO 6 信息
_LOG_DEBUG 7 调试
$ sudo dockerd \
      --log-level debug \
      --storage-opt dm.libdm_log_level=7

ZFS选项

zfs.fsname

设置zfs文件系统,docker将在该文件系统下创建自己的数据集。默认情况下,docker将选择docker graph( /var/lib/docker )所在的zfs文件系统。

$ sudo dockerd -s zfs --storage-opt zfs.fsname=zroot/docker

Btrfs选项

btrfs.min_space

指定创建用于容器的子卷时要使用的最小大小。如果用户在使用--storage-opt size选项创建或运行容器时使用btrfs的磁盘配额,则docker应确保大小不能小于btrfs.min_space

$ sudo dockerd -s btrfs --storage-opt btrfs.min_space=10G

叠加2选项

overlay2.override_kernel_check

覆盖允许overlay2的Linux内核版本检查。在4.0.0版本中,对Linux2内核中添加了对overlay2所需的多个较低目录的支持。但是,可能会修补某些较旧的内核版本,以添加对OverlayFS的多个较低目录支持。仅在验证内核中存在此支持后,才应使用此选项。在没有此支持的情况下在内核上应用此选项将导致安装失败。

overlay2.size

设置容器的默认最大大小。仅当支持fs为xfs并使用pquota挂载选项挂载时,才支持该功能。在这些条件下,用户可以传递小于背衬fs尺寸的任何尺寸。

$ sudo dockerd -s overlay2 --storage-opt overlay2.size=1G

Windowsfilter选项

尺寸

指定创建用于容器的沙箱时使用的大小。默认为20G。

C:\> dockerd --storage-opt size=40G

LCOW(Windows上的Linux容器)选项

全局模式

指定守护程序是根据需要实例化实用程序VM实例(建议使用默认值,如果省略则默认),还是使用单个全局实用程序VM(性能更好,但具有安全隐患,不建议用于生产部署)。

C:\> dockerd --storage-opt lcow.globalmode=false
lcow.kirdpath

指定用于引导实用程序VM的一对内核文件和initrd文件的位置的文件夹路径。默认为%ProgramFiles%\Linux Containers

C:\> dockerd --storage-opt lcow.kirdpath=c:\path\to\files
内核

指定位于lcow.kirdpath路径中的内核文件的文件名。默认为bootx64.efi

C:\> dockerd --storage-opt lcow.kernel=kernel.efi
lcow.initrd

指定位于lcow.kirdpath路径中的initrd文件的文件名。默认为initrd.img

C:\> dockerd --storage-opt lcow.initrd=myinitrd.img
lcow.boot参数

指定在内核/ initrd模式下引导实用程序VM的其他引导参数。忽略实用程序VM是否从VHD引导。这些设置是特定于内核的。

C:\> dockerd --storage-opt "lcow.bootparameters='option=value'"
硬盘驱动器

指定用于引导实用程序VM的自定义VHDX,以替代内核和initrd引导。缺省为uvm.vhdx下的lcow.kirdpath

C:\> dockerd --storage-opt lcow.vhdx=custom.vhdx
lcow.timeout

指定实用程序VM操作的超时时间(以秒为单位)。默认为300。

C:\> dockerd --storage-opt lcow.timeout=240
lcow.sandboxsize

指定创建用于容器的沙箱时要使用的GB大小。默认为20不能小于20。

C:\> dockerd --storage-opt lcow.sandboxsize=40

Docker运行时执行选项

Docker守护程序依赖于OCI兼容运行时(通过containerd守护程序调用)作为与Linux内核namespacescgroupsSELinux

默认情况下,Docker守护程序会自动启动containerd 。如果要控制containerd启动,请手动启动containerd然后使用--containerd标志将路径传递到containerd套接字。例如:

$ sudo dockerd --containerd /var/run/dev/docker-containerd.sock

可以通过配置文件或使用--add-runtime命令行参数在守护程序中注册--add-runtime

以下是通过配置添加2个运行时的示例:

{
	"default-runtime": "runc",
	"runtimes": {
		"runc": {
			"path": "runc"
		},
		"custom": {
			"path": "/usr/local/bin/my-runc-replacement",
			"runtimeArgs": [
				"--debug"
			]
		}
	}
}

这是通过命令行的相同示例:

$ sudo dockerd --add-runtime runc=runc --add-runtime custom=/usr/local/bin/my-runc-replacement

注意 :不支持通过命令行定义运行时参数。

运行时的选项

您可以使用--exec-opt标志指定的选项来配置运行时。所有标志的选项都具有本native前缀。单个native.cgroupdriver选项可用。

native.cgroupdriver选项指定对容器cgroup的管理。您只能指定cgroupfssystemd 。如果指定systemd而不可用,则系统会出错。如果省略native.cgroupdriver选项,则使用cgroupfs

本示例将cgroupdriver设置为systemd

$ sudo dockerd --exec-opt native.cgroupdriver=systemd

设置此选项适用于守护程序启动的所有容器。

Windows容器也将--exec-opt用于特殊用途。Docker用户可以以此指定默认的容器隔离技术,例如:

> dockerd --exec-opt isolation=hyperv

将使hyperv成为Windows上的默认隔离技术。如果在守护程序启动时未指定隔离值,则在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语法描述的子网内的注册表中。

此选项可以多次使用。

当将包含不可分发的工件的图像推送到气隙网络上的注册表时,此选项很有用,这样该网络上的主机可以拉出图像而无需连接到其他服务器。

警告 :不可分发的工件通常在如何以及在何处以及如何共享方面受到限制。仅使用此功能将工件推送到私有注册表,并确保您遵守涵盖重新分发不可分发工件的所有条款。

不安全的注册表

Docker认为私有注册表是安全的还是不安全的。在本节的其余部分中, 注册表用于私有注册表 ,而myregistry:5000是私有注册表的占位符示例。

安全注册表使用TLS,并将其CA证书的副本放在/etc/docker/certs.d/myregistry:5000/ca.crt的Docker主机上。不安全的注册表要么不使用TLS(即侦听纯文本HTTP),要么正在使用TLS和Docker守护程序未知的CA证书。当在/etc/docker/certs.d/myregistry:5000//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将导致错误消息,提示用户--insecure-registry进行安全保护或将--insecure-registry标志传递给Docker守护程序。

自Docker 1.3.2起,其IP地址在127.0.0.0/8范围内的本地注册表会自动标记为不安全。不建议依赖此方法,因为将来可能会更改。

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

旧版注册表

从Docker 17.12开始,不再支持针对仅支持旧版v1协议的注册表的操作。具体来说,该守护进程将不会尝试pushpulllogin到v1注册表。例外情况是search仍然可以在v1注册中心上执行。

disable-legacy-registry配置选项已删除,使用时将在守护程序启动时产生错误。

在HTTPS_PROXY之后运行Docker守护程序

在使用HTTPS代理的LAN中运行时,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 build和正在运行的容器将需要额外的配置才能使用代理

默认ulimit设置

--default-ulimit允许您设置所有容器使用的默认ulimit选项。它采用相同的选项, --ulimitdocker run 。如果未设置这些默认值,则ulimit设置将从Docker守护程序继承(如果未在docker run上设置)。传递给--ulimit docker run任何--ulimit选项docker run将覆盖这些默认值。

小心地使用ulimit标志设置nproc ,因为nproc是Linux设计的,用于设置用户(而不是容器)可用的最大进程数。有关详细信息,请检查运行参考。

节点发现

--cluster-advertise选项指定此特定守护程序实例在向集群发布自身时应使用的host:portinterface:port组合。通过此值,远程主机可以访问该守护程序。如果指定接口,请确保它包含实际Docker主机的IP地址。对于通过docker-machine创建的Engine安装,该接口通常为eth1

守护程序使用libkv播发集群中的节点。一些键值后端支持双向TLS。要配置客户端使用的TLS设置,可以使用--cluster-store-opt标志来配置守护进程使用的TLS设置,并指定PEM编码文件的路径。例如:

$ sudo dockerd \
    --cluster-advertise 192.168.1.2:2376 \
    --cluster-store etcd://192.168.1.2:2379 \
    --cluster-store-opt kv.cacertfile=/path/to/ca.pem \
    --cluster-store-opt kv.certfile=/path/to/cert.pem \
    --cluster-store-opt kv.keyfile=/path/to/key.pem

当前支持的群集存储选项为:

选项 描述
发现心跳 指定以秒为单位的心跳定时器,用于在守护进程作为keepalive机制,以确保发现模块对待节点集群中活着。如果未配置,则默认值为20秒。
Discovery.ttl 指定以秒为单位的TTL(生存时间),如果在配置的ttl值内未收到有效的心跳,发现模块将使用该TTL来使节点超时。如果未配置,则默认值为60秒。
kv.cacertfile 指定具有PEM编码的CA证书以信任的本地文件的路径。
kv.certfile 指定带有PEM编码证书的本地文件的路径。该证书用作与密钥/值存储区通信的客户端证书。
kv.keyfile 使用PEM编码的私钥指定本地文件的路径。此私钥用作与密钥/值存储区通信的客户端密钥。
路径 指定键/值存储中的路径。如果未配置,则默认值为“ docker / nodes”。

访问授权

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

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

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

安装插件后,插件将允许或拒绝通过命令行或Docker的Engine API对daemon请求。如果您安装了多个插件,则每个插件必须依次允许请求完成。

有关如何创建授权插件的信息,请参阅本文档“ Docker扩展”部分中的“ 授权插件”部分。

守护程序用户名称空间选项

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

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

杂项选项

IP伪装使用地址转换来允许没有公共IP的容器与Internet上的其他计算机通信。这可能会干扰某些网络拓扑,可以使用--ip-masq=false禁用它。

Docker支持Docker数据目录( /var/lib/docker )和/var/lib/docker/tmp软链接。DOCKER_TMPDIR和数据目录可以这样设置:

DOCKER_TMPDIR=/mnt/disk2/tmp /usr/local/bin/dockerd -D -g /var/lib/docker -H unix:// > /var/lib/docker-machine/docker.log 2>&1
# or
export DOCKER_TMPDIR=/mnt/disk2/tmp
/usr/local/bin/dockerd -D -g /var/lib/docker -H unix:// > /var/lib/docker-machine/docker.log 2>&1

默认的cgroup父级

--cgroup-parent选项允许您设置用于容器的默认cgroup父级。如果未设置此选项,则对于fs cgroup驱动程序,默认为/docker ;对于systemd cgroup驱动程序,默认为system.slice

如果cgroup的前导斜杠( / ),则在根cgroup下创建cgroup,否则在守护程序cgroup下创建cgroup。

假设守护程序在cgroup daemoncgroup运行,--cgroup --cgroup-parent=/foobar/sys/fs/cgroup/memory/foobar创建一个cgroup,而使用--cgroup-parent=foobar/sys/fs/cgroup/memory/daemoncgroup/foobar创建cgroup /sys/fs/cgroup/memory/daemoncgroup/foobar

systemd cgroup驱动程序对--cgroup-parent具有不同的规则。Systemd按切片表示层次结构,切片的名称对树中的位置进行编码。因此,systemd cgroup的--cgroup-parent应该是切片名称。名称可以包含一系列用短划线分隔的名称,这些名称描述了从根切片到切片的路径。例如,-- --cgroup-parent=user-ab.slice表示在/sys/fs/cgroup/memory/user.slice/user-a.slice/user-ab.slice/docker-<id>.scope创建容器的内存cgroup /sys/fs/cgroup/memory/user.slice/user-a.slice/user-ab.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上发出请求,以接收普罗米修斯格式的指标。

端口9323与Docker指标关联默认端口,以避免与其他Prometheus导出器和服务发生冲突。

如果您正在运行Prometheus服务器,则可以将此地址添加到您的抓取配置中,以使Prometheus在Docker上收集指标。有关Prometheus的更多信息,您可以在这里查看网站。

scrape_configs:
  - job_name: 'docker'
    static_configs:
      - targets: ['127.0.0.1:9323']

请注意,此功能仍标记为实验性,因为在该功能仍处于实验性状态时,度量标准和度量标准名称可能会更改。请提供有关您希望在API中收集的内容的反馈。

节点通用资源

--node-generic-resources选项采用键值对( key=value )的列表,该列表允许您在群集集群中播发用户定义的资源。

当前的预期用例是通告NVIDIA GPU,以便请求NVIDIA-GPU=[0-16]可以降落在具有足够GPU来运行任务的节点上。

用法示例:

{
	"node-generic-resources": ["NVIDIA-GPU=UUID1", "NVIDIA-GPU=UUID2"]
}

守护程序配置文件

--config-file选项允许您以JSON格式设置守护程序的任何配置选项。该文件使用与键相同的标志名,但允许多个条目的标志除外,该文件使用多个标志名,例如, labels标志的label

配置文件中设置的选项不得与通过标志设置的选项冲突。如果文件和标志之间的选项重复,则不管其值如何,docker守护程序均无法启动。我们这样做是为了避免默默地忽略配置重载中引入的更改。例如,如果您在配置文件中设置守护程序标签,并且还通过--label标志设置了守护程序标签,则守护程序无法启动。守护程序启动时,文件中不存在的选项将被忽略。

在Linux上

Linux上配置文件的默认位置是/etc/docker/daemon.json--config-file标志可用于指定非默认位置。

这是Linux上允许的配置选项的完整示例:

{
	"authorization-plugins": [],
	"data-root": "",
	"dns": [],
	"dns-opts": [],
	"dns-search": [],
	"exec-opts": [],
	"exec-root": "",
	"experimental": false,
	"features": {},
	"storage-driver": "",
	"storage-opts": [],
	"labels": [],
	"live-restore": true,
	"log-driver": "json-file",
	"log-opts": {
		"max-size": "10m",
		"max-file":"5",
		"labels": "somelabel",
		"env": "os,customer"
	},
	"mtu": 0,
	"pidfile": "",
	"cluster-store": "",
	"cluster-store-opts": {},
	"cluster-advertise": "",
	"max-concurrent-downloads": 3,
	"max-concurrent-uploads": 5,
	"default-shm-size": "64M",
	"shutdown-timeout": 15,
	"debug": true,
	"hosts": [],
	"log-level": "",
	"tls": true,
	"tlsverify": true,
	"tlscacert": "",
	"tlscert": "",
	"tlskey": "",
	"swarm-default-advertise-addr": "",
	"api-cors-header": "",
	"selinux-enabled": false,
	"userns-remap": "",
	"group": "",
	"cgroup-parent": "",
	"default-ulimits": {
		"nofile": {
			"Name": "nofile",
			"Hard": 64000,
			"Soft": 64000
		}
	},
	"init": false,
	"init-path": "/usr/libexec/docker-init",
	"ipv6": false,
	"iptables": false,
	"ip-forward": false,
	"ip-masq": false,
	"userland-proxy": false,
	"userland-proxy-path": "/usr/libexec/docker-proxy",
	"ip": "0.0.0.0",
	"bridge": "",
	"bip": "",
	"fixed-cidr": "",
	"fixed-cidr-v6": "",
	"default-gateway": "",
	"default-gateway-v6": "",
	"icc": false,
	"raw-logs": false,
	"allow-nondistributable-artifacts": [],
	"registry-mirrors": [],
	"seccomp-profile": "",
	"insecure-registries": [],
	"no-new-privileges": false,
	"default-runtime": "runc",
	"oom-score-adjust": -500,
	"node-generic-resources": ["NVIDIA-GPU=UUID1", "NVIDIA-GPU=UUID2"],
	"runtimes": {
		"cc-runtime": {
			"path": "/usr/bin/cc-runtime"
		},
		"custom": {
			"path": "/usr/local/bin/my-runc-replacement",
			"runtimeArgs": [
				"--debug"
			]
		}
	},
	"default-address-pools":[
		{"base":"172.80.0.0/16","size":24},
		{"base":"172.90.0.0/16","size":24}
	]
}

注意:不能在daemon.json中设置已经在守护程序启动时设置为标志的选项。在使用systemd启动Docker守护程序的系统上,已设置-H ,因此您无法使用daemon.jsonhosts键添加侦听地址。请参阅https://docs.docker.com/engine/admin/systemd/#custom-docker-daemon-options,了解如何使用systemd插入文件来完成此任务。

在Windows上

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

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

{
    "authorization-plugins": [],
    "data-root": "",
    "dns": [],
    "dns-opts": [],
    "dns-search": [],
    "exec-opts": [],
    "experimental": false,
    "features":{},
    "storage-driver": "",
    "storage-opts": [],
    "labels": [],
    "log-driver": "",
    "mtu": 0,
    "pidfile": "",
    "cluster-store": "",
    "cluster-advertise": "",
    "max-concurrent-downloads": 3,
    "max-concurrent-uploads": 5,
    "shutdown-timeout": 15,
    "debug": true,
    "hosts": [],
    "log-level": "",
    "tlsverify": true,
    "tlscacert": "",
    "tlscert": "",
    "tlskey": "",
    "swarm-default-advertise-addr": "",
    "group": "",
    "default-ulimits": {},
    "bridge": "",
    "fixed-cidr": "",
    "raw-logs": false,
    "allow-nondistributable-artifacts": [],
    "registry-mirrors": [],
    "insecure-registries": []
}

功能选项

daemon.json的可选字段features允许用户启用或禁用特定的守护程序功能。例如, {"features":{"buildkit": true}}启用buildkit作为默认的buildkit映像生成器。

当前支持的功能选项列表:

  • buildkit :当设置为true或通过false禁用它时,它将启用buildkit作为默认生成器。请注意,如果未在守护程序配置文件中显式设置此选项,则由cli确定要调用哪个构建器。

配置重载行为

守护程序运行时可以重新配置某些选项,而无需重新启动进程。我们在Linux中使用SIGHUP信号重新加载,并在Windows中使用键Global\docker-daemon-config-$PID全局事件。可以在配置文件中修改选项,但仍会检查与提供的标志是否冲突。如果存在冲突,守护程序将无法重新配置自身,但不会停止执行。

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

  • debug :设置为true时,它将守护程序更改为调试模式。
  • cluster-store :它使用新地址重新加载发现存储。
  • cluster-store-opts :它使用新选项重新加载发现存储。
  • cluster-advertise :重新加载后修改发布的地址。
  • labels :它用一组新标签替换守护程序标签。
  • live-restore在守护程序停机期间使容器保持活动状态
  • max-concurrent-downloads :它更新每个请求的最大并发下载量。
  • max-concurrent-uploads :它更新每次推送的最大并发上传数。
  • default-runtime :如果在容器创建时未指定运行时,它将更新要使用的运行时。默认为“默认”,这是官方docker软件包附带的运行时。
  • runtimes :它更新可用于运行容器的可用OCI运行时的列表。
  • authorization-plugin :它指定要使用的授权插件。
  • allow-nondistributable-artifacts :用新的注册表集替换守护程序将不可分发的工件推送到的注册表集。
  • insecure-registries :它用一组新的不安全注册表替换守护程序不安全注册表。如果守护程序配置中的一些现有不安全注册表不在新重新加载的不安全目录中,则这些现有的注册表将从守护程序的配置中删除。
  • registry-mirrors :它用一组新的注册表镜像替换守护程序注册表镜像。如果守护程序配置中的某些现有注册表镜像不在新近重新加载的注册表镜像中,则将从守护程序的配置中删除这些现有注册表镜像。
  • shutdown-timeout :它将新的超时值替换为守护程序的现有配置超时值,以关闭所有容器。
  • features :它显式启用或禁用特定功能。

仅当先前未配置这些配置时,才更新和重新加载群集配置,例如--cluster-store ,-- --cluster-advertise--cluster-store-opts 。如果在标记中提供了--cluster-store而没有提供cluster-advertise ,则可以在配置文件中添加cluster-advertise ,而不必加上--cluster-store 。如果配置重新加载检测到先前配置的群集配置中的更改,它将记录一条警告消息。

运行多个守护程序

注意:在单个主机上运行多个守护程序被认为是“实验性的”。用户应注意未解决的问题。在某些情况下,此解决方案可能无法正常工作。解决方案目前正在开发中,并将在不久的将来交付。

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

$ 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
容器守护程序运行时