容器
实现一个资源隔离的容器:
- 文件系统:chroot命令切换根目录挂载点
- 网络:在分布式环境下进行通信和定位,需要有独立的IP、端口、路由等,还需要有独立的主机名以便在网络中标识自己
- 通信:有了网络自然需要通信,进程键通信需要隔离开
- 权限:对用户和用户组的隔离实现用户权限的隔离
- 进程:运行在容器中的应用需要有进程号,容器需要有PID进行隔离
一个容器所需要的6项隔离:
namespace | 系统调用参数 | 隔离内容 |
---|
UTC | CLONE_NEWUTC | 主机名和域名 |
IPC | CLONE_NEWIPC | 信号量、消息队列、共享内存 |
PID | CLONE_NEWPID | 进程编号 |
Network | CLONE_NEWNET | 网络设备、网络栈、端口等 |
Mount | CLONE_NEWNS | 挂载点(文件系统) |
User | CLONE_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模块