Docker简介
Docker提供了一种在container(容器)中运行程序的方式,来实现程序的隔离和安全。在一台机器上可以同时运行多个container。跟VM(虚拟机)相比,container之间相互独立,但是共享OS、以及必要的bins/librarys,部署速度更快,资源开支更少,也更容易迁移。
Docker engine
Docker engine是一个client-server应用程序,包括如下几个部分:
- server是一个daemon(守护进程),负责创建和管理docker对象
- REST API 提供了与daemon交互的接口
- CLI是 command line interface client,利用REST API通过脚本或者是命令来跟daemon交互。用户与daemon的交互都需要通过client来进行。
daemon管理的docker对象,包括images、containers、networks、data volumes等。
Docker架构
Docker的主要组件
- Docker images:只读的模板,用于创建docker container。Docker image是构建组件。
- Docker registries:image仓库或者分发中心,如Docker Hub,提供public和private权限的存储,可上传和下载images。Docker registery是分发组件。
- Docker container:类似一个directory,包含一个应用程序运行所需的所有内容。container之间都是隔离的、安全的。container是运行组件。
Docker image
Docker image包含多个层(其实就对应了挂载的目录),通过union file systems 将这些层合并到一个image中。多层的好处是,当一个image做了修改,只需要更新相应的层,不需要替换掉整个image,分发和部署更快更简单。
每个image都是起源于一个基础image。在一个叫Dockerfile的文件中储存了build一个image的指令,如:
- 运行一条命令
- 添加一个文件或者目录
- 创建一个环境变量
- 从该image启动一个container时运行的程序
Docker container
当Docker从image启动一个container,会在只读的image之上增加一个读写层(所做的修改都会写到这一层中,不影响image本身)。
通过docker程序或者API,Docker client会通知Docker daemon启动一个container:
$ docker run -i -t ubuntu /bin/bash
运行一个container至少需要指定如下部分:
- container从哪个image来构建,如ubuntu
- 当container启动时,需要运行哪个程序,如/bin/bash
当执行以上指令后,Docker engine会做顺序完成如下工作:
- 检测ubuntu镜像,如果不存在,就从Docker Hub来pull
- 使用image来创建一个新的container
- 分配一个文件系统并挂载一个读写层
- 分配网络接口,用于container同宿主机通信
- 设置一个IP地址
- 执行指定的程序
- 终端打印程序输出
Docker技术基础
Docker使用Go语言开发,利用了若干内核特性:
- Namespaces:通过namespaces技术来提供工作空间的隔离。
- Control groups(cgroups):隔离container使用的资源,如内存、cpu等。
- Union file systems(UnionFS):通过创建层来运行的文件系统。把不同物理位置的目录合并挂载到同一个目录中,按照挂载目录的顺序形成层。可以指定每层的读写权限,一般默认是最上层可读写,下面各层都是只读。
- Container format:Docker组件的封装称为container format。默认container format是libcontainer。