Docker cgroups 改为 systemd 后启动失败

1. 简介

Docker 是一个开源的容器化平台,它使用 cgroups 控制组来限制和管理容器的资源使用。然而,在一些系统中,特别是运行 systemd 的系统中,cgroups 的管理权已经被 systemd 接管。当我们尝试将 Docker 的 cgroups 改为 systemd 后,可能会遇到启动失败的问题。本文将介绍为什么会出现这个问题,以及如何解决它。

2. 问题描述

当我们尝试将 Docker 的 cgroups 改为 systemd 后,我们可能会遇到以下错误信息:

docker: Error response from daemon: cgroups: cannot found cgroup root for subsystem 'memory': failed to mount controller: cannot find cgroup mount destination: unknown.

这个错误信息表明 Docker 在尝试使用 memory subsystem 时找不到 cgroup root。

3. 问题原因

在运行 systemd 的系统中,systemd 已经接管了 cgroups 的管理权,因此 Docker 需要使用 systemd 的 cgroups driver。但是,默认情况下,Docker 使用的是 cgroupfs driver,这就导致了启动失败的问题。

4. 解决方案

要解决这个问题,我们需要将 Docker 的 cgroups driver 改为 systemd。在 Docker 的配置文件中,我们可以使用 --exec-opt native.cgroupdriver=systemd 参数来指定使用 systemd 的 cgroups driver。下面是一个示例的 Docker 配置文件:

# Docker systemd cgroups configuration

## 1. Create a new systemd drop-in directory for docker.service
sudo mkdir /etc/systemd/system/docker.service.d

## 2. Create a new configuration file for docker.service
sudo vi /etc/systemd/system/docker.service.d/cgroups.conf

## 3. Add the following content to the cgroups.conf file
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// --exec-opt native.cgroupdriver=systemd

## 4. Save the file and exit

## 5. Reload systemd configuration
sudo systemctl daemon-reload

## 6. Restart Docker service
sudo systemctl restart docker.service

这样,我们就将 Docker 的 cgroups driver 改为 systemd,解决了启动失败的问题。

5. 总结

在运行 systemd 的系统中,Docker 需要使用 systemd 的 cgroups driver。如果我们尝试将 Docker 的 cgroups 改为 systemd 后出现启动失败的问题,我们可以使用上述的解决方案来解决。希望本文对你理解和解决这个问题有所帮助。

参考资料

  • [Docker documentation](