docker配置(daemon.json)
- /etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.rainbond.cc",
"https://docker.1ms.run",
"https://docker.m.daocloud.io"
],
"data-root": "/mnt",
"ipv6": true,
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3",
"compress": "true"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
],
"exec-opts": [
"native.cgroupdriver=systemd"
],
"default-ulimits": {
"nofile": {"Name": "nofile", "Hard": 64000, "Soft": 64000},
"nproc": {"Name": "nproc", "Hard": 8192, "Soft": 8192}
},
"live-restore": true,
"userland-proxy": false,
"icc": false,
"dns": [
"223.5.5.5", "8.8.8.8"
],
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 5,
"metrics-addr": "127.0.0.1:9323",
"features": {"buildkit": true}
}
1.镜像加速
"registry-mirrors": [
"https://docker.rainbond.cc",
"https://docker.1ms.run",
"https://docker.m.daocloud.io"
]
- 校验
sudo systemctl daemon-reload && sudo systemctl restart docker
docker info | grep -A 5 "Registry Mirrors"
2.日志轮转
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3",
"compress": "true"
}
- 这个配置的效果:每个容器最多3个日志文件,每个100MB,启用压缩后实际占用约100-150MB。
| 环境 | max-size | max-file |
|---|---|---|
| 开发 | 50m | 2 |
| 测试 | 100m | 3 |
| 生产 | 100m | 5 |
| 高日志量 | 200m | 3 |
3.overlay2存储
"storage-driver": "overlay2",
"storage-opts": ["overlay2.override_kernel_check=true"]
- CentOS 7.3+、Ubuntu 16.04+都支持。如果你现在还在用devicemapper,换一下能明显感受到提升。
4.cgroup驱动--用k8s必改
"exec-opts": ["native.cgroupdriver=systemd"]
- 不用K8s可以跳过这条。用K8s的话,这条和 kubelet 的 cgroup 驱动必须保持一致,否则会出现 Pod 无法调度的玄学问题。
- 验证
docker info | grep "Cgroup Driver"
# Cgroup Driver: systemd
5.文件描述符上限--高并发需要
"default-ulimits": {
"nofile": { "Hard": 64000, "Soft": 64000 },
"nproc": { "Hard": 8192, "Soft": 8192 }
}
- 默认值是1024,对生产环境远远不够。高并发微服务一旦连接数上来,就会开始报
too many open files,降低这个上限就是给自己挖坑。
6.live-restore--维护时容器不停
"live-restore": true
- 注意:Swarm模式下不支持这个选项。
7.userland-proxy关闭--性能提升
"userland-proxy": false
- Docker默认用用户态代理做端口转发,关闭后改用iptables。我的测试数据:QPS从8000涨到12000,CPU占用从15%降到8%。
8.容器间通信隔离
"icc": false
- 默认情况下同一台机器的所有容器可以互相通信,这在生产环境是不合适的。关闭后需要显式通过自定义网络来控制哪些容器可以互通,更安全。
9.开启监控指标采集
"metrics-addr": "127.0.0.1:9323"
- 开启后,Prometheus 可以直接采集 Docker 守护进程的指标:容器数量、CPU、内存、网络IO等。
重启
# 验证JSON格式(改完一定要验证,格式错了Docker起不来)
sudo python3 -m json.tool /etc/docker/daemon.json
# 重载并重启
sudo systemctl daemon-reload
sudo systemctl restart docker
# 确认配置生效
docker info | grep -E "Storage Driver|Logging Driver|Registry Mirrors" -A 3