后续文章会演示如何从零实现一个简易的 Docker,这里先简单了解下 Docker 的核心原理。如果你对云原生技术充满好奇,想要深入了解更多相关的文章和资讯,欢迎关注微信公众号。
看起来容器和宿主机隔离开了接下来就让我们一起探索一下 Linux Namespace 以及 Docker 是如何借助该能力来实现隔离的。
简单来说:namespace 就是对资源的逻辑隔离目前,Linux 内核里面实现了 8 种不同类型的 namespace:
这条规则对其他类型的 namespace 也同样适用。namespace 数量限制与回收策略
这也解释了为什么没有创建 namespace 的 API,因为刚创建的 namespace 没有任何进程,立马就会被回收。不过也有一些特殊情况,可以再没有进程的时候保留 namespace:
一句话描述:当 namespace 有被使用时就不会被回收,反之则会被回收。2. 使用 Go 语言操作 Linux 命名空间示例
这样就可以理解,在docker container 里面,使用ps -ef经常会发现,在容器内,前台运行的那个进程PID是1,但是在容器外,使用ps -ef会发现同样的进程却有不同的PID,这就是PID Namespace做的事情。再次调整程序,增加 PID flags:
这里只能使用 echo $$ 命令查看,ps、top 等命令会查看到其他 Namespace 中的信息。
需要注意的是,Mount Namespace 的 flag 是CLONE_NEWNS,直接是 NEWNS 而不是 NEWMOUNT,因为 Mount Namespace 是 Linux 中实现的第一个 Namespace,当时也没想到后续会有很多类型的 Namespace 加入。再次修改代码,增加 Mount Namespace 的 flag
比较常用的是,在宿主机上以一个非 root 用户运行创建一个 User Namespace, 然后在 User Namespace 里面却映射成 root 用户。这意味着,这个进程在 User Namespace 里面有 root 权限,但是在 User Namespace 外面却没有 root 的权限。再次修改代码,增加 User Namespace 的 flag:
在宿主机上搭建网桥后,就能很方便地实现容器之间的通信,而且不同容器上的应用可以使用相同的端口。再次修改代码,增加 Network Namespace 的 flag:
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |