Eli's Blog

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架构
  • 本地/远端

docker_client

4.2 Docker Image镜像

  • 容器的基石
  • 层叠的只读文件系统
  • 联合加载(union mount)

docker_image

镜像:多个镜像层 (Image Layer) 叠加而成的只读文件系统 (UnionFile System)

  • bootfs: 最底层的文件系统,用于系统引导,包含bootloader和kernel,容器启动后会被卸载以节约内存资源
  • rootfs: 位于bootfs之上,为容器的根文件系统
    • 传统模式:系统启动时,内核以“只读”模式挂载rootfs,完整性自检后,再重新挂载为“读写”模式
    • docker:rootfs由内核挂载为“只读”模式,而后通过“联合挂载”技术额外挂载一个“可写”层

4.3 Docker Container 容器

  • 通过镜像启动
  • 启动和执行阶段
  • 写时复制(copy on write)

docker_container

容器:在镜像的基础上,增加了一个读写层 (Top Layer)。运行状态下的容器,由一个可读写的文件系统、隔离的进程空间和进程构成。

4.4 Docker Registry 仓库

  • 公有
  • 私有
  • Docker Hub

docker_structure

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: 合入内核,当前主流