跳到主要内容

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-sizemax-file
开发50m2
测试100m3
生产100m5
高日志量200m3

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