Docker运行容器报错cannot allocate memory: unknown求助
解决Docker运行hello-world时的cgroup内存分配错误
问题现象
运行docker run hello-world时触发以下错误:
docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: unable to apply cgroup configuration: mkdir /sys/fs/cgroup/memory/docker/246b9b461a8341391ad376c88ab923274c924d96c109762f06940be65ff82b17: cannot allocate memory: unknown.
服务器为Ubuntu 22.04(从20.04升级),配置4GB内存、4核CPU,资源充足(内存空闲3.7GB,磁盘使用率2%),重启服务器、Docker及重装系统后问题依旧。
解决方案
1. 切换Docker的cgroup驱动为systemd
Ubuntu 22.04默认使用systemd作为init系统,cgroupfs驱动可能存在兼容性问题:
- 查看当前cgroup驱动:
docker info | grep Cgroup - 编辑Docker配置文件
/etc/docker/daemon.json,添加或修改内容:{ "exec-opts": ["native.cgroupdriver=systemd"] } - 重启Docker服务:
systemctl daemon-reload && systemctl restart docker - 再次测试运行hello-world镜像。
2. 手动挂载cgroup内存子系统
如果内存cgroup子系统未正确挂载,会导致容器创建失败:
- 检查挂载状态:
mount | grep cgroup - 若未找到
/sys/fs/cgroup/memory的挂载记录,手动挂载:sudo mkdir -p /sys/fs/cgroup/memory sudo mount -t cgroup cgroup /sys/fs/cgroup/memory -o memory - 挂载完成后重新运行容器测试。
3. 针对OpenVZ/Virtuozzo虚拟化环境的处理
从df -h输出的ploop文件系统判断,服务器可能运行在OpenVZ/Virtuozzo环境中,这类环境默认会限制cgroup功能:
- 编辑
/etc/docker/daemon.json,调整cgroup配置:{ "exec-opts": ["native.cgroupdriver=cgroupfs"], "default-runtime": "runc" } - 重启Docker后,尝试带特权参数运行测试容器(仅用于调试,生产环境禁用):
docker run --privileged hello-world - 若仍失败,需联系主机服务商开启cgroup内存子系统支持。
4. 升级Docker到最新稳定版本
旧版Docker可能存在cgroup相关的bug,升级到最新版可解决问题:
- 卸载现有Docker组件:
sudo apt-get purge docker-ce docker-ce-cli containerd.io sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd - 重新安装最新稳定版Docker:
sudo apt-get update sudo apt-get install ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io - 安装完成后重启Docker并测试。
内容的提问来源于stack exchange,提问作者Marko Krizan
相关产品推荐
相关产品推荐

