作者回复: 感谢你的肯定。
作者回复: @那时刻,
这种情况,如果A1/A2, B1/B2 都运行在自己的cgroup limit之内,那么需要先从两个宿主机的整体情况先做一个比较,从硬件类型开始,OS版本, 宿主机上的其他负载的情况,如果这些都一样,那么可以对A1/A2, B1/B2做perf看看热点函数。
作者回复: containerd会先向容器中的init进程发送SIGTERM,如果init进程注册了SIGTERM handler(并且handler让进程退出了)那么整个容器就退出了,如果容器的init进程没有注册SIGTERM, 那么过30秒, containerd再向容器的init进程发送SIGKILL.
作者回复: containerd 启动当容器的时候先会启动一个shim, 然后由shim运行runc去创建container. 这样相当于一个shim来管理一个container. shim作为container的“父进程”, 接管了容器的stdin/stdout, containerd服务出问题,不会影响到用户的container。
作者回复: @MYG, 你的系统上应该还是Cgroup V1.
试试这样找一下:
# docker inspect 4d3cf63512a2 | grep \"Pid\"
"Pid": 4384,
# cat /proc/4384/cgroup | grep memory
5:memory:/system.slice/docker-4d3cf63512a2b89c0982724a6c12cb9b69781676aa93ab4fb2060f47908c6b94.scope
作者回复: 1. 把容器当成虚拟机使用,可以是容器化过程中的一个过渡方案,但是长期的方向是native的方式来使用容器。
2. 我不清楚你具体修改的是哪个kernel参数,不过对于资源的限制比如cgroup, 或者xfs quota, 这些都是Linux 内核中的特性,所以有时候就需要在grub中对内核的启动参数做修改。
3. 这个没有什么问题。
4. 这个就需要用cgroup做限制了, 我在后面的课程里有很多这方面的介绍。
作者回复: @上邪忘川,
请问一下, 你是否是通过systemd来启动dockerd的?
容器在cgroup下的目录树结构会受容器管理平台的影响。
作者回复: docker base image, 拿centos为例子,可以建一个目录,让后把需要的rpm 安装在这个目录下面,然后把目录打成一个tarball, 用docker import成为一个base image.
https://github.com/moby/moby/blob/master/contrib/mkimage-yum.sh
作者回复:
> 老师能展开介绍一下为什么 memory cgroup 和 blkio cgroup 不能协作的问题吗?为什么cgroup v2 就可以了呢?
这一部分我在第13讲"容器磁盘限速里" 会详细的解释。
cgroup v1 blkio 可以对 Direct I/O做限流。
cgroup v1 net_cls 配合 tc 可以对网络限流。
cgroup v2 io + memory 一起可以对 Direct I/O 和 Buffered I/O做限流,但是不支持xfs
作者回复: @布凡, 赞! 操作很重要!
作者回复: containerd是宿主机上的一个守护进程,用来建立容器。每建立一个容器,就会有一个shim进程,它是容器中init进程的父进程。
作者回复: @思维,请看一下你的内核版本号。比如time namespace是Linux kernel 5.6之后才有的。
作者回复: 这个是宿主机上Linux bridge interface docker0上的IP, 和容器里的IP在同一个网段,用来宿主机和容器进行网络通讯
作者回复: @wuyang-ligerj
可以尝试用find命令去找一下
```
-bash-4.2# docker ps -q
8c28cc9c5db8
-bash-4.2# pwd
/sys/fs/cgroup/memory
-bash-4.2# find . -name *8c28cc9c5db8*
./system.slice/docker-8c28cc9c5db88bf08b6ccc79aed58b8ec4afaeb1ef7ff27aaabfa60229824c08.scope
```
作者回复: "Understanding the Linux Kernel"
"Linux Kernel Development"
虽然这两本书是10多年前的了,讲述的内核版本和目前的有差距,不过基本的概念原理都是一样的。认真读完,对于内核会有一个比较完整的认识。
作者回复: @JianXu,
因为我的介绍后面有很多内容涉及到了Linux相关的功能,需要在Linux的机器里运行容器。
“在这个容器课程中,每一讲里都会有一些小例子,所以需要你有一台安装有 Linux 的机器,或者用 VirtualBox 安装一个虚拟机来跑 Linux。Linux 的版本建议是 CentOS 8 或者是 Ubuntu 20.04。"