Ubuntu 20.04安装Docker启动失败报control process exited错误如何解决
问题根因定位
结合你使用的5.15.0-rc7+开发版内核与Ubuntu 20.04默认源docker.io包的适配情况,常见根因如下:
- Ubuntu 20.04官方源默认携带的
docker.io版本较低,未适配5.15版本内核的新接口,特别是cgroup、overlay存储驱动相关的调用存在兼容问题 - 内核未加载docker运行必需的
overlay、br_netfilter模块,或sysctl网络参数未配置到位 - 5.15内核默认开启cgroup v2统一层级,低版本docker对cgroup v2的支持不完善
- 之前多次启动失败触发了systemd的服务启动次数限制,残留的运行时状态文件阻塞了后续启动流程
对应修复方案
方案1:替换为适配高版本内核的docker-ce版本
优先尝试该方案,可解决90%以上的内核兼容问题:
- 卸载原有低版本docker.io相关包
sudo apt remove docker.io containerd runc -y sudo apt autoremove -y
- 安装docker-ce依赖包
sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common -y
- 导入Docker官方GPG密钥、添加适配Ubuntu 20.04的Docker官方软件源后,安装最新稳定版docker-ce:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt update sudo apt install docker-ce docker-ce-cli containerd.io -y
- 安装完成后校验服务状态:
systemctl status docker
方案2:检查并配置内核依赖
如果替换版本后仍启动失败,执行以下操作:
- 检查必需内核模块是否加载
lsmod | grep overlay lsmod | grep br_netfilter
如果无输出,手动加载模块并配置开机自动加载:
sudo modprobe overlay sudo modprobe br_netfilter echo -e "overlay\nbr_netfilter" | sudo tee /etc/modules-load.d/docker.conf
- 配置docker运行必需的sysctl参数:
echo -e "net.bridge.bridge-nf-call-iptables = 1\nnet.bridge.bridge-nf-call-ip6tables = 1\nnet.ipv4.ip_forward = 1" | sudo tee /etc/sysctl.d/99-docker.conf sudo sysctl --system
方案3:配置cgroup兼容参数
如果还是启动失败,可通过内核启动参数关闭cgroup v2,兼容docker运行:
- 编辑grub配置文件:
sudo nano /etc/default/grub
找到GRUB_CMDLINE_LINUX_DEFAULT配置项,在行尾添加systemd.unified_cgroup_hierarchy=0,修改后示例如下:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash systemd.unified_cgroup_hierarchy=0"
- 更新grub配置并重启虚拟机:
sudo update-grub sudo reboot
方案4:清理残留状态文件
如果提示service-start-limit-hit错误,先清理阻塞的状态文件:
sudo systemctl stop docker.socket docker.service sudo rm -rf /var/lib/docker/* /run/docker* sudo systemctl daemon-reload sudo systemctl start docker
修复完成后执行docker run hello-world即可验证服务是否正常运行。
内容的提问来源于stack exchange,提问作者LiaoMie
相关产品推荐
相关产品推荐

