• leslie
    置顶
    2021-05-13
    透彻,之前被人问过,资料方面同样查过,架构同样明了,如此通俗明了-难得。

    作者回复: 感谢你的肯定。

    
    11
  • 那时刻
    2020-11-18
    求教老师一个问题,我们有三个服务A B C部署在K8S里,它们各自设置了resouce limit(cpu, memory),其中恰好 A1 B1 C1被分配到同一个node上,A2 B2分配到另外一个node上。流量经过load balance之后打到 A1 A2和 B1 B2各自是均匀的,但是A1 B1使用的cpu 占比相对于 A2 B2要高出5% ~ 6%。我认为尽管docker通过namespace和cgroups来隔离和限制使用的资源,但是对于宿主机而言,各个docker实例之间还是存在竞争cpu和memory的,不知这么理解是否正确?

    作者回复: @那时刻, 这种情况,如果A1/A2, B1/B2 都运行在自己的cgroup limit之内,那么需要先从两个宿主机的整体情况先做一个比较,从硬件类型开始,OS版本, 宿主机上的其他负载的情况,如果这些都一样,那么可以对A1/A2, B1/B2做perf看看热点函数。

    
    23
  • JianXu
    2020-11-16
    老师,能帮忙扫盲一下 PID namespace 那张图里 的shim 吗?为什么要使用Shim 呢?

    作者回复: containerd 启动当容器的时候先会启动一个shim, 然后由shim运行runc去创建container. 这样相当于一个shim来管理一个container. shim作为container的“父进程”, 接管了容器的stdin/stdout, containerd服务出问题,不会影响到用户的container。

    共 4 条评论
    12
  • Richur
    2020-12-21
    老师好,求教一个问题,docker stop containerId,容器中的进程是如何退出的,是kill pid,kill -15 pid 还是kill -9 pid 亦或是其他?

    作者回复: containerd会先向容器中的init进程发送SIGTERM,如果init进程注册了SIGTERM handler(并且handler让进程退出了)那么整个容器就退出了,如果容器的init进程没有注册SIGTERM, 那么过30秒, containerd再向容器的init进程发送SIGKILL.

    共 3 条评论
    9
  • MYG
    2020-12-13
    我在macOS下用multipass启动Ubuntu 20.04的VM,貌似已经升级到了containerd-shim-runc-v2,同时在/sys/fs/cgroup/memory/system.slice下也找不到每个container的子目录了,请问在哪里能找到呢?还是v2的设计完全不一样了?谢谢🙏

    作者回复: @MYG, 你的系统上应该还是Cgroup V1. 试试这样找一下: # docker inspect 4d3cf63512a2 | grep \"Pid\" "Pid": 4384, # cat /proc/4384/cgroup | grep memory 5:memory:/system.slice/docker-4d3cf63512a2b89c0982724a6c12cb9b69781676aa93ab4fb2060f47908c6b94.scope

    共 2 条评论
    8
  • 上邪忘川
    2020-11-16
    centos7.4测试,docker在cgroup下的目录为/sys/fs/cgroup/memory/docker/40152218ccc9d2bcda0e146efdfed871a78480712cb9675404af800c2e812ea9/

    作者回复: @上邪忘川, 请问一下, 你是否是通过systemd来启动dockerd的? 容器在cgroup下的目录树结构会受容器管理平台的影响。

    共 5 条评论
    6
  • Action
    2020-12-18
    "Host PID Namespace,它是其他 Namespace 的父亲 Namespace" 其中我看图中有containerd的pid 和shim的pid分别代表什么呀?这些是怎么关联起来的呢?

    作者回复: containerd是宿主机上的一个守护进程,用来建立容器。每建立一个容器,就会有一个shim进程,它是容器中init进程的父进程。

    
    5
  • 朱雯
    2020-11-17
    老师好 1.我们现在对docker容器的使用就如同虚拟机一样 一个容器运行多个进程 但是我听说docker是天生是单进程的 是否需要改造 2.之前在某次创建docker容器时 要设置资源控制好像必须修改grub的某个配置 不配置就真的无法限制 这是啥原理 3. 容器使用过程中 其实我大多数时候的交互方式是-it binbash的方式 当成虚拟机来用 这样是否有问题 4. 我们现在的环境 其实并没有做过多限制 容器之间相互干扰和影响 要设置限制 然后平滑的设置限制有没有好的方法

    作者回复: 1. 把容器当成虚拟机使用,可以是容器化过程中的一个过渡方案,但是长期的方向是native的方式来使用容器。 2. 我不清楚你具体修改的是哪个kernel参数,不过对于资源的限制比如cgroup, 或者xfs quota, 这些都是Linux 内核中的特性,所以有时候就需要在grub中对内核的启动参数做修改。 3. 这个没有什么问题。 4. 这个就需要用cgroup做限制了, 我在后面的课程里有很多这方面的介绍。

    共 3 条评论
    5
  • conanforever22
    2020-11-20
    有个疑问, dockerfile中FROM后边的基础镜像应该怎么做?

    作者回复: docker base image, 拿centos为例子,可以建一个目录,让后把需要的rpm 安装在这个目录下面,然后把目录打成一个tarball, 用docker import成为一个base image. https://github.com/moby/moby/blob/master/contrib/mkimage-yum.sh

    共 2 条评论
    4
  • 海盗船长
    2020-11-18
    请教老师一个问题,执行 ls -l /proc/self/ns,我们的服务器上只支持6种namespace:ipc,mnt,net,pid,user,uts。请问这是怎么回事?

    作者回复: @思维,请看一下你的内核版本号。比如time namespace是Linux kernel 5.6之后才有的。

    共 2 条评论
    4