Docker 技术简介
Docker 是一个开源的容器化平台,它允许开发者打包应用及其依赖到一个轻量级、可移植的容器中,然后可以在任何支持 Docker 的机器上运行这个容器。Docker 使用 Linux 容器(LXC)技术,但它提供了比传统 LXC 更简单的操作界面。
Containerd 简介
Containerd 是一个容器运行时,它是 Docker 的核心组件之一,但也可以独立于 Docker 使用。Containerd 负责容器的生命周期管理,包括镜像管理、容器的创建、执行、暂停、停止等。
使用 Cgroups 对资源进行限制
在 Linux 系统中,cgroups
(控制组)是一种内核功能,用来限制、记录和隔离进程组所使用的物理资源(如 CPU、内存、磁盘 I/O 等)。Docker 和 Containerd 使用 cgroups 来限制和隔离容器的资源使用。
CPU 资源限制
- CPU 限制:可以设置容器可以使用的 CPU 核心数或者 CPU 使用的百分比。例如,可以限制一个容器只能使用 50% 的 CPU 资源。
- CPU 亲和性:可以指定容器运行在特定的 CPU 或核心上。
内存资源限制
- 内存限制:可以设置容器可以使用的最大内存量。如果容器尝试使用超过这个限制的内存,根据配置,可能会被内核杀死。
- 内存交换区限制:可以设置容器使用的交换区大小。这可以防止容器使用过多的物理内存。
示例:Docker 使用 cgroups
在 Docker 中,你可以在运行容器时使用 --memory
和 --cpus
参数来限制内存和 CPU 的使用。例如:
docker run -it --memory="1g" --cpus="1.5" ubuntu /bin/bash
这条命令启动了一个 Ubuntu 容器,限制使用最多 1GB 的内存和 1.5 个 CPU 核心。
示例:Containerd 使用 cgroups
在 Containerd 中,资源限制通常在容器的配置文件中指定。例如,使用 Containerd 的 Go 客户端库设置资源限制:
import (
"github.com/containerd/containerd/containers"
)
// 创建容器时的资源限制配置
resources := &specs.LinuxResources{
Memory: &specs.LinuxMemory{
Limit: pointer.Int64Ptr(1024 * 1024 * 1024), // 1GB
},
CPU: &specs.LinuxCPU{
Shares: pointer.Uint64Ptr(1024),
Quotas: pointer.Int64Ptr(100000),
Period: pointer.Uint64Ptr(100000),
},
}
container, err := client.NewContainer(
ctx,
"example",
containerd.WithNewSpec(oci.WithImageConfig(image), withResources(resources)),
)
这段代码设置了容器的内存限制为 1GB,CPU 使用限制为 1 核心。
总之,Docker 和 Containerd 都使用 Linux 的 cgroups 功能来限制和管理容器的资源使用,确保系统资源的合理分配和容器之间的隔离。
gVisor 是一个由 Google 开发的沙箱容器运行时,它提供了一个隔离的环境来运行容器应用。与传统的容器运行时(如 Docker 和 runc)不同,gVisor 提供了一个用户空间内核,用于拦截和处理容器内的系统调用,从而增强了安全性。gVisor 的设计目的是在提供较强隔离的同时,尽量减少对性能的影响。
gVisor 中的资源限制
gVisor 使用了类似于传统 Linux 容器的机制来限制资源,主要依赖于 cgroups 和其他 Linux 内核功能。资源限制的目的是防止一个容器消耗过多的系统资源,从而影响到运行在同一物理或虚拟机上的其他容器或应用。
CPU 和内存限制
gVisor 支持通过 cgroups 对 CPU 和内存等资源进行限制。这些限制可以在启动容器时通过配置文件或命令行参数指定。
- CPU 限制:可以通过设置 CPU 的使用配额(CFS quota)和周期(CFS period),或者限制 CPU 的核心数(使用 cpuset 子系统)来控制 CPU 使用。
- 内存限制:可以设置容器可以使用的最大内存量。如果容器的内存使用超过了设定的限制,根据配置,可能会触发 OOM(Out of Memory)处理。
网络和磁盘 I/O
虽然 gVisor 提供了对网络和磁盘 I/O 的基本支持,但它的主要焦点是提高隔离性,因此对这些资源的限制可能不如传统容器运行时那么细致或高效。
- 网络限制:可以通过 cgroups 的网络子系统来限制网络带宽或包的处理速率。
- 磁盘 I/O 限制:可以通过 blkio 子系统来限制磁盘 I/O 的速率,包括读写速率的限制。
配置示例
在使用 Docker 运行 gVisor 容器时,可以通过 Docker 的标准资源限制参数来设置这些限制。例如,使用 docker run
命令:
docker run --runtime=runsc --memory="1g" --cpus="1.5" myimage
这里,--runtime=runsc
指定使用 gVisor 的 runsc
运行时。--memory
和 --cpus
参数分别限制内存和 CPU 的使用。
总结
gVisor 通过集成 Linux 的核心功能,如 cgroups,提供了对容器资源的基本限制。虽然 gVisor 的主要优势是提高安全性,但它也支持常见的资源限制配置,帮助管理员控制和管理容器应用的资源使用。这些限制有助于保护宿主机不被单个容器过度使用资源而影响其他进程。