Docker 实用技巧二
限制下 docker 的 cpu 使用率
这里我们开始玩一点有意思的,我们在容器里装下 vim 和 gcc,然后写这样一段 c 代码
就是一个最简单的死循环,然后在容器里跑起来
然后我们来看下系统资源占用(CPU)
上图是在容器里的,可以看到 cpu 已经 100%了然后看看容器外面的
可以看到一个核的 cpu 也被占满了,因为是个双核的机器,并且代码是单线程的然后呢我们要做点啥
因为已经在这个 ubuntu 容器中装了 vim 和 gcc,考虑到国内的网络,所以我们先把这个容器 commit 一下,
然后再运行起来
我们的代码跟可执行文件都还在,要的就是这个效果,然后再运行一下
结果是这个样子的,有点神奇是不,关键就在于 run 的时候的--cpus=0.1
这个参数,它其实就是基于我前一篇说的 cgroup 技术,能将进程之间的 cpu,内存等资源进行隔离
开始第一个 Dockerfile
上一面为了复用那个我装了 vim 跟 gcc 的容器,我把它提交到了本地,使用了docker commit
命令,有点类似于 git 的 commit,但是这个不是个很好的操作方式,需要手动介入,这里更推荐使用 Dockerfile 来构建镜像
先解释下这是在干嘛,首先是这个From ubuntu:latest
基于的 ubuntu 的最新版本的镜像,然后第二行是维护人的信息,第三四行么作为墙内人你懂的,把 ubuntu 的源换成阿里云的,不然就有的等了,然后就是装下 nginx,往默认的 nginx 的入口 html 文件里输入一行欢迎语,然后暴露 80 端口然后我们使用sudo docker build -t="nicksxs/static_web" .
命令来基于这个 Dockerfile 构建我们自己的镜像,过程中是这样的
可以看到图中,我的 Dockerfile 是 7 行,里面就执行了 7 步,并且每一步都有一个类似于容器 id 的层 id 出来,这里就是一个比较重要的东西,docker 在构建的时候其实是有这个层的概念,Dockerfile 里的每一行都会往上加一层,这里有还注意下命令后面的.
,代表当前目录下会自行去寻找 Dockerfile 进行构建,构建完了之后我们再看下我们的本地镜像
我们自己的镜像出现啦然后有个问题,如果这个构建中途报了错咋办呢,来试试看,我们把 nginx 改成随便的一个错误名,nginxx(不知道会不会运气好真的有这玩意),再来 build 一把
找不到 nginxx 包,是不是这个镜像就完全不能用呢,当然也不是,因为前面说到了,docker 是基于层去构建的,可以看到前面的 4 个 step 都没报错,那我们基于最后的成功步骤创建下容器看看也就是sudo docker run -t -i bd26f991b6c8 /bin/bash
答案是可以的,只是没装成功 nginx
还有一点注意到没,前面的几个 step 都有一句 Using cache
,说明 docker 在构建镜像的时候是有缓存的,这也更能说明 docker 是基于层去构建镜像,同样的底包,同样的步骤,这些层是可以被复用的,这就是 docker 的构建缓存,当然我们也可以在 build 的时候加上--no-cache
去把构建缓存禁用掉。
本文使用署名 4.0 国际 (CC BY 4.0)许可协议,欢迎转载、或重新修改使用,但需要注明来源。
本文作者: Nicksxs
创建时间: 2020-03-15
本文链接: Docker 实用技巧二
版权声明: 本文为 InfoQ 作者【Nick】的原创文章。
原文链接:【http://xie.infoq.cn/article/404a02efc8ee99039b6ed2f27】。文章转载请联系作者。
评论