0%

# docker比一般多一点的初学者介绍二

Posted on 2020-03-15 Edited on 2020-03-16 In Docker , 介绍 Views: Disqus:

## 限制下 docker 的 cpu 使用率

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

    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
    int main(void)
    {
        int i = 0;
        for(;;) i++;
        return 0;
    }

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

    1
    2
    $ gcc 1.c
    $ ./a.out

然后我们来看下系统资源占用（CPU）
上图是在容器里的，可以看到 cpu 已经 100%了
然后看看容器外面的
可以看到一个核的 cpu 也被占满了，因为是个双核的机器，并且代码是单线程的
然后呢我们要做点啥
因为已经在这个 ubuntu 容器中装了 vim 和 gcc，考虑到国内的网络，所以我们先把这个容器 commit 一下，

    1
    docker commit -a "nick" -m "my ubuntu" f63c5607df06 my_ubuntu:v1

然后再运行起来

    1
    docker run -it --cpus=0.1 my_ubuntu:v1 bash

我们的代码跟可执行文件都还在，要的就是这个效果，然后再运行一下
结果是这个样子的，有点神奇是不，关键就在于 run 的时候的`--cpus=0.1`这个参数，它其实就是基于我前一篇说的 cgroup 技术，能将进程之间的cpu，内存等资源进行隔离

## 开始第一个 Dockerfile

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

    1
    2
    3
    4
    5
    6
    7
    8
    From ubuntu:latest
    MAINTAINER Nicksxs "nicksxs@hotmail.com"
    RUN  sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
    RUN apt-get clean
    RUN apt-get update && apt install -y nginx
    RUN echo 'Hi, i am in container' \
        > /usr/share/nginx/html/index.html
    EXPOSE 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`去把构建缓存禁用掉。

Related Posts

- docker比一般多一点的初学者介绍
- docker比一般多一点的初学者介绍三
- docker使用中发现的echo命令的一个小技巧及其他

请我喝杯咖啡

WeChat Pay

Alipay

- Post author: Nicksxs
- Post link: https://nicksxs.me/2020/03/15/docker比一般多一点的初学者介绍二/
- Copyright Notice: All articles in this blog are licensed under BY-NC-SA unless stating additionally.