HoRain云--Docker启动容器报错:cannot allocate memory: unknown

  

🎬 HoRain云小助手个人主页

 🔥 个人专栏: 《Linux 系列教程》《c语言教程

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

专栏介绍

专栏名称

专栏介绍

《C语言》

本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。

《网络协议》

本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制!

《docker容器精解篇》

全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。

《linux系列》

本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。

《python 系列》

本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。

《试题库》

本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等)

目录

⛳️ 推荐

专栏介绍

1. 检查宿主机可用内存

查看系统内存使用情况

检查进程内存占用

2. 调整Docker内存限制

降低容器内存限制

完全禁用内存限制(仅限测试环境)

3. 增加Swap交换空间

创建Swap文件(以增加4GB为例)

永久生效(可选)

4. 检查内核日志

5. 优化容器内存使用

限制容器内应用内存

使用轻量级基础镜像

6. 重启Docker服务及宿主机

7. 验证Linux内核参数

调整内存分配策略(临时)

永久生效(谨慎操作)

8. 其他可能原因

检查cgroups配置

更新Docker版本

总结


img


1. 检查宿主机可用内存

查看系统内存使用情况
free -h
  • 关键指标
    • Available(可用内存)需大于容器所需内存。
    • Swap(交换分区)是否启用,可临时缓解内存不足问题。
检查进程内存占用
top  # 按内存排序(Shift + M)

2. 调整Docker内存限制

降低容器内存限制

如果容器启动时指定了内存限制(-m),尝试减少限制值:

docker run -it --memory=512m your_image  # 将内存限制设为512MB
完全禁用内存限制(仅限测试环境)
docker run -it --memory-swap=-1 your_image  # 不限制内存和Swap

3. 增加Swap交换空间

创建Swap文件(以增加4GB为例)
sudo fallocate -l 4G /swapfile  # 创建4G文件
sudo chmod 600 /swapfile        # 设置权限
sudo mkswap /swapfile           # 格式化为Swap
sudo swapon /swapfile           # 启用Swap
永久生效(可选)
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

4. 检查内核日志

查看内存分配失败的具体原因:

dmesg | grep -i "out of memory"
dmesg | grep -i "oom-killer"

5. 优化容器内存使用

限制容器内应用内存

如果容器内应用(如Java)默认占用过高内存,需调整应用配置:

# 例如Java应用设置堆内存
docker run -e JAVA_OPTS="-Xmx256m" your_image
使用轻量级基础镜像

避免使用臃肿镜像(如包含GUI工具链的镜像),改用Alpine等精简镜像:

FROM alpine:latest

6. 重启Docker服务及宿主机

释放被占用的内核资源:

sudo systemctl restart docker  # 重启Docker服务
sudo reboot                    # 重启宿主机(最终手段)

7. 验证Linux内核参数

调整内存分配策略(临时)
# 允许内核超量分配内存(风险:可能触发OOM Killer)
sudo sysctl vm.overcommit_memory=1
  • 参数说明
    • 0(默认):保守分配策略,严格计算剩余内存。
    • 1:总是允许分配,忽略内存检查。
    • 2:基于Swap和内存的超量分配。
永久生效(谨慎操作)
echo 'vm.overcommit_memory=1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

8. 其他可能原因

检查cgroups配置
cat /proc/cgroups  # 查看cgroups子系统状态
更新Docker版本
sudo apt update && sudo apt upgrade docker-ce

总结

步骤操作
1. 检查内存资源free -htop 确认可用内存是否充足
2. 调整容器内存限制降低 -m 参数值或禁用限制
3. 增加Swap空间创建Swap文件并激活
4. 优化应用配置限制应用堆内存,使用轻量镜像
5. 调整内核参数修改 vm.overcommit_memory 允许超量分配

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值