docker调整cgroup driver为systemd

在 Docker 中,Cgroup Driver 是用于控制容器资源限制的机制(如 CPU、内存等)。Docker 默认使用 cgroupfs 作为 Cgroup Driver,但在使用 systemd 作为初始化系统的 Linux 发行版中,建议将 Cgroup Driver 改为 systemd,以更好地与 systemd 集成。


1. 确认当前 Cgroup Driver

查看当前 Docker 使用的 Cgroup Driver:

1
docker info | grep -i cgroup

输出示例:

Cgroup Driver: cgroupfs

如果显示 cgroupfs,则需要修改为 systemd


2. 修改 Docker 配置文件

Docker 的配置文件通常位于 /etc/docker/daemon.json。如果该文件不存在,可以手动创建。

编辑或创建配置文件:

1
sudo nano /etc/docker/daemon.json

添加以下内容:

1
2
3
{
"exec-opts": ["native.cgroupdriver=systemd"]
}

3. 重启 Docker 服务

修改配置文件后,需要重启 Docker 服务以使更改生效:

1
sudo systemctl restart docker

4. 验证修改是否生效

再次运行以下命令,确认 Cgroup Driver 已更改为 systemd

1
docker info | grep -i cgroup

输出示例:

Cgroup Driver: systemd

5. 注意事项

  • 兼容性:如果系统中同时运行 Kubernetes,请确保 Kubernetes 的 Cgroup Driver 与 Docker 一致(通常 Kubernetes 也建议使用 systemd)。
  • Docker 版本:此配置适用于 Docker 19.03 及以上版本。如果使用旧版 Docker,请先升级。
  • Cgroup v2:如果系统已启用 cgroup v2(通过内核参数 systemd.unified_cgroup_hierarchy=1),Docker 会自动使用 systemd 作为 Cgroup Driver,无需手动配置。

6. 其他相关配置

如果 Docker 容器无法启动或资源限制失效,可能需要检查以下内容:

  • 确保 systemd 版本较新(建议 systemd v230+)。
  • 确保内核支持 cgroup v2(Linux 4.5+)。
  • 如果使用 Kubernetes,请同步修改 Kubelet 的 Cgroup Driver:
    1
    2
    3
    sudo sed -i 's/--cgroup-driver=cgroupfs/--cgroup-driver=systemd/' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
    sudo systemctl daemon-reload
    sudo systemctl restart kubelet