Docker是什么
Docker是由dotCloud开源,使⽤Go开发,基于LXC(Linux Containers)技术搭建的软件容器平台。可以让开发者打包他们的应⽤以及依赖包到⼀个轻量级、可移植的容器中,然后发布到任何流⾏的Linux服务器。
容器 VS 虚拟机
- 容器:应⽤层抽象,⽤于将代码和依赖资源打包在⼀起。共享操作系统内核,占⽤的空间MB级,启动时间秒级。
- 虚拟机 (VM): 物理硬件层抽象,⽤于将⼀台服务器变成多台服务器。 包含⼀整套操作系统,占⽤空间GB级,启动时间分钟级。

Docker优势
- ⼀致的运⾏环境
- 更快速的启动时间
- 隔离性
- 弹性伸缩,快速扩展
- 迁移⽅便
- 持续交付和部署

Docker基本概念
- 镜像(Image):创建容器的模板
- 容器(Container):运⾏实例
- 仓库(Repository):存放镜像

仓库(Repository)
- Docker Registry:集中的存储、分发镜像的服务;
- Repository:存放同⼀类镜像;
- Tag:对应镜像的不同版本;
- 本地搭建私有 Docker Registry

Docker镜像
⼀个典型的 Linux 系统运⾏起来,⾄少需要两个⽂件系统:
- bootfs:bootloader+kernel
- rootfs:⽬录结构+⼆进制⽂件+库⽂件
Docker镜像相当于rootfs,公⽤宿主机的bootfs。

Docker镜像底层依赖于联合⽂件系统(UnionFS)。
UnionFS通过联合加载把多层⽂件系统叠加起来,挂载到同⼀个虚拟⽂件系统下。为不同⽬录设定'readonly', 'readwrite' 和 'whiteout�able' 权限,保护底层的⽂件和⽬录。

镜像⼀层层构建,前⼀层是后⼀层的基础。每⼀层构建完就不会再发⽣改变,后⼀层上的任何改变只发⽣在⾃⼰这⼀层。通过docker build可以看出。
Docker镜像加载
从Image启动Container时,Docker会先加载其⽗Image直到Base Image,⽤户的进程运⾏在writeable的layer中。
如果⽤户要修改Image层上的⽂件,通过写时复制将⽂件拷⻉到Container层,修改后驻留在上层,并屏蔽原有的下层⽂件。

镜像分层优势
- 节省存储空间:不同镜像公⽤相同的层,拉取镜像时不需要重复下载;
- 快速部署:如果要部署多个container,base image可以避免多次拷⻉;
- 节约内存:因为多个container共享base image, 以及OS的disk缓存机制,多个container中的进程命中缓存内容的⼏率⼤⼤增加。
Docker容器
镜像是静态的定义,容器是镜像运⾏时的实体。容器可以被创建、启动、停⽌、删除、暂停等。
容器的实质是进程,Docker基于namespace和CGroup技术实现进程之间的隔离。

namespace
namespace 是 Linux 内核⽤来隔离内核资源的⽅式。处于不同 namespace 的进程拥有独⽴的全局系统资源。
Linux 提供了操作 namespace的函数:
- clone():创建新进程的同时创建 namespace
- setns():将当前进程加⼊到已有 namespace
- unshare():和当前所在的namespace分离,并加⼊到⼀个新的namespace

CGroup
CGroup(Control Groups)是 Linux 内核提供的⼀种可以限制、记录、隔离进程组(process groups) 所使⽤的物⼒资源 (如 cpu memory i/o 等等) 的机制。
- ⼦系统(subsystem):资源控制器;
- 控制组(control group):控制组指明了资源的配额限制;
- 层级(hierarchy):控制组有层级关系;

namespace CGroup
namespace 是为了隔离进程组之间的资源,⽽ CGroup 是为了对⼀组进程进⾏统⼀的资源监控和限制。

Docker容器持久化
- 数据卷(Volume)
- 绑定宿主⽬录(bind mount)
- tmpfs

Docker⽹络模式
- bridge
- container
- host
- none
- overlay

Docker实践
- 镜像制作、推送、拉取
- 容器启动
- 数据持久化
- 容器编排:Docker三剑客
Docker三剑客
- Docker Compose:⽤来定义和运⾏⼀个或多个容器应⽤的⼯具;
- Docker Machine:Docker安装管理⼯具,可以在多平台上快速安装 Docker 环境;
- Docker Swarm:原⽣集群管理和编排⼯具。

Docker容器编排

CI/CD

参考
https://www.runoob.com/docker/docker-tutorial.html
http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html
https://zhuanlan.zhihu.com/p/54512286