手动实现一个容器

容器

实现一个资源隔离的容器:

  1. 文件系统:chroot命令切换根目录挂载点
  2. 网络:在分布式环境下进行通信和定位,需要有独立的IP、端口、路由等,还需要有独立的主机名以便在网络中标识自己
  3. 通信:有了网络自然需要通信,进程键通信需要隔离开
  4. 权限:对用户和用户组的隔离实现用户权限的隔离
  5. 进程:运行在容器中的应用需要有进程号,容器需要有PID进行隔离

一个容器所需要的6项隔离:

namespace系统调用参数隔离内容
UTCCLONE_NEWUTC主机名和域名
IPCCLONE_NEWIPC信号量、消息队列、共享内存
PIDCLONE_NEWPID进程编号
NetworkCLONE_NEWNET网络设备、网络栈、端口等
MountCLONE_NEWNS挂载点(文件系统)
UserCLONE_NEWUSER用户和用户组

Linux内核实现namespace的目的:实现轻量级虚拟化(容器)服务

镜像

Docker 通过distribution、registry、layer、image、reference等模块实现了Docker镜像的管理。在Docker1.10以前的版本中这一功能通过graph组件来完成。

  • distribution:负责与Docker Registry交互,上传下载镜像以及存储与v2 registry有关的元数据
  • registry:负责与Docker Registry有关的身份验证镜像查找镜像验证以及管理registry mirror等交互操作
  • image:负责与镜像元数据有关的存储、查找、镜像层的索引、查找以及镜像tar包有关的导入、导出等操作
  • reference:负责存储本地所有镜像的repository和tag名,并维护与镜像ID之间的映射关系
  • layer:负责与镜像层和容器层元数据有关的增删改查,并负责将镜像层的增删改查操作映射到实际存储镜像层文件系统的graphdriver模块
上次修改: 14 April 2020