基于Ubuntu14.04的Docker容器设置Redis vm.overcommit_memory报错求助
解决Docker容器中sysctl vm.overcommit_memory设置失败的问题
这个问题我碰到过好多次啦,Docker容器里直接用sysctl修改内核参数失败,核心原因是容器的/proc/sys目录默认是只读挂载的,没办法直接通过sysctl命令修改。给你几个实用的解决办法:
方法一:启动容器时指定sysctl参数(推荐,永久生效)
如果你的容器还没启动,或者可以重启容器,这是最稳妥的方式。直接在docker run命令里加上--sysctl参数来设置:
docker run --sysctl vm.overcommit_memory=1 [你的容器其他启动参数] ubuntu:14.04
要是你用Docker Compose管理容器,就在docker-compose.yml的服务配置里添加sysctls字段:
services: redis-service: image: ubuntu:14.04 sysctls: - vm.overcommit_memory=1 # 这里可以加上你的其他配置,比如端口映射、挂载目录等
这样启动的容器会直接生效这个内存参数,哪怕容器重启也不会丢失设置。
方法二:临时修改运行中的容器(重启后失效)
如果容器已经在运行,不想重启的话,可以直接操作/proc/sys下的对应文件,绕开sysctl命令:
# 先进入容器内部(用容器ID或者名称都行) docker exec -it [容器ID/名称] bash # 直接写入参数,root权限下不需要sudo echo 1 > /proc/sys/vm/overcommit_memory
修改完可以验证一下是否生效:
cat /proc/sys/vm/overcommit_memory
这个方法适合临时测试,不过容器重启后设置就会消失,需要重新配置。
小提醒
不是所有sysctl参数都能在容器里修改,Docker只开放了部分和内存、网络相关的参数,vm.overcommit_memory刚好是允许修改的。如果遇到其他参数无法修改,别随便用特权容器(--privileged),会带来安全风险,优先考虑Docker官方支持的配置方式。
内容的提问来源于stack exchange,提问作者GabrieleMartini
相关产品推荐
相关产品推荐

