©
本文档使用
php.cn手册 发布
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-runtime string Default OCI runtime for containers (default "runc") --default-ulimit ulimit Default ulimits for containers (default []) --disable-legacy-registry Disable contacting legacy registries (default true) --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 --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
或添加debug: true
到该daemon.json
文件。
注:在Docker1.13或更高版本,通过启动使实验性的功能
dockerd
与--experimental
标志或添加experimental: true
到daemon.json
文件。在较早的Docker版本中,需要不同的版本来启用实验功能。
Docker daemon可以监听通过三种不同类型的Socket引擎API请求:unix
,tcp
,和fd
。
默认情况下,创建unix
域套接字(或IPC套接字)/var/run/docker.sock
,需要root
权限或docker
组成员资格。
如果您需要远程访问Docker守护程序,则需要启用tcp
套接字。请注意,默认设置提供对Docker守护进程的未加密和未经身份验证的直接访问 - 应使用内置的HTTPS加密套接字或将安全Web代理放在其前面进行保护。您可以使用IP地址在具有特定网络接口的2375
所有网络接口上侦听端口-H tcp://0.0.0.0:2375
:-H tcp://192.168.59.103:2375
。通常使用端口2375
进行未加密,并使用端口2376
与守护进程进行加密通信。
注:如果使用HTTPS加密套接字,请记住只支持TLS1.0及更高版本。出于安全考虑,不再支持SSLv 3及以下协议。
基于Systemd系统中,可以通过后台程序沟通Systemd插座激活,使用dockerd -H fd://
。使用fd://
对于大多数设置来说都是完美的,但你也可以指定单独的套接字:dockerd -H fd://3
。如果找不到指定的套接字激活文件,则Docker将退出。您可以在Docker源代码树中找到在Docker和Systemd中使用Systemd套接字激活的示例。
可以将Docker守护进程配置为同时使用多个套接字侦听多个套接字。-H
备选方案:
# 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
泊坞窗客户端将信守HTTP_PROXY
,HTTPS_PROXY
以及NO_PROXY
环境变量(或小写的版本上)。HTTPS_PROXY
优先于HTTP_PROXY
。
警告*更改默认值
docker
守护进程绑定到TCP端口或Unix码头工人用户组将通过允许非根用户获取信息来增加您的安全风险。根部进入主机。确保您控制对docker
如果您正在绑定到TCP端口,任何访问该端口的人都可以完全访问该端口;因此,在开放的网络中不宜使用该端口。
带着-H
可以让Docker守护进程侦听特定的IP和端口。默认情况下,它将监听unix:///var/run/docker.sock
类只允许本地连接。根部用户。你能把它设置为0.0.0.0:2375
或者一个特定的主机ip让每个人都可以访问,但这是不建议因为对某个人来说,获得对运行守护进程的主机的根访问非常简单。
同样,Docker客户端可以使用-H
连接到自定义端口。Docker客户端将默认连接到unix:///var/run/docker.sock
Linux和tcp://127.0.0.1:2376
Windows。
-H
接受以下格式的主机和端口分配:
tcp://[host]:[port][path] or unix://path
例如:
tcp://
- > TLS加密打开时TCP 127.0.0.1
端口连接到任一端口2376
,或者2375
当通信采用纯文本时连接到端口。
tcp://host:2375
->主机上的TCP连接:2375
tcp://host:2375/path
->主机上的tcp连接:2375和所有请求的前置路径
unix://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
您可以使用多个-H
,例如,如果您希望同时侦听tcp和unix套接字。
# 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
Docker daemon 进程有几种不同的图像层存储驱动程序支持:aufs
,devicemapper
,btrfs
,zfs
,overlay
和overlay2
。
aufs
驱动器是最古老的,而是基于Linux内核补丁集是不太可能被合并到主内核中。这些也会导致一些严重的内核崩溃。但是,aufs
允许容器共享可执行文件和共享库内存,因此在使用相同的一个或多个程序库运行数千个容器时是非常有用的选择。
devicemapper
驱动程序使用精简配置和写入时复制(CoW)快照。对于每个设备映射图位置(通常情况下)/var/lib/docker/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.fsname
按照存储驱动程序选项中的说明选择不同的zfs文件系统集选项。
overlay
是一个非常快速的联合文件系统。现在它在3.18.0版本的主要Linux内核中合并。overlay
也支持页面缓存共享,这意味着访问同一文件的多个容器可以共享一个页面缓存条目(或条目),它使overlay
内存与aufs
驱动程序一样高效。呼叫dockerd -s overlay
使用它。
注意:
overlay:
尽管如此,该功能仍然非常年轻,不应在生产中使用。最值得注意的是,使用overlay
会导致过多的inode消耗(特别是随着图像数量的增长),以及>与使用RPM不兼容。
overlay2
使用相同的快速工会的文件系统,但采用的利用附加功能在Linux内核4.0添加,以避免过多的inode消耗。调用dockerd -s overlay2
使用它。
注:这两个
overlay
和overlay2
是目前不支持上btrfs
或写文件系统的任何副本,只应在使用ext4
分区。
特定的存储驱动程序可以使用--storage-opt
标志指定的选项进行配置。选项为devicemapper
前缀dm
,zfs
开始zfs
选项和btrfs
开始选项btrfs
。
这是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激活精简池时自动精简元数据检查等。
作为未提供精简池的后备,将创建回送文件。环回速度非常慢,但可以在没有任何存储预配置的情况下使用。强烈建议您不要在生产环境中使用环回。确保您的引擎守护程序提供了一个--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回送,不应在生产中使用。
指定为用于瘦池的“数据”设备创建回送文件时使用的大小。默认大小为100 G。这个文件很稀疏,所以它最初不会占用这么多空间。
$ sudo dockerd --storage-opt dm.loopdatasize=200G
dm.loopmetadatasize
注此选项配置devicemapper回送,不应在生产中使用。
指定为用于瘦池的“元数据”设备创建回送文件时使用的大小。默认大小是2G。这个文件很稀疏,所以它最初不会占用这么多空间。
$ sudo dockerd --storage-opt dm.loopmetadatasize=4G
dm.fs
指定要用于基础设备的文件系统类型。支持的选项是“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
)
指定用于瘦池数据的自定义块设备。
如果使用块设备来存储设备映射器,最好两者都使用。datadev
和metadatadev
应指定以完全避免使用回送设备。
$ 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
启用或禁用blkdiscard
移除devicemapper设备时的使用。如果使用回送设备,则默认情况下启用此功能,并且需要在移除图像/容器时重新分组环回文件。
在回送时禁用此选项会导致多更快的集装箱移除时间,但将使空间使用/var/lib/docker
当容器被移除时,目录不会返回给系统以供其他使用。
$ sudo dockerd --storage-opt dm.blkdiscard=false
dm.override_udev_sync_check
覆盖devicemapperudevudev
和udev
之间的同步检查。是Linux内核的设备管理器。
要查看udev
使用该devicemapper
驱动程序的Docker守护进程的同步支持,请运行:
$ docker info[...]Udev Sync Supported: true[...]
当udev
同步支持是true
,则devicemapper
和的udev可以协调用于容器的设备的激活和去激活。
当udev
同步支持是false
,在之间出现争用条件devicemapper
和udev
过程中创建和清理。竞赛状况导致错误和失败。(有关这些故障的信息,请参阅docker#4036)
要允许docker
守护进程启动,而不管udev
同步不受支持,请设置dm.override_udev_sync_check
为true:
$ sudo dockerd --storage-opt dm.override_udev_sync_check=true
当这个值是true
,devicemapper
继续,并简单地警告你错误正在发生。
注意:理想是追求一个
docker
支持同步的守护进程和环境udev
。有关此主题的进一步讨论,请参见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(逻辑卷管理)精简池添加更多空间,只需将更多存储添加到卷组容器精简池; 这应该会自动解决任何错误。如果您的配置使用循环设备,则停止引擎守护进程,增大循环文件的大小并重新启动守护进程以解决问题。
$ 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
zfs.fsname
设置zfs文件系统,docker将在其中创建自己的数据集。默认情况下,docker将选取docker graph(/var/lib/docker
)所在的zfs文件系统。
$ sudo dockerd -s zfs --storage-opt zfs.fsname=zroot/docker
btrfs.min_space
指定创建用于容器的子容量时使用的最小大小。如果用户在使用-storage-opt size选项创建或运行容器时使用btrfs的磁盘配额,则docker应确保大小不能小于btrfs.min_space。
$ sudo dockerd -s btrfs --storage-opt btrfs.min_space=10G
overlay2.override_kernel_check
覆盖允许overlay2的Linux内核版本检查。在4.0.0中,支持指定overlay2所需的多个低级目录。但是,可能会修补一些较旧的内核版本,以便为OverlayFS添加多个较低目录支持。只有在验证内核中存在此支持后才能使用此选项。在没有此支持的情况下在内核上应用此选项会导致安装失败。
Docker daemon依赖于OCI兼容的运行(通过调用containerd
后台程序)作为其接口Linux内核namespaces
,cgroups
以及SELinux
。
默认情况下,Docker守护进程会自动启动containerd
。如果要控制containerd
启动,请手动启动containerd
并containerd
使用--containerd
标志将路径传递到套接字。例如:
$ sudo dockerd --containerd /var/run/dev/docker-containerd.sock
运行时可以通过配置文件或使用--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的管理。您只能指定cgroupfs
或systemd
。如果指定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
。
若要为所有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证书的副本放在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守护进程,其域解析为IP地址的所有注册中心都属于CIDR语法描述的子网的一部分,应该被认为是不安全的。
此标志可多次使用,以允许将多个注册中心标记为不安全。
如果不安全的注册表没有被标记为不安全的,docker pull
,docker push
,和docker search
将导致一个错误消息,提示用户或者安全或通过--insecure-registry
如上述那样标志提供给多克尔守护进程。
本地注册中心的IP地址在127.0.0.0/8范围内,从Docker 1.3.2开始自动标记为不安全。不建议依赖这一点,因为它可能在未来发生变化。
使能--insecure-registry
,即允许不加密和/或不可信的通信,在运行本地注册表时可能很有用。但是,由于它的使用会产生安全漏洞,因此只应该为测试目的启用它。为了提高安全性,用户应该将他们的CA添加到系统的可信CA列表中,而不是启用--insecure-registry
...
针对仅支持传统v1协议的注册管理机构的操作默认处于禁用状态。具体来说,守护进程不会尝试push
,pull
并login
以V1登记。此例外情况search
仍然可以在v1注册表上执行。
如果您需要与尚未迁移到v2协议的注册表交互,请添加"disable-legacy-registry":false
到守护程序配置文件或设置--disable-legacy-registry=false
标志。
Docker v17.12不再支持交互v1注册中心,disable-legacy-registry
配置选项将被删除。
在使用HTTPS
代理,码头集线器证书将被代理的证书所取代。这些证书需要添加到Docker主机的配置中:
安装ca-certificates
分发包
向您的网络管理员询问代理的CA证书,并将它们附加到/etc/pki/tls/certs/ca-bundle.crt
然后用HTTPS_PROXY=http://username:password@proxy:port/ dockerd
...username:
和password@
是可选的,并且只有当您的代理被设置为需要身份验证时才需要。
这只会将代理和身份验证添加到Docker守护进程的请求-docker build
和正在运行的容器需要额外的配置才能使用代理。
ulimit
设置--default-ulimit
允许您设置ulimit
用于所有容器的默认选项。它采用相同的选项--ulimit
进行docker run
。如果未设置这些默认值ulimit
,则将docker run
从Docker守护程序继承设置(如果未设置)。--ulimit
传递给任何选项docker run
将覆盖这些默认值。
请小心使用ulimit标志设置nproc,因为nproc是由Linux设计的,用于设置用户可用的最大进程数,而不是容器。 详情请查看运行参考。
--cluster-advertise
选项指定此特定守护程序实例在将自身广告到群集时应使用的组合host:port
或interface:port
组合。守护进程通过此值由远程主机访问。如果您指定了一个接口,请确保它包含实际Docker主机的IP地址。对于通过创建的引擎安装docker-machine
,界面通常是eth1
。
守护进程使用libkv在集群内通告节点。一些键值后端支持相互TLS。配置守护程序使用的客户端TLS设置可以使用--cluster-store-opt
标志进行配置,指定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
当前支持的群集存储选项是:
选项 | 描述 |
---|---|
discovery.heartbeat | 以秒为单位指定守护进程使用的心跳定时器作为保活机制,以确保发现模块将节点视为在群集中处于活动状态。如果未配置,则默认值为20秒。 |
discovery.ttl | 如果在配置的ttl值内未收到有效的心跳,则指定发现模块用于超时节点的TTL(生存时间)(以秒为单位)。如果未配置,则默认值为60秒。 |
kv.cacertfile | 指定包含PEM编码CA证书的本地文件的路径。 |
kv.certfile | 指定带有PEM编码证书的本地文件的路径。该证书用作与密钥/值存储进行通信的客户证书。 |
kv.keyfile | 指定带有PEM编码私钥的本地文件的路径。该私钥用作与密钥/值存储进行通信的客户端密钥。 |
kv.path | 指定键/值存储区中的路径。如果未配置,则默认值为'docker / nodes'。 |
Docker的访问授权可以通过您的组织可以购买或构建自己的授权插件进行扩展。daemon
使用该--authorization-plugin=PLUGIN_ID
选项启动Docker时,您可以安装一个或多个授权插件。
$ sudo dockerd --authorization-plugin=plugin1 --authorization-plugin=plugin2,...
PLUGIN_ID
值是插件的名称或其规范文件的路径。插件的实现确定您是否可以指定名称或路径。请咨询您的Docker管理员以获取有关可用插件的信息。
一旦安装了插件,daemon
通过命令行或Docker的Engine API 发出的请求将被插件允许或拒绝。如果您安装了多个插件,则每个插件都必须允许完成请求。
有关如何创建授权插件的信息,请参阅本文档的Docker扩展部分中的授权插件部分。
Linux内核用户名称空间支持通过启用进程并因此使容器具有唯一范围的用户和组ID来提供额外的安全性,这些用户和组ID是在主机系统使用的传统用户和组范围之外。可能最重要的安全改进是,默认情况下,作为root
用户运行的容器进程在容器内部具有预期的管理特权(有一些限制),但将有效地映射到uid
主机上的非特权。
有关如何使用此功能以及限制的详细信息,请参阅使用用户命名空间隔离容器。
IP伪装使用地址转换来允许没有公共IP的容器与Internet上的其他计算机通话。这可能会干扰某些网络拓扑,--ip-masq=false
可能会被禁用。
Docker支持Docker数据目录(/var/lib/docker
)和for的软链接/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# orexport 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-parent
选项允许您设置用于容器的默认cgroup父项。如果未设置此选项,则默认/docker
为fs cgroup驱动程序和system.slice
systemd cgroup驱动程序。
如果cgroup具有前导正斜杠(/
),则cgroup将在根cgroup下创建,否则将在守护进程cgroup下创建cgroup。
假设守护进程在cgroup中运行daemoncgroup
,--cgroup-parent=/foobar
创建一个cgroup /sys/fs/cgroup/memory/foobar
,而使用--cgroup-parent=foobar
创建cgroup/sys/fs/cgroup/memory/daemoncgroup/foobar
systemd cgroup驱动程序具有不同的规则--cgroup-parent
。Systemd表示逐层分层,并且切片的名称对树中的位置进行编码。所以--cgroup-parent
对于systemd cgroups应该是一个片名。一个名称可以由一个破折号分隔的一系列名称组成,它描述了从根片段开始切片的路径。例如,--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:1337上提供指标API,您需要指定--metrics-addr 127.0.0.1:1337
允许您在API上发出请求127.0.0.1:1337/metrics
以接收prometheus格式的指标。
如果您运行的是Prometheus服务器,则可以将此地址添加到您的scrape配置文件中,以便prometheus在Docker上收集指标。有关prometheus的更多信息,您可以在这里查看网站。
scrape_configs: - job_name: 'docker' static_configs: - targets: ['127.0.0.1:1337']
请注意,此特性仍被标记为实验性功能,因为度量和度量名称可能会更改,而此功能仍处于试验阶段。请提供反馈意见,您希望看到收集的API。
该--config-file
选项允许您为JMS格式的守护程序设置任何配置选项。此文件使用相同的标记名称作为关键字,除了标志,使几个条目,它使用标志名的复数,例如,labels
对于label
标志。
配置文件中设置的选项不能与通过标志设置的选项冲突。如果一个选项在文件和标志之间重复,docker守护进程无法启动,无论它们的值如何。我们这样做是为了避免默默地忽略配置重新加载中引入的更改。例如,如果在配置文件中设置了守护进程标签,并且还通过--label
标志设置了守护进程标签,则守护进程无法启动。当守护程序启动时,文件中不存在的选项将被忽略。
Linux上配置文件的默认位置是/etc/docker/daemon.json
。该--config-file
标志可用于指定非默认位置。
这是Linux上允许的配置选项的完整示例:
{"authorization-plugins": [],"data-root": "","dns": [],"dns-opts": [],"dns-search": [],"exec-opts": [],"exec-root": "","experimental": false,"storage-driver": "","storage-opts": [],"labels": [],"live-restore": true,"log-driver": "","log-opts": {},"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": {},"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": [],"disable-legacy-registry": false,"no-new-privileges": false,"default-runtime": "runc","oom-score-adjust": -500,"runtimes": {"runc": {"path": "runc"},"custom": {"path": "/usr/local/bin/my-runc-replacement","runtimeArgs": ["--debug"]}}}
注意:您不能将
daemon.json
已在守护进程启动时设置的选项设置为标志。在systemd
用于启动Docker守护进程的系统上,-H
已经设置好了,因此您不能使用该hosts
键daemon.json
来添加监听地址。有关如何使用systemd插件文件完成此任务,请参阅https://docs.docker.com/engine/admin/systemd/#custom-docker-daemon-options。
Windows上配置文件的默认位置是%programdata%\docker\config\daemon.json
。该--config-file
标志可用于指定非默认位置。
这是Windows上允许的配置选项的完整示例:
{ "authorization-plugins": [], "data-root": "", "dns": [], "dns-opts": [], "dns-search": [], "exec-opts": [], "experimental": false, "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": [], "disable-legacy-registry": false}
守护进程运行时可以重新配置某些选项,而无需重新启动进程。我们使用SIGHUP
Linux中的信号重新加载,并在Windows中使用密钥进行全局事件Global\docker-daemon-config-$PID
。这些选项可以在配置文件中修改,但仍然会检查与提供的标志的冲突。如果存在冲突,守护进程无法重新配置自身,但它不会停止执行。
可以重新配置的当前支持的选项列表如下:
debug
cluster-store
它用新地址重新加载发现商店。
cluster-store-opts
它使用新的选项重新加载发现存储。
cluster-advertise
*它修改重新加载后公布的地址。
labels
它用一组新的标签替换守护进程标签。
live-restore
*使在守护进程停机期间保持容器活动...
max-concurrent-downloads
:它更新每次拉的最大并发下载量。
max-concurrent-uploads
:它更新每次推送的最大并发上传量。
default-runtime
::如果在容器创建时未指定,则更新要使用的运行库。它默认为“默认”,这是随正式的停靠包附带的运行时。
runtimes
*它更新可用于运行容器的可供OCI运行时的列表。
authorization-plugin
指定要使用的授权插件。
allow-nondistributable-artifacts
::用一组新的注册表替换守护进程将不可分发的工件推送到的注册表集。
insecure-registries
它用一组新的不安全注册表替换守护进程不安全的注册中心。如果守护进程配置中的某些现有不安全注册中心不在新重新加载的不安全注册表中,这些现有注册表将从守护进程的配置中删除。
registry-mirrors
它用一组新的注册表镜像替换守护进程注册表镜像。如果守护进程配置中的某些现有注册表镜像不在新重新加载的注册表镜像中,这些现有注册表镜像将从守护进程的配置中删除。
更新和重新加载群集配置(例如--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时自动创建。如果您未使用默认设置,则必须手动创建和配置网桥,或将其设置为“无”:--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
为,Docker也不会添加IP伪装规则true
。如果没有IP伪装规则,在使用非默认网桥的网络时,Docker容器将无法连接到外部主机或互联网。
--config-file=/etc/docker/daemon.json
存储配置文件的路径。您可以使用它而不是守护进程标志。为每个守护进程指定路径。
--tls*
Docker守护进程支持--tlsverify
强制加密和认证远程连接的模式。这些--tls*
选项可以为特定的守护程序使用特定的证书。
没有网络的Docker守护程序的单独“引导”实例的示例脚本:
$ sudo dockerd \ -H unix:///var/run/docker-bootstrap.sock \ -p /var/run/docker-bootstrap.pid \ --iptables=false \ --ip-masq=false \ --bridge=none \ --data-root=/var/lib/docker-bootstrap \ --exec-root=/var/run/docker-bootstrap