namespace
- mount(隔离文件系统,只能查看容器镜像提供的文件系统)
- uts(隔离hostname)
- pid(保证容器init进程为1)
- network(隔离网络)
- user(uid gid容器到宿主机的映射)
- ipc(进程间通信,比如信号量)
- cgroup(资源限制)
unshare
容器的namespace实现都是通过unshare系统调用实现
unshare --mount-proc --pid --fork /bin/bash
cgroup
- 两种驱动
- systemd cgroup driver(更改cgroup通过systemd接口实现,不能直接对cgroup文件进行写操作)
- SYSTEMD架构图
- cgroupfs cgroup driver(将资源限制定义写入cgroup文件即可)
- systemd cgroup driver(更改cgroup通过systemd接口实现,不能直接对cgroup文件进行写操作)
- 容器中常用cgroup
- cpu cpuset cpuacct
- memory
- device
- freezer
- blkio
- pid
- 不常用cgroup(docker)
- net_cls
- net_prio
- hugetlb
- perf_event
- rdma
docker image
- 基于联合文件系统
- 不同的层可以被其他镜像复用
- 容器的可写层可以做成镜像新的一层
以overlay为例子
megedir | 整合lower层和upper读写层显示出来的视图 |
---|---|
wordir || upper | 容器读写层,wordir对upper层写入,先写入workdir再移入upper层 |
lower | 镜像层 |
文件操作
- 读:如果upper层没有副本,数据都从lower读上来
- 写:容器创建出来时,upper层都是空的,只有对文件进行写操作时,才会从lower层拷贝文件上来,对副本进行操作
- 删:删操作不影响lower层,删除操作通过对文件进行标记,使文件无法显示。有两种方式,whiteout和设置目录的 xattr“trusted.overlay.opaque”=y
参考