缘起
想用docker容器来做传统虚拟机的事情,但是从docker的api接口来看,如果限制容器的资源使用情况,需要在创建容器时指定,如: 内存、cpu等;一旦创建,将无法修改。
但是,资源限制本身就是运行时的事情,何故必须在创建时指定而且无法修改呢?比如:我创建一个容器允许使用4G内存,但是过了一段时间,我想将内存限制调整到8G,难道真的不行吗?
docker api似乎真做不到。
我们知道资源限制是通过cgroup实现的,其实可以跳过docker,直接调整cgroup也应该是可以的; 可以通过mount来查看各子系统都mount到哪里了。
如:
1 |
/sys/fs/cgroup/memory/system.slice/docker-49d73de4343c5e43474b55d50c8ab85fdb84f8777faf573122cdbf459b2d3805.scope/ |
修改内存限制:
1 |
echo 2g > /sys/fs/cgroup/memory/system.slice/docker-fe4a34eebd0d2c1530186d3fb174ae3efc5a7594576ce873ffd17ab3ef5c7246.scope/memory.limit_in_bytes |
注意: 1. 如果容器已经使用了4g内存,修改为2g时会失败,错误如下:
2. 把占用内存多的进程先杀掉,让内存使用回归到合理值后,再降低内存配额是可以的
不过,有些东西目前还没发现如何修改,如: hostname
docker容器不同于真正的虚拟机,直接使用top、free等命令看到的是整个宿主机的资源使用状况,而无法知道本容器的资源限制和使用情况,可以借助一些监控软件:
http://www.tuicool.com/articles/nuE7b2E
参考资料: