docker核心技术笔记

namespace

命名空间(namespaces)是 Linux 为我们提供的用于分离进程树、网络接口、挂载点以及进程间通信等资源的方法。

pid namespace

不同使用者的程式就是透過 pid 命名空間隔離開的,且不同命名空間中可以有相同 pid

net namespace

網路隔離是透過 net 命名空間實作的, 每個 net 命名空間有獨立的網路設備, IP 位址, 路由表, /proc/net 目錄。這樣每個容器的網路就能隔離開來。Docker 預設採用 veth 的方式,將容器中的虛擬網卡同 host 上的一個 Docker 橋接器 docker0 連接在一起。

ipc namespace

容器中程式互動還是採用了 Linux 常見的程式間互動方法 (interprocess communication - IPC), 包括信號量、消息隊列和共享記憶體等。然而同 VM 不同的是,容器的程式間互動實際上還是 host 上具有相同 pid 命名空間中的程式間互動,因此需要在 IPC 資源申請時加入命名空間訊息,每個 IPC 資源有一個唯一的 32 位 id。

mnt namespace

類似 chroot,將一個程式放到一個特定的目錄執行。mnt 命名空間允許不同命名空間的程式看到的檔案結構不同,這樣每個命名空間 中的程式所看到的檔案目錄就被隔離開了。同 chroot 不同,每個命名空間中的容器在 /proc/mounts 的訊息只包含所在命名空間的 mount point。

uts namespace

UTS(“UNIX Time-sharing System”) 命名空間允許每個容器擁有獨立的 hostname 和 domain name, 使其在網路上可以被視作一個獨立的節點而非主機上的一個程式

user namespace

每個容器可以有不同的使用者和組 id, 也就是說可以在容器內用容器內部的使用者執行程式而非主機上的使用者。

参考: 来自Michael Crosby的Creating containers

control groups

简介

Linux cgroups 的全称是 Linux Control Groups,它是 Linux 内核的特性,主要作用是限制、记录和隔离进程组(process groups)使用的物理资源(cpu、memory、IO 等)。

主要功能

cgroups 从设计之初使命就很明确,为进程提供资源控制,它主要的功能包括:

  • 资源限制:限制进程使用的资源上限,比如最大内存、文件系统缓存使用限制
  • 优先级控制:不同的组可以有不同的优先级,比如 CPU 使用和磁盘 IO 吞吐
  • 审计:计算 group 的资源使用情况,可以用来计费
  • 控制:挂起一组进程,或者重启一组进程

目前 cgroups 已经成为很多技术的基础,比如 LXC、docker、systemd等。

核心概念

cgroups 是用来对进程进行资源管理的,因此 cgroup 需要考虑如何抽象这两种概念:进程和资源,同时如何组织自己的结构。,几个重点概念

  • task:任务,对应于系统中运行的一个实体,一般是指进程
  • subsystem:子系统,具体的资源控制器(resource class 或者 resource controller),控制某个特定的资源使用。比如 CPU 子系统可以控制 CPU 时间,memory 子系统可以控制内存使用量
  • cgroup:控制组,一组任务和子系统的关联关系,表示对这些任务进行怎样的资源管理策略
  • hierarchy:层级树,一系列 cgroup 组成的树形结构。每个节点都是一个 cgroup,cgroup 可以有多个子节点,子节点默认会继承父节点的属性。系统中可以有多个 hierarchy

子资源系统

Resource Classes or SubSystem
目前有下面这些资源子系统:

  • Block IO(blkio):限制块设备(磁盘、SSD、USB 等)的 IO 速率
  • CPU Set(cpuset):限制任务能运行在哪些 CPU 核上CPU
  • Accounting(cpuacct):生成 cgroup 中任务使用 CPU 的报告
  • CPU (CPU):限制调度器分配的 CPU 时间
  • Devices (devices):允许或者拒绝 cgroup 中任务对设备的访问
  • Freezer (freezer):挂起或者重启 cgroup 中的任务
  • Memory (memory):限制 cgroup 中任务使用内存的量,并生成任务当前内存的使用情况报告
  • Network Classifier(net_cls):为 cgroup 中的报文设置上特定的 classid 标志,这样 tc 等工具就能根据标记对网络进行配置
  • Network Priority (net_prio):对每个网络接口设置报文的优先级
  • perf_event:识别任务的 cgroup 成员,可以用来做性能分析

如何使用 cgroups

  • 使用 cgroups 提供的虚拟文件系统,直接通过创建、读写和删除目录、文件来控制 cgroups使用命令行工具
  • libcgroup 包提供的 cgcreate、cgexec、cgclassify 命令使用
  • rules engine daemon 提供的配置文件当然,
    systemd、lxc、docker 这些封装了 cgroups 的软件也能让你通过它们定义的接口控制 cgroups 的内容

union filesystem

Union 檔案系統

Union檔案系统是一種分層、輕量級並且高效能的檔案系統,它支援對檔案系統的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬檔案系統下 (unite several directories into a single virtual filesystem)。

Docker 中使用的 AUFS(AnotherUnionFS)就是一種 Union FS。 AUFS 支援為每一個成員目錄(類似 Git 的分支)設定唯讀(readonly)、讀寫(readwrite)和寫出(whiteout-able)權限, 同時 AUFS 裡有一個類似分層的概念, 對唯讀權限的分支可以邏輯上進行增量地修改 (不影響唯讀部分的)。

Docker 目前支援的 Union 檔案系統種類包括 AUFS, btrfs, vfs 和 DeviceMapper。

Union 檔案系統是 Docker 映像檔的基礎。映像檔可以透過分層來進行繼承,基於基礎映像檔(沒有父映像檔),可以制作各種具體的應用映像檔。

另外,不同 Docker 容器就可以共享一些基礎的檔案系統層,同時再加上自己獨有的改動層,大大提高了儲存的效率。

-------------the end-------------