namespace

  1. mount(隔离文件系统,只能查看容器镜像提供的文件系统)
  2. uts(隔离hostname)
  3. pid(保证容器init进程为1)
  4. network(隔离网络)
  5. user(uid gid容器到宿主机的映射)
  6. ipc(进程间通信,比如信号量)
  7. cgroup(资源限制)

unshare

容器的namespace实现都是通过unshare系统调用实现

unshare --mount-proc --pid --fork /bin/bash

cgroup

  • 两种驱动
    • systemd cgroup driver(更改cgroup通过systemd接口实现,不能直接对cgroup文件进行写操作)
      • SYSTEMD架构图
      • linux容器 - 图1
    • cgroupfs cgroup driver(将资源限制定义写入cgroup文件即可)
  • 容器中常用cgroup
    • cpu cpuset cpuacct
    • memory
    • device
    • freezer
    • blkio
    • pid
  • 不常用cgroup(docker)
    • net_cls
    • net_prio
    • hugetlb
    • perf_event
    • rdma

docker image

  • 基于联合文件系统
  • 不同的层可以被其他镜像复用
  • 容器的可写层可以做成镜像新的一层
  • image.png

以overlay为例子

megedir 整合lower层和upper读写层显示出来的视图
wordir || upper 容器读写层,wordir对upper层写入,先写入workdir再移入upper层
lower 镜像层

文件操作

  • 读:如果upper层没有副本,数据都从lower读上来
  • 写:容器创建出来时,upper层都是空的,只有对文件进行写操作时,才会从lower层拷贝文件上来,对副本进行操作
  • 删:删操作不影响lower层,删除操作通过对文件进行标记,使文件无法显示。有两种方式,whiteout和设置目录的 xattr“trusted.overlay.opaque”=y

参考

man7.org/unshare