1. 概述
Docker Engine V1.12 之后版本,用户可以自行创建 daemon.json 文件对 Docker Engine 进行配置和调整。要点如下:
- 该文件作为 Docker Engine 的配置管理文件, 里面几乎涵盖了所有 docker 命令行启动可以配置的参数。
- 不管是在哪个平台以何种方式启动, Docker 默认都会来这里读取配置。使用户可以统一管理不同系统下的 docker daemon 配置。
- 相关参数的使用说明,可以参阅 man dockerd 帮助信息,或者参阅官方文档。本文后面复制了一份官网的详细配置,但是缺少样例说明。
https://docs.docker.com/engine/reference/commandline/dockerd/#/configuration-reloading
该 --config-file选项(格式,描述类似–storage-driver结构的参数形式)允许您以JSON格式为守护程序设置任何配置选项。此文件使用与键相同的标志名称,但允许多个条目的标志除外,它使用多个标志名称,例如,labels用于label标志。
配置文件中设置的选项不得与通过flags设置的选项冲突。如果文件和标志之间的选项重复,则docker守护程序无法启动,无论其值如何。我们这样做是为了避免静默忽略配置重新加载中引入的更改。例如,如果在配置文件中设置守护程序标签并且还通过–label标志设置守护程序标签,则守护程序无法启动。守护程序启动时将忽略文件中不存在的选项。
Linux上配置文件的默认位置是 /etc/docker/daemon.json。该 --config-file 标志可用于指定非默认位置。
2. daemon.json例子
注意:
修改完配置文件后,需要重启docker服务才能生效
{
"authorization-plugins": [],
"graph":"/var/lib/docker", #已废弃,使用data-root代替,这个主要看docker的版本,默认路径
"data-root": "", #Docker运行时使用的根路径,根路径下的内容稍后介绍,默认/var/lib/docker
#Docker运行时使用的根路径,根路径下的内容稍后介绍,默认/var/lib/docker
"dns": [],
#设定容器DNS的地址,在容器的 /etc/resolv.conf文件中可查看
"dns-opts": [],
#容器 /etc/resolv.conf 文件,其他设置
"dns-search": [],
#设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的 主机时,DNS不仅搜索host,还会搜索host.example.com。注意:如果不设置,Docker 会默认用主机上的 /etc/resolv.conf来配置容器。
"exec-opts": [],
"exec-root": "",
"experimental": false,
"features": {},
"storage-driver": "",
"storage-opts": [],
"labels": [],
#docker主机的标签,很实用的功能,例如定义:–label nodeName=host-121
"live-restore": true,
"log-driver": "",
"log-opts": {},
"mtu": 0,
"pidfile": "",
#Docker守护进程的PID文件
"cluster-store": "",
"cluster-store-opts": {},
"cluster-advertise": "",
"max-concurrent-downloads": 3,
"max-concurrent-uploads": 5,
"default-shm-size": "64M",
"shutdown-timeout": 15,
"debug": true,
#启用debug的模式,启用后,可以看到很多的启动信息。默认false
"hosts": [],
#设置容器hosts
"log-level": "",
"tls": true,
#默认 false, 启动TLS认证开关
"tlscacert": "",
#默认 ~/.docker/ca.pem,通过CA认证过的的certificate文件路径
"tlscert": "",
#默认 ~/.docker/cert.pem ,TLS的certificate文件路径
"tlskey": "",
#默认~/.docker/key.pem,TLS的key文件路径
"tlsverify": true,
#默认false,使用TLS并做后台进程与客户端通讯的验证
"tls": true,
"tlsverify": true,
"tlscacert": "",
"tlscert": "",
"tlskey": "",
"swarm-default-advertise-addr": "",
"api-cors-header": "",
"selinux-enabled": false,
#默认 false,启用selinux支持
"userns-remap": "",
"group": "",
#Unix套接字的属组,仅指/var/run/docker.sock
"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,
#默认true, 启用 net.ipv4.ip_forward ,进入容器后使用sysctl -a|grepnet.ipv4.ip_forward查看
"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": [],
#镜像加速的地址,增加后在 docker info中可查看。
"seccomp-profile": "",
"insecure-registries": [],
#配置docker的私库地址
"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}]
}
- “data-root”: “/data/docker”:指定 Docker 存储所有运行时数据的根目录,包括镜像、容器、卷和网络等。默认情况下,这个目录位于 /var/lib/docker。
- “exec-root”: “/var/run/docker”:定义 Docker 执行状态文件的存储路径,如运行中容器的网络配置。默认情况下,它通常位于 /var/run/docker。
- “bridge”: “none”:告诉 Docker 不要自动创建默认的网桥接口 docker0。这通常用于自定义网络或在不需要 Docker 管理网络的情况下。
- “iptables”: false:禁止 Docker 修改 iptables 规则。这意味着 Docker 将不会自动配置 IP 表以进行网络隔离。
- “hosts”: [“unix:///var/run/docker.sock”, “tcp://0.0.0.0:4243”]:设置 Docker 守护进程监听的接口和端口,允许通过 Unix 套接字和 TCP 端口 4243 进行通信。0.0.0.0:4243 表示接受来自任何 IP 地址的连接。
- “labels”: [“AlidockerMod=true”]:为 Docker 守护进程添加标签,可以用来标识守护进程或进行过滤。
- “exec-opts”: [“native.cgroupdriver=systemd”]:指定 Docker 使用 systemd 作为其 cgroup 驱动程序。cgroup (Control groups) 是 Linux 提供的一个特性,用于限制、记录和隔离进程组的资源使用(如 CPU、内存等)。使用 systemd 作为 cgroup 驱动程序有助于集成 Docker 和使用 systemd 的系统组件。
- “log-driver”: “json-file”:将 Docker 容器的日志记录驱动程序设置为 json-file,这意味着容器的日志将以 JSON 格式写入文件。这是 Docker 的默认日志驱动程序。
- “log-opts”: { “max-size”: “100m”, “max-file”: “10” }:设置容器日志文件的轮转策略。“max-size”: “100m” 指每个日志文件的最大大小为 100MB,达到该大小后日志文件会轮转。“max-file”: “10” 指最多保留 10 个轮转后的日志文件。
- “insecure-registries”:列出了 Docker 可以通过 HTTP 而非 HTTPS 连接的不安全镜像仓库地址。在这个例子中,给出了几个私有仓库的地址,Docker 将不会验证这些仓库的 SSL 证书。如果配置为0.0.0.0/0,信任所有地址的所有私有仓库。
- “bip”: “169.254.123.1/24”:指定 Docker 默认桥接网络 docker0 的 IP 地址和网络掩码。这个网络用于容器之间和宿主机之间的通信。
- “oom-score-adjust”: -1000:为 Docker 守护进程设置 OOM(内存耗尽)得分调整值。数值 -1000 表示 Docker 守护进程在内存耗尽时应该最后被杀死,以保护它的运行稳定。
- “registry-mirrors”: [“https://pqbap4ya.mirror.aliyuncs.com”]:设置 Docker 镜像拉取时使用的镜像仓库加速地址。这对于位于中国等地区的用户来说,可以提供更快的镜像下载速度
- 。
- “storage-driver”: “overlay2”:指定 Docker 使用 overlay2 存储驱动,这是推荐的存储驱动,用于管理容器和镜像的分层文件系统。
- “storage-opts”:[“overlay2.override_kernel_check=true”]:提供额外的存储驱动选项。在这里,它允许 overlay2 存储驱动忽略内核版本检查,这可能对于在不完全支持 overlay2 的旧内核版本上运行 Docker 是有用的。
- “live-restore”: true:启用“实时恢复”功能,允许 Docker 守护进程在更新或重启时不终止运行中的容器。这有助于减少服务中断并提高系统的可用性。
命令行配置列表
除了使用配置文件外,可以通过命令进行设置,通过dockerd --help查看全部的配置项,和daemon.json能对应上
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
2.1 驱动的种类
Linux支持好几种镜像分层存储驱动: aufs, devicemapper, btrfs, zfs, overlay and overlay2.
指定驱动的参数:
注意 storage-driver可以用 --storage-opt 标识来配置。 类型devicemapper 的选项用 dm作前缀, zfs 前缀用 zfs, btrfs前缀用 btrfs, lcow 用lcow作前缀。
DEVICEMAPPER OPTIONS
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
$ sudo dockerd --storage-opt dm.thinpooldev=/dev/mapper/thin-pool
dm.directlvm_device
$ sudo dockerd --storage-opt dm.directlvm_device=/dev/xvdf
3. “bridge”: "none"属性
如果你的 daemon.json 文件中确实没有显示 docker0 相关的配置,这是因为 Docker 默认的桥接网络 docker0 是在 Docker 服务启动时自动创建的,除非明确在配置文件中禁用它或者配置自定义网络。即使 daemon.json 中没有指定,默认的 docker0 仍然会存在并使用默认配置。
在 daemon.json 文件中,你有以下配置:
"bridge": "none",
这行配置指示 Docker 不要创建默认的桥接网络 docker0。然而,你仍然能够看到桥接网络 dockerBridge 等名称,这说明你可能在其他地方配置了这个网络,或者通过其他命令创建了这个网络。
验证和解释
- 查看网络列表
使用 docker network ls 查看所有 Docker 网络:
docker network ls
输出示例:
NETWORK ID NAME DRIVER SCOPE
eddae4cf1bad docker0 (可能叫dockerBridge) bridge local
34b7574b98c2 host host local
00f4601cd1c0 none null local
如果 docker0 不在列表中,但有其他桥接网络(例如 dockerBridge),这说明 Docker 默认网络被禁用了,但你可能通过其他方式创建了自定义网络。
- 检查自定义网络配置
查看 /etc/docker/daemon.json 文件中是否有其他自定义网络配置。你的配置文件中指定了 bridge 为 none,这意味着 Docker 不会创建默认的桥接网络 docker0。
总结
- docker0 网络不存在:你的 daemon.json 文件配置禁用了默认的 docker0 桥接网络。
- dockerBridge 网络存在:系统中存在一个名为 dockerBridge 的桥接网络,它可能是通过其他方式(命令或配置文件)创建的。
要找到 dockerBridge 的具体配置来源,可以检查以下内容:
- Docker 命令行选项:检查 Docker 服务启动时的命令行参数,可能会指定自定义网络。
- 其他配置文件:检查系统中是否有其他配置文件定义了自定义网络。
- 手动创建:你或其他用户可能通过命令手动创建了 dockerBridge 网络。