1. 什么是容器
- 一种虚拟化的方案
- 操作系统级别的虚拟化
- 只能运行相同或相似内核的操作系统
- 依赖Linux内核特性:Namespace和Cgroups(Control Group)
2. 什么是Docker
将应用程序自动部署到容器
Boot2Docker: 本质是一个Linux轻量级VM,用于Windows/macOS系统上使用Docker (开发、测试使用)
3. Docker的使用场景
使用Docker容器开发、测试、部署服务
创建隔离的运行环境
搭建测试环境
构建多用户的平台即服务(PaaS)基础设施
提供软件即服务(SaaS)应用程序
高性能、超大规模的宿主机部署
4. Docker的基本组成
- Docker Client
- Docker Daemon
- Docker Image
- Docker Container
- Docker Registry
Docker的三要素:仓库、镜像、容器
4.1 客户端/守护进程
- C/S架构
- 本地/远端
4.2 Docker Image镜像
- 容器的基石
- 层叠的只读文件系统
- 联合加载(union mount)
镜像:多个镜像层 (Image Layer) 叠加而成的只读文件系统 (UnionFile System)
- bootfs: 最底层的文件系统,用于系统引导,包含bootloader和kernel,容器启动后会被卸载以节约内存资源
- rootfs: 位于bootfs之上,为容器的根文件系统
- 传统模式:系统启动时,内核以“只读”模式挂载rootfs,完整性自检后,再重新挂载为“读写”模式
- docker:rootfs由内核挂载为“只读”模式,而后通过“联合挂载”技术额外挂载一个“可写”层
4.3 Docker Container 容器
- 通过镜像启动
- 启动和执行阶段
- 写时复制(copy on write)
容器:在镜像的基础上,增加了一个读写层 (Top Layer)。运行状态下的容器,由一个可读写的文件系统、隔离的进程空间和进程构成。
4.4 Docker Registry 仓库
- 公有
- 私有
- Docker Hub
5. Docker容器相关技术简介
5.1 依赖的Linux内核特性
- Namespaces 命名空间
- Cgroups(Control Group) 控制组
5.1.1 Namespaces 容器的独立资源
- Mount
- PID
- Net
- IPC
- UTS: Unix Time-Sharing, allow a single system to appear to have different host and domain names to different processes.
- User
5.1.2 CGroups 控制组
- 资源限制:对进程组使用的资源总额进行限制。如设定应用运行时使用内存的上限,一旦超过这个配额就发出OOM(Out of Memory)
- 优先级分配:通过分配cpu时间片数量及硬盘io,带宽大小来控制进程的优先级
- 资源统计:统计系统的资源使用量,如CPU使用量,内存用量等
- 进程控制:可以对进程组执行挂起、恢复等操作
5.2 Docker容器的能力
- 文件系统隔离
- 进程隔离
- 网络隔离
- 资源隔离和分组:使用cgroups将CPU和内存之类的资源,独立分配给每个Docker容器
5.3 LXC (Linux Containers)
基于容器的操作系统级别的虚拟化技术,借助于namesapce的隔离机制和cgroups限额功能,LXC提供了一套统一的API和工具来建立和管理container。
LXC提供一个共享kernel的OS级虚拟化方法,在执行时不用重复加载kernel,且conatiner的kernel与host共享,因此大大加快了container的启动过程,并显著减少了内存消耗。
5.4 分成文件系统
层状文件系统,当进程需要修改文件时,AUFS创建该文件的一个副本。
- aufs: ubuntu, 未合入内核
- devicemapper (dm): centos, 性能差
- overlay: 合入内核,当前主流