本文将深入探讨如何通过daemon.json文件来自定义Docker守护进程选项,以优化Docker的性能和安全性
1、什么是daemon.json
daemon.json是Docker守护进程的配置文件,它允许用户自定义Docker的行为。通过修改这个文件,我们可以设置各种选项,如存储驱动、网络配置、日志管理等。默认情况下,daemon.json文件位于/etc/docker/目录下,但如果该文件不存在,Docker将使用默认配置。
2、常见的daemon.json配置选项
以下是 daemon.json 内容参数的分类解析: 更加详细内容见官方文档https://docs.docker.com/reference/cli/dockerd/#daemon-configuration-file
1. 基础与调试配置
debug:布尔值,默认false。启用调试模式,输出详细的启动和运行信息,生产环境建议关闭。log-level:字符串。控制 dockerd 的日志输出粒度,可选值为debug,info,warn,error,fatal。experimental:布尔值,默认false。启用 Docker 的实验性功能,因可能不稳定,不建议在生产环境使用。pidfile:字符串,默认/var/run/docker.pid。自定义 Docker 守护进程 PID 文件的存储路径。labels:字符串数组。为 Docker 主机设置标签(如["nodeName=node-121"]),在集群管理中非常实用。
2. 存储与数据配置
data-root:字符串。Docker 运行时使用的数据根目录(Linux 默认/var/lib/docker,Windows 默认c:\programdata\docker)。常用于将数据迁移至大容量或高性能磁盘。(注:旧版本中的graph参数已废弃,现统一使用data-root)storage-driver:字符串。指定 Docker 的存储驱动类型,Linux 下推荐使用overlay2,生产环境应避免使用aufs。storage-opts:字符串数组。为存储驱动传递额外的选项。exec-root:字符串。执行状态文件的根目录,默认为/var/run/docker。
3. 网络配置
bip:字符串。手动指定docker0网桥的 IP 地址及子网(如172.17.0.1/16),用于避免与主机现有网络冲突。bridge:字符串。将容器附加到指定的网桥。若设为"none",Docker 将不创建默认的 NAT 网络。default-gateway/default-gateway-v6:字符串。指定容器的默认 IPv4 / IPv6 网关(需在bip子网范围内)。fixed-cidr/fixed-cidr-v6:字符串。限制分配给容器的固定 IP 的 IPv4 / IPv6 子网。dns:字符串数组。设置容器默认的 DNS 服务器地址(如["8.8.8.8", "114.114.114.114"])。dns-opts:字符串数组。配置容器/etc/resolv.conf文件中的其他 DNS 选项。dns-search:字符串数组。设定容器的 DNS 搜索域。mtu:数字。设置容器网络的最大传输单元(MTU)。icc:布尔值,默认true。控制是否启用容器间的内部通信。ip-forward:布尔值,默认true。启用系统的net.ipv4.ip_forward转发功能。iptables:布尔值,默认true。控制是否允许 Docker 添加 iptables 规则。ip-masq:布尔值,默认true。启用 IP 伪装(NAT)。ipv6:布尔值,默认false。启用 IPv6 网络支持。ip:字符串,默认0.0.0.0。绑定容器端口时的默认 IP 地址。
4. 镜像仓库与注册表配置
registry-mirrors:字符串数组。配置镜像加速器地址(必须为 HTTPS 协议),可显著提升国内拉取镜像的速度。insecure-registries:字符串数组。允许使用 HTTP 协议或自签名证书的私有仓库地址。disable-legacy-registry:布尔值。禁用对旧版 V1 注册表协议的支持。
5. 日志配置
log-driver:字符串。设置容器默认的日志驱动,常见选项包括json-file(默认)、syslog、journald、fluentd等。log-opts:对象。配合日志驱动使用的选项。例如限制日志大小和文件数量以防磁盘撑满:{"max-size": "10m", "max-file": "3"}。raw-logs:布尔值,默认false。以原始格式输出日志,不添加时间戳等元数据。
6. 安全与权限配置
hosts:字符串数组。设置 Docker 守护进程监听的地址(如["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"])。注意:暴露 TCP 端口不使用 TLS 存在严重安全风险。tlsverify:布尔值。启用 TLS 验证。tlscacert/tlscert/tlskey:字符串。分别指定 CA 证书、服务端证书和私钥的路径。userns-remap:字符串。启用用户命名空间重映射,增强容器隔离安全性。selinux-enabled:布尔值,默认false。启用 SELinux 支持。group:字符串。指定 Unix 套接字(/var/run/docker.sock)的属组,默认为docker。authorization-plugins:字符串数组。指定要加载的授权插件列表。default-ulimits:对象。设置容器的默认资源限制(ulimit)。
7. 运行时与高级配置
default-runtime:字符串,默认runc。指定容器的默认 OCI 运行时。runtimes:对象。注册自定义的 OCI 运行时及其路径和参数。exec-opts:字符串数组。传递运行时执行选项(如配置 cgroup 驱动:["native.cgroupdriver=systemd"])。cgroup-parent:字符串。为所有容器设置父 cgroup。live-restore:布尔值。允许在 Docker 守护进程停止时保持容器运行,并在守护进程重启后恢复它们。max-concurrent-downloads/max-concurrent-uploads:数字。限制并发下载/上传的层数,默认分别为 3 和 5。oom-score-adjust:数字。调整 Docker 守护进程的 OOM(Out Of Memory)分数,防止其被系统轻易杀掉。api-cors-header:字符串。在 Docker Engine API 中设置 CORS(跨域资源共享)标头。cluster-store/cluster-advertise/cluster-store-opts:字符串/对象。用于配置 Swarm 集群的分布式存储后端及通告地址(旧版 Swarm 配置)。
配置生效提示:修改 daemon.json 后,通常需要重启 Docker 服务(如 Linux 下执行 systemctl restart docker)才能使配置生效。修改前建议备份原文件,若启动失败可通过查看系统日志(如 journalctl -u docker.service)排查 JSON 语法错误。
3、生产环境常用的daemon.json配置示例
{
"data-root": "/data/docker",
"storage-driver": "overlay2",
"live-restore": true,
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3",
"compress": "true"
},
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com",
"https://docker.m.daocloud.io"
],
"insecure-registries": ["registry.internal.company.com:5000"],
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 5
}核心配置项解析:
data-root:将 Docker 数据目录从默认的系统盘(/var/lib/docker)迁移至独立数据盘,防止系统盘被撑爆。
storage-driver:指定 overlay2 作为存储驱动,这是目前 Linux 下性能最佳、最稳定的驱动。
live-restore:生产环境必开选项。开启后,即使 Docker 服务重启或升级,运行中的容器也不会中断。
exec-opts:将 cgroup 驱动设置为 systemd,这是与 Kubernetes (K8s) 集成的兼容性要求。
log-opts:配置日志轮转策略。限制单个日志文件最大为 100MB,最多保留 3 个文件并开启压缩,防止日志无限增长耗尽磁盘空间。
registry-mirrors:配置国内镜像加速器,解决拉取 Docker Hub 镜像慢或超时的问题。
insecure-registries:允许访问 HTTP 协议或自签证书的内网私有镜像仓库。
max-concurrent-downloads/uploads:提高并发拉取和上传的线程数,加速镜像分发。