容器实战高手课
李程远
eBay 总监级工程师,云平台架构师
24647 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 31 讲
容器实战高手课
15
15
1.0x
00:00/00:00
登录|注册

01 | 认识容器:容器的基本操作和实现原理

Cpuset子系统
Pids子系统
Memory子系统
CPU子系统
Mount Namespace
Network Namespace
PID Namespace
Cgroups
Namespace
容器验证
容器启动
容器镜像
Dockerfile
容器的实现原理
容器的基本操作
容器
容器的基本操作和实现原理

该思维导图由 AI 生成,仅供参考

你好,我是程远。作为一名工程师,我猜在过去的几年时间里,你肯定用过或者听人提起过容器(Container)。
说实话,容器这东西一点都不复杂,如果你只是想用的话,那跟着Docker 官网的说明,应该十来分钟就能搞定。
简单来说,它就是个小工具,可以把你想跑的程序,库文件啊,配置文件都一起“打包”。
然后,我们在任何一个计算机的节点上,都可以使用这个打好的包。有了容器,一个命令就能把你想跑的程序跑起来,做到了一次打包,就可以到处使用。
今天是咱们整个课程的第一讲,我想和你来聊聊容器背后的实现机制。
当然,空讲原理也没什么感觉,所以我还是会先带着你启动一个容器玩玩,然后咱们再一起来探讨容器里面的两大关键技术—— Namespace 和 Cgroups。基本上理解了这两个概念,你就能彻底搞懂容器的核心原理了。

做个镜像

话不多说,咱们就先动手玩一玩。启动容器的工具有很多,在这里我们还是使用 Docker 这个最常用的容器管理工具。
如果你之前根本没用过 Docker 的话,那我建议你先去官网看看文档,一些基础的介绍我就不讲了,那些内容你随便在网上一搜就能找到。
安装完 Docker 之后,咱们先来用下面的命令运行一个 httpd 服务。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了容器技术的核心概念和技术,以Docker为例进行了详细讲解。通过实际操作和命令演示,读者可以快速了解容器的基本操作、镜像制作、容器启动和验证等方面。文章详细讲解了容器的独立运行环境是如何通过Namespace实现的,包括PID Namespace、Network Namespace和Mount Namespace等。这些Namespace的作用是隔离容器资源,保证资源的隔离和安全性。此外,文章还介绍了Cgroups技术,它可以对指定的进程做各种计算机资源的限制,如限制CPU的使用率、内存使用量等。通过对Namespace和Cgroups的解释,读者可以初步感知到容器的文件系统、运行的进程环境和网络设置是独立的,与宿主机环境分隔开。总之,本文通过实例和概念的结合,帮助读者快速了解容器的基本概念和操作流程,适合初学者快速入门。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《容器实战高手课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(50)

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

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

    2021-05-13
    12
  • 那时刻
    求教老师一个问题,我们有三个服务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-18
    24
  • JianXu
    老师,能帮忙扫盲一下 PID namespace 那张图里 的shim 吗?为什么要使用Shim 呢?

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

    2020-11-16
    4
    12
  • 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-21
    3
    9
  • 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-13
    3
    8
  • 上邪忘川
    centos7.4测试,docker在cgroup下的目录为/sys/fs/cgroup/memory/docker/40152218ccc9d2bcda0e146efdfed871a78480712cb9675404af800c2e812ea9/

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

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

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

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

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

    2020-11-17
    3
    5
  • 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-20
    2
    4
  • 海盗船长
    请教老师一个问题,执行 ls -l /proc/self/ns,我们的服务器上只支持6种namespace:ipc,mnt,net,pid,user,uts。请问这是怎么回事?

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

    2020-11-18
    2
    4
收起评论
显示
设置
留言
50
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部