01 | 认识容器:容器的基本操作和实现原理
该思维导图由 AI 生成,仅供参考
做个镜像
- 深入了解
- 翻译
- 解释
- 总结
本文深入介绍了容器技术的核心概念和技术,以Docker为例进行了详细讲解。通过实际操作和命令演示,读者可以快速了解容器的基本操作、镜像制作、容器启动和验证等方面。文章详细讲解了容器的独立运行环境是如何通过Namespace实现的,包括PID Namespace、Network Namespace和Mount Namespace等。这些Namespace的作用是隔离容器资源,保证资源的隔离和安全性。此外,文章还介绍了Cgroups技术,它可以对指定的进程做各种计算机资源的限制,如限制CPU的使用率、内存使用量等。通过对Namespace和Cgroups的解释,读者可以初步感知到容器的文件系统、运行的进程环境和网络设置是独立的,与宿主机环境分隔开。总之,本文通过实例和概念的结合,帮助读者快速了解容器的基本概念和操作流程,适合初学者快速入门。
《容器实战高手课》,新⼈⾸单¥59
全部留言(50)
- 最新
- 精选
- leslie置顶透彻,之前被人问过,资料方面同样查过,架构同样明了,如此通俗明了-难得。
作者回复: 感谢你的肯定。
2021-05-1312 - 那时刻求教老师一个问题,我们有三个服务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看看热点函数。
2020-11-1824 - JianXu老师,能帮忙扫盲一下 PID namespace 那张图里 的shim 吗?为什么要使用Shim 呢?
作者回复: containerd 启动当容器的时候先会启动一个shim, 然后由shim运行runc去创建container. 这样相当于一个shim来管理一个container. shim作为container的“父进程”, 接管了容器的stdin/stdout, containerd服务出问题,不会影响到用户的container。
2020-11-16412 - Richur老师好,求教一个问题,docker stop containerId,容器中的进程是如何退出的,是kill pid,kill -15 pid 还是kill -9 pid 亦或是其他?
作者回复: containerd会先向容器中的init进程发送SIGTERM,如果init进程注册了SIGTERM handler(并且handler让进程退出了)那么整个容器就退出了,如果容器的init进程没有注册SIGTERM, 那么过30秒, containerd再向容器的init进程发送SIGKILL.
2020-12-2139 - MYG我在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
2020-12-1338 - 上邪忘川centos7.4测试,docker在cgroup下的目录为/sys/fs/cgroup/memory/docker/40152218ccc9d2bcda0e146efdfed871a78480712cb9675404af800c2e812ea9/
作者回复: @上邪忘川, 请问一下, 你是否是通过systemd来启动dockerd的? 容器在cgroup下的目录树结构会受容器管理平台的影响。
2020-11-1656 - Action"Host PID Namespace,它是其他 Namespace 的父亲 Namespace" 其中我看图中有containerd的pid 和shim的pid分别代表什么呀?这些是怎么关联起来的呢?
作者回复: containerd是宿主机上的一个守护进程,用来建立容器。每建立一个容器,就会有一个shim进程,它是容器中init进程的父进程。
2020-12-185 - 朱雯老师好 1.我们现在对docker容器的使用就如同虚拟机一样 一个容器运行多个进程 但是我听说docker是天生是单进程的 是否需要改造 2.之前在某次创建docker容器时 要设置资源控制好像必须修改grub的某个配置 不配置就真的无法限制 这是啥原理 3. 容器使用过程中 其实我大多数时候的交互方式是-it binbash的方式 当成虚拟机来用 这样是否有问题 4. 我们现在的环境 其实并没有做过多限制 容器之间相互干扰和影响 要设置限制 然后平滑的设置限制有没有好的方法
作者回复: 1. 把容器当成虚拟机使用,可以是容器化过程中的一个过渡方案,但是长期的方向是native的方式来使用容器。 2. 我不清楚你具体修改的是哪个kernel参数,不过对于资源的限制比如cgroup, 或者xfs quota, 这些都是Linux 内核中的特性,所以有时候就需要在grub中对内核的启动参数做修改。 3. 这个没有什么问题。 4. 这个就需要用cgroup做限制了, 我在后面的课程里有很多这方面的介绍。
2020-11-1735 - conanforever22有个疑问, dockerfile中FROM后边的基础镜像应该怎么做?
作者回复: docker base image, 拿centos为例子,可以建一个目录,让后把需要的rpm 安装在这个目录下面,然后把目录打成一个tarball, 用docker import成为一个base image. https://github.com/moby/moby/blob/master/contrib/mkimage-yum.sh
2020-11-2024 - 海盗船长请教老师一个问题,执行 ls -l /proc/self/ns,我们的服务器上只支持6种namespace:ipc,mnt,net,pid,user,uts。请问这是怎么回事?
作者回复: @思维,请看一下你的内核版本号。比如time namespace是Linux kernel 5.6之后才有的。
2020-11-1824