容器

cgroup 概述

cgroup 对于现代服务器和云计算环境至关重要,特别是对于容器技术(如 DockerKubernetes)来说,它是实现资源隔离的底层基础

  • 资源隔离:确保一个应用或服务不会耗尽所有系统资源,影响到其他应用或系统的稳定性。例如,限制一个后台计算任务只能使用 20% 的 CPU,避免拖慢前端 Web 服务。
  • 资源分配:根据不同的优先级为不同的服务分配资源。
  • 资源计量:准确统计某个服务使用了多少资源,方便计费或性能分析。

cgroup 的工作方式

cgroup 通过一个虚拟文件系统(通常挂载在 /sys/fs/cgroup)暴露给用户空间。用户或程序通过在这个文件系统中创建目录(即创建 cgroup)和写入文件(即设置限制参数)来管理和控制进程。

总而言之,cgroup 是 Linux 实现进程资源管理和隔离的核心机制

运行时 和 容器运行时

运行时(runtime)

  • runtime 就是一个语言实现的基础, 就好像一个人类最基本的心跳, 呼吸技能一样. runtime 和 库 的区别, 类似于 [人类本身] 与 [人类后天增加的装备] 的区别。
  • runtime 一般和 compile time 相对,他们在时间上,分别代表运行期和编译期两个时期;
  • 在代码上,runtime 代表程序能正常运行所必需的基础代码。对于解释型语言,它的解释器就是 runtime;对于编译型语言,它的 runtime 可以理解为标准库和系统库中不可或缺的那一部分。
    • 比如 c 语言对 glibc,python 对 cpython。但有些语言的标准库的作用除了提供 runtime 之外还提供常用方法的官方实现,并非少了它们整个程序就运行不了了。对于这些并非必要的部分,一般不把它们当做语言的 runtime。
  • 总之, runtime 的意思大概就是 「运行期所必需的东西」

容器运行时(container runtime)

参考文档:https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/

容器运行时是负责运行容器的软件。

  • Kubernetes 支持容器运行时,例如 containerd、CRI-O 以及 Kubernetes CRI(容器运行时接口)的任何其他实现。
  • Docker 确被弃用,大家应该开始考虑使用 CRI 运行时,例如 containerd 与 CRI-O。

常见容器运行时:

  • containerd

    • 如果大家只是想从 Docker 迁移出来,那么 containerd 就是最好的选择。因为它实际上就是在 Docker 之内起效,可以完成所有“运行时”工作,如上图所示。更重要的是,它提供的 CRI 其实 100% 就是由 Docker 所提供。

    • containerd 与 Docker 相兼容,二者共享相同的核心组件。

    • https://github.com/containerd/containerd/
  • CRI-O

    • 如果你主要使用 Kubernetes 的最低功能选项,CRI-O 可能更为适合。
  • runc

  • lxc

  • rkt

Docker 概述

  • docker和kvm最大的区别是docker是和系统共用同一个内核,而kvm是各有各的内核,所以docker的性能更好
  • runtime是真正运行容器的地方
  • 每个容器都对应一个containerd-shim的进程
  • docker默认使用的是联合文件系统(overlay2),其特性为可以将多个设备挂载到同一个dir中,且可以设置各自不同的权限
  • du -sh /var/lib/docker/overlay2/ ,镜像容器存放的目录

优点

  • 快速部署:短时间内可以部署成百上千个应用,更快速的交付到线上
  • 高效虚拟化:不需要额外 hypervisor 支持,基于Linux内核实现应用虚拟化,相比虚拟机大幅提高性能和效率
  • 节省开支:提高服务器利用率,降低IT支出
  • 简化配置:将运行环境打包保存至容器,利用时直接启用即可
  • 环境统一:将开发、测试、生成的应用运行环境进行标准化和统一,减少环境不一样带来的各种问题
  • 快速迁移和扩展:可实现跨平台运行在物理机、虚拟机、公有云等环境,良好的兼容性可以方便将应用从A宿主机迁移到B主机,甚至是A平台迁移到B平台
  • 更好的实现面向服务的架构,推荐一个容器只运行一个应用,实现分布的应用模型,可以方便的进行横向扩展,符合开发中高内聚、低耦合的要求,减少不同服务之间的相互影响

缺点

  • 多个容器公用宿主机的内核,各应用间的隔离性不如虚拟机彻底

组成

docker host

  • 一个物理机或虚拟机,用于运行docker服务进程和容器,也称为宿主机、node节点

docker server

  • docker守护进程,运行docker容器

docker client

  • 客户端使用 docker 命令或其他工具调用 docker API

docker images

  • 镜像可以理解为创建实例使用的模板,本质上就是一些程序文件的集合

docker registry

  • 保存镜像的仓库
    • 官方仓库:https://hub.docker.com/
    • 私有仓库:harbor

docker container

  • 容器是从镜像生成对外提供服务的一个或一组服务,其本质就是将镜像中的程序启动后生成的进程