实现容器的底层技术-每天5分钟玩转docker容器技术(30)

author author     2022-09-05     736

关键词:

为了更好地理解容器的特性,本节我们将讨论容器的底层实现技术。
cgroup 和 namespace 是最重要的两种技术。cgroup 实现资源限额, namespace 实现资源隔离。

cgroup

cgroup 全称 Control Group。Linux 操作系统通过 cgroup 可以设置进程使用 CPU、内存 和 IO 资源的限额。相信你已经猜到了:前面我们看到的--cpu-shares-m--device-write-bps 实际上就是在配置 cgroup。

cgroup 到底长什么样子呢?我们可以在 /sys/fs/cgroup 中找到它。还是用例子来说明,启动一个容器,设置 --cpu-shares=512

技术分享

查看容器的 ID:

技术分享

在 /sys/fs/cgroup/cpu/docker 目录中,Linux 会为每个容器创建一个 cgroup 目录,以容器长ID 命名:

技术分享

目录中包含所有与 cpu 相关的 cgroup 配置,文件 cpu.shares 保存的就是 --cpu-shares 的配置,值为 512。

同样的,/sys/fs/cgroup/memory/docker 和 /sys/fs/cgroup/blkio/docker 中保存的是内存以及 Block IO 的 cgroup 配置。

namespace

在每个容器中,我们都可以看到文件系统,网卡等资源,这些资源看上去是容器自己的。拿网卡来说,每个容器都会认为自己有一块独立的网卡,即使 host 上只有一块物理网卡。这种方式非常好,它使得容器更像一个独立的计算机。

Linux 实现这种方式的技术是 namespace。namespace 管理着 host 中全局唯一的资源,并可以让每个容器都觉得只有自己在使用它。换句话说,namespace 实现了容器间资源的隔离

Linux 使用了六种 namespace,分别对应六种资源:Mount、UTS、IPC、PID、Network 和 User,下面我们分别讨论。

Mount namespace

Mount namespace 让容器看上去拥有整个文件系统。

容器有自己的 / 目录,可以执行 mount 和 umount 命令。当然我们知道这些操作只在当前容器中生效,不会影响到 host 和其他容器。

UTS namespace

简单的说,UTS namespace 让容器有自己的 hostname。 默认情况下,容器的 hostname 是它的短ID,可以通过 -h 或 --hostname 参数设置。

技术分享

IPC namespace

IPC namespace 让容器拥有自己的共享内存和信号量(semaphore)来实现进程间通信,而不会与 host 和其他容器的 IPC 混在一起。

PID namespace

我们前面提到过,容器在 host 中以进程的形式运行。例如当前 host 中运行了两个容器:

技术分享

通过 ps axf 可以查看容器进程:

技术分享

所有容器的进程都挂在 dockerd 进程下,同时也可以看到容器自己的子进程。 如果我们进入到某个容器,ps 就只能看到自己的进程了:

技术分享

而且进程的 PID 不同于 host 中对应进程的 PID,容器中 PID=1 的进程当然也不是 host 的 init 进程。也就是说:容器拥有自己独立的一套 PID,这就是 PID namespace 提供的功能。

Network namespace

Network namespace 让容器拥有自己独立的网卡、IP、路由等资源。我们会在后面网络章节详细讨论。

User namespace

User namespace 让容器能够管理自己的用户,host 不能看到容器中创建的用户。

技术分享

在容器中创建了用户 cloudman,但 host 中并不会创建相应的用户。

小结

本章首先通过大量实验学习了容器的各种操作以及容器状态之间如何转换,然后讨论了限制容器使用 CPU、内存和 Block IO 的方法,最后学习了实现容器的底层技术:cgroup 和 namespace。

下面是容器的常用操作命令:

create      创建容器  

run         运行容器  

pause       暂停容器  

unpause     取消暂停继续运行容器  

stop        发送 SIGTERM 停止容器  

kill        发送 SIGKILL 快速停止容器  

start       启动容器  

restart     重启容器  

attach      attach 到容器启动进程的终端  

exec        在容器中启动新进程,通常使用 "-it" 参数  

logs        显示容器启动进程的控制台输出,用 "-f" 持续打印  

rm          从磁盘中删除容器


到这里,我们已经学习完了容器章节。下一节开始讨论容器网络。

技术分享

如何运行容器?-每天5分钟玩转docker容器技术(22)

...学习容器的各种操作,容器各种状态之间如何转换,以及实现容器的底层技术。运行容器dockerrun 是启动容器的方法。在讨论Dockerfile时我们已经学习到,可用三种方式指定容器启动时执行的命令:CMD指令。ENDPOINT指令。在 ... 查看详情

如何运行容器?-每天5分钟玩转docker容器技术(22)

...学习容器的各种操作,容器各种状态之间如何转换,以及实现容器的底层技术。运行容器dockerrun 是启动容器的方法。在讨论Dockerfile时我们已经学习到,可用三种方式指定容器启动时执行的命令:CMD指令。ENDPOINT指令。在 ... 查看详情

每天5分钟玩转容器技术整理目录

原 写在最前面-每天5分钟玩转容器技术(1)容器生态系统-每天5分钟玩转容器技术(2) 容器生态系统(续)-每天5分钟玩转容器技术(3)运行第一个容器-每天5分钟玩转容器技术(4)【视频】运行第一个容器-每天5分钟玩... 查看详情

如何实现跨docker主机存储?-每天5分钟玩转docker容器技术(73)

从业务数据的角度看,容器可以分为两类:无状态(stateless)容器和有状态(stateful)容器。无状态是指容器在运行过程中不需要保存数据,每次访问的结果不依赖上一次访问,比如提供静态页面的web服务器。有状态是指容器需... 查看详情

如何实现跨docker主机存储?-每天5分钟玩转docker容器技术(73)

从业务数据的角度看,容器可以分为两类:无状态(stateless)容器和有状态(stateful)容器。无状态是指容器在运行过程中不需要保存数据,每次访问的结果不依赖上一次访问,比如提供静态页面的web服务器。有状态是指容器需... 查看详情

healthcheck-每天5分钟玩转docker容器技术(142)

...Kubernetes这类容器编排引擎的一个重要特性。自愈的默认实现方式是自动重启发生故障的容器。除此之外,用户还可以利用Liveness和Readiness探测机制设置更精细的健康检查,进而实现如下需求:零停机部署。避免部署无效的镜像。... 查看详情

overlay如何实现跨主机通信?-每天5分钟玩转docker容器技术(52)

...bbox1:可见overlay网络中的容器可以直接通信,同时docker也实现了DNS服务。下面我们讨论一下overlay网络的具体实现:docker会为每个overlay网络创建一个独立的networknamespac 查看详情

如何共享数据?-每天5分钟玩转docker容器技术(41)

...容器与host共享数据我们有两种类型的datavolume,它们均可实现在容器与host之间共享数据,但方式有所区别。对于bindmount是非常明确的:直接将要共享的目录mount到容器。具体请参考前面httpd的例子,不再赘述。dockermanagedvolume就要... 查看详情

如何共享数据?-每天5分钟玩转docker容器技术(41)

...容器与host共享数据我们有两种类型的datavolume,它们均可实现在容器与host之间共享数据,但方式有所区别。对于bindmount是非常明确的:直接将要共享的目录mount到容器。具体请参考前面httpd的例子,不再赘述。dockermanagedvolume就要... 查看详情

swarm如何实现failover?-每天5分钟玩转docker容器技术(98)

故障是在所难免的,容器可能崩溃,DockerHost可能宕机,不过幸运的是,Swarm已经内置了failover策略。创建service的时候,我们没有告诉swarm发生故障时该如何处理,只是说明了我们期望的状态(比如运行3个副本),swarm会尽最大的... 查看详情

readiness探测-每天5分钟玩转docker容器技术(144)

...户通过Liveness探测可以告诉Kubernetes什么时候通过重启容器实现自愈;Readiness探测则是告诉Kubernetes什么时候可以将容器加入到Service负载均衡池中,对外提供服务。Readiness探测的配置语法与Liveness探测完全一样,下面是个例子:这... 查看详情

准备macvlan环境-每天5分钟玩转docker容器技术(54)

...的IP。macvlan本质上是一种网卡虚拟化技术,Docker用macvlan实现容器网络就不奇怪了。macvlan的最大优点是性能极好,相比其他 查看详情

准备macvlan环境-每天5分钟玩转docker容器技术(54)

...的IP。macvlan本质上是一种网卡虚拟化技术,Docker用macvlan实现容器网络就不奇怪了。macvlan的最大优点是性能极好,相比其他 查看详情

overlay如何实现跨主机通信?-每天5分钟玩转docker容器技术(52)

上一节我们在host1中运行了容器bbox1,今天将详细讨论overlay网络跨主机通信的原理。在host2中运行容器bbox2:650)this.width=650;"title="http://7xo6kd.com1.z0.glb.clouddn.com/upload-ueditor-image-20170808-1502161580025040298.png"src="http://7xo6 查看详情

容器常用操作-每天5分钟玩转docker容器技术(25)

前面讨论了如何运行容器,本节学习容器的其他常用操作。stop/start/restart容器通过 dockerstop 可以停止运行的容器。650)this.width=650;"title="http://7xo6kd.com1.z0.glb.clouddn.com/upload-ueditor-image-20170606-1496735894114077525.png"s 查看详情

新书发布《每天5分钟玩转docker容器技术》

...今天终于可以给大家一个交代了。《每天5分钟玩转Docker容器技术》现已在各大书城上架。650)this.width=650;"title="http://7xo6kd.com1.z0.glb.clouddn.com/upload-ueditor-image-20170925-1506345649234050183.png"src="http://7xo6kd 查看详情

容器常用操作-每天5分钟玩转docker容器技术(25)

前面讨论了如何运行容器,本节学习容器的其他常用操作。stop/start/restart容器通过 dockerstop 可以停止运行的容器。容器在dockerhost中实际上是一个进程,dockerstop 命令本质上是向该进程发送一个SIGTERM信号。如果想快速... 查看详情

如何部署calico网络?-每天5分钟玩转docker容器技术(67)

...icy。用户可以动态定义ACL规则,控制进出容器的数据包,实现业务需求。实验环境描述Calic 查看详情