今天在看腾讯云的容器服务,可以搭建K8S容器集群,本来想着测试一番,因为是流量计费需要账户余额就放弃了。不过发现轻量应用服务器可以直接选择Docker CE镜像,那笔者就可以直接从虚拟机上迁移到云服务器上来测试容器了!
Docker的镜像源已经配置为腾讯云Docker镜像源,下载速度极快。
以前笔者的云服务器上只有LAMP,那么现在基于Docker容器就可以完成更多的测试与实践了。使用就pull,用完即可rm ,大大方便测试!同时腾讯云Docker镜像加速锦上添花,整个测试流程比以往在虚拟机上测试可以很大的节省时间。
现在笔者运行一个ubuntu和busybox镜像,docker stats查看容器的资源使用情况。
docker run -itd --name busybox --net my_bridge_network --ip 172.168.0.2 busybox
docker run -itd --name ubuntu --net my_bridge_network --ip 172.168.0.3 ubuntu
Docker使用内核的 namespace 来做容器之间的隔离,内核的cgroup(Control Groups)来管理容器的资源使用。笔者的云服务器是一核2G的配置,每个容器的限制是全部资源,容器在资源竞争时默认使用简单的均分算法。但是从运维上考虑需要保留或者限制某个容器的资源,使用在云服务器上需要对容器的CPU和内存进行调优。
限制容器资源具体信息可以通过man docker run来查看英语文档,笔者在此借用别人的翻译(Docker(二十)-Docker容器CPU、memory资源限制)总结如下:
一、限制容器的内存消耗
对docker run 限制内存来有以下几个选项。
用户内存限制就是对容器能使用的内存和交换分区的大小作出限制。
1、 --memory选项的参数最小为 4 M。
2、--memory-swap不是交换分区,而是内存加交换分区的总大小。
3、不设置-m,--memory和--memory-swap,容器默认可以用完宿舍机的所有内存和 swap 分区。
4、-m或--memory设置一个正常值,不设置--memory-swap或将--memory-swap设置为 0,容器能使用的内存大小为 a,能使用的交换分区大小也为 a。因为 Docker 默认容器交换分区的大小和内存相同。
5、给-m参数设置一个正常值,而给--memory-swap设置成 -1。这种情况表示限制容器能使用的内存大小为 a,而不限制容器能使用的 swap 分区大小。容器内进程能申请到的内存大小为 a + 宿主机的 swap 大小。
memory reservation 是一种软性限制,给--memory-reservation设置一个比-m小的值后,系统的内存回收会尝试将容器的内存锁紧到reservation以下,确保容器不会长时间占用太多内存。
出现 out-of-memory(OOM) 错误时,系统会杀死容器内的进程来获取更多空闲内存。oom-kill-disable选项来禁止 OOM killer 杀死容器内进程。确保只有在使用了-m/--memory选项时才使用--oom-kill-disable禁用 OOM killer。如果没有设置-m选项,却禁用了 OOM-killer,可能会造成出现 out-of-memory 错误时,系统通过杀死宿主机进程来获取内存。
一个容器只有一个进程,oom-score-adj设置在系统内存不够时,容器被杀死的优先级,默认为 0,越小优先级越高。
二、限制容器的CPU消耗
对docker run 限制CPU来有以下几个选项。默认情况下,所有的容器得到同等比例的 CPU 周期。
--cpuset-cpus用于设置容器可以使用的 vCPU 核。-c,--cpu-shares用于设置多个容器竞争 CPU 时,各个容器相对能分配到的 CPU 时间比例。--cpu-period和--cpu-quata用于绝对设置容器能使用 CPU 时间。
在有多个容器竞争 CPU 时我们可以设置每个容器能使用的 CPU 时间比例。这个比例叫作共享权值,通过-c或--cpu-shares设置。Docker 默认每个容器的权值为 1024。不设置或将其设置为 0,都将使用这个默认值。系统会根据每个容器的共享权值和所有容器共享权值和比例来给容器分配 CPU 时间。
网友评论