Docker要求64bit系统(x86 or arm)
Docker要求Linux内核:3.10+

Docker简介

Docker:Go 实现,对进程进行封装隔离,操作系统层面的虚拟化技术。
Docker虚拟技术:容器内的应用进程直接运行在宿主的内核, 容器没有自己的内核,也没有虚拟硬件资源。
传统虚拟技术:Hypervisor: 虚拟一套硬件—>运行一个操作系统—>运行应用进程

Dcoker & VM Compare

Docker & VM Compare

Docker基本概念

Engine

Docker Engine是Docker的主程序,主要包含Docker Client和Docker Server,可以创建Docker镜像并运行Docker容器。Docker Engine里最主要的命令是 Docker Cli(docker) 和 Docker Daemon(dockerd)

Image

  • Docker镜像(Image),特殊的文件系统, 提供容器运行时所需的程序、库、资源、配置文件等外, 还包括运行时的一些配置文件(匿名卷、环境变量、用户);镜像不包含任何动态数据,其内容构建好后不会发生变化。

  • 分层存储,Docker Image采用分层存储架构,其实体由多层文件系统联合组成。

  • 相关技术介绍:

Container

  • Docker容器:镜像运行的实体(类&类的实例),其实质是进程——运行在自己独立的命名空间Namespace,拥有自己的root文件系统,网络配置,进程空间,用户空间等;该进程运行在一个与宿主机环境隔离的空间内,不受宿主影响。

  • 容器存储层:容器以镜像为基础,在其上创建的一个为容器运行时进行读写而准备的存储层。

  • 容器生命周期:容器消亡,容器存储层也消亡;故容器存储层要求保持无状态化——即在其上不存储任何数据。

  • 数据卷生命周期:独立于容器,不会随容器消亡而消亡;推荐文件写入使用数据卷或绑定宿主机目录,这些位置的读写会跳过容器存储层。

Repository

  • Docker Registry

    Docker Registry:集中存储,分发镜像的服务。 一个Docker Registry可包含多个仓库(Repository),一个Repository可包含多个标签(Tag),每个标签对应一个镜像。

    仓库命名:<用户名>/<软件名>——boyzhe/ubuntu,boyzhe——Docker Registry用户名,ubuntu——软件名

    镜像命名:<仓库名>:<标签>,指定哪个软件哪个版本的镜像,如果Tag未给出则表示latest(ubuntu:14.04 | ubuntu:16.04 | ubuntu:latest)

  • Docker Registry 公开服务

    Docker Hub
    CoreOS Quary.io
    Google Container
    阿里云加速器

  • Docker Registry 私有服务

    Docker Registry
    VMWare Harbor

Docker核心元件

Linux核心

  • Namespace - 隔离不同Container的执行空间
  • Cgroup - 分配硬件资源
  • AUFS(chroot) - 建立不同Container的档案系统
  • SELinux - 确保Container网络安全
  • Netlink - 确保Container间的进程通信
  • Netfilter - 网络防火墙封包过滤
  • AppArmor - 保护Container的网络及执行安全
  • Linux Bridge - 让不同主机上的不同Container通信

Docker核心

  • Docker Client - 调用Docker Daemon(运行在本机或其他客户端)
  • Docker Daemon - Docker守护进程,执行Docker功能(本机)
  • Libcontainer - 和Linux核心通信的library(本机)
  • Docker image - 建立容器的镜像库(本机或云端)

Docker+Linux核心系统架构图

Docker+Linux核心系统架构图

Docker执行

Docker执行过程

  1. 安装了Docker的Linux及硬件
  2. 执行Docker Client, 呼叫Docker Daemon(unix:///var/run/docker.sock)
  3. Docker Daemon响应Client, 通过Libcontainer要求Linu核心建立Container
  4. Linux核心响应请求,启动核心namespace建立独立空间(pid, network, IPC, UTS, mount等);Daemon根据client参义分配CPU,记忆体或磁盘IO等。注:此时Container没有任何东西
  5. Daemon检查本机现有镜像列表,看是否有符合要求的本地镜下载使用过
  6. 如果step-5有,Daemon则直接载入本地镜像到step-4的建空Container,至此Container启动完成
  7. 如果step-5没有,Daemon则到Docker Registry下载Client参数要求的Image
  8. 填入step-7下载的Image到step-4建立的空Container,Container启动完成

从以上流程可知,Docker Container执行的调度方式就是Client的参数;事实上,执行Docker时的参数就是决定Linux核心建立Namespace以及设定网络,存储的方法。

*注*:Docker Client和另一台主机的Daemon连接可以用https取代unix, 但十分危险,要确保安全性后才可以这样做!

Docker执行过程图

Docker执行过程图

See Also

Thanks to the authors 🙂