写点什么

Docker 实用技巧二

作者:Nick
  • 2022 年 6 月 17 日
  • 本文字数:1458 字

    阅读完需:约 5 分钟

Docker 实用技巧二

限制下 docker 的 cpu 使用率

这里我们开始玩一点有意思的,我们在容器里装下 vim 和 gcc,然后写这样一段 c 代码


#include <stdio.h>int main(void){    int i = 0;    for(;;) i++;    return 0;}
复制代码


就是一个最简单的死循环,然后在容器里跑起来


$ gcc 1.c $ ./a.out
复制代码


然后我们来看下系统资源占用(CPU)



上图是在容器里的,可以看到 cpu 已经 100%了然后看看容器外面的



可以看到一个核的 cpu 也被占满了,因为是个双核的机器,并且代码是单线程的然后呢我们要做点啥


因为已经在这个 ubuntu 容器中装了 vim 和 gcc,考虑到国内的网络,所以我们先把这个容器 commit 一下,


docker commit -a "nick" -m "my ubuntu" f63c5607df06 my_ubuntu:v1
复制代码


然后再运行起来


docker run -it --cpus=0.1 my_ubuntu:v1 bash
复制代码



我们的代码跟可执行文件都还在,要的就是这个效果,然后再运行一下



结果是这个样子的,有点神奇是不,关键就在于 run 的时候的--cpus=0.1这个参数,它其实就是基于我前一篇说的 cgroup 技术,能将进程之间的 cpu,内存等资源进行隔离

开始第一个 Dockerfile

上一面为了复用那个我装了 vim 跟 gcc 的容器,我把它提交到了本地,使用了docker commit命令,有点类似于 git 的 commit,但是这个不是个很好的操作方式,需要手动介入,这里更推荐使用 Dockerfile 来构建镜像


From ubuntu:latestMAINTAINER Nicksxs "nicksxs@hotmail.com"RUN  sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.listRUN apt-get cleanRUN apt-get update && apt install -y nginxRUN echo 'Hi, i am in container' \    > /usr/share/nginx/html/index.htmlEXPOSE 80
复制代码


先解释下这是在干嘛,首先是这个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 实用技巧二

发布于: 刚刚阅读数: 4
用户头像

Nick

关注

还未添加个人签名 2017.12.22 加入

写代码的阿森 https://nicksxs.me https://nicksxs.com 也可以看我的博客

评论

发布
暂无评论
Docker 实用技巧二_Docker_Nick_InfoQ写作社区