Docker学习
一、什么是Docker?
Docker是一个用于开发,发布和运行应用程序的开放平台,Docker也是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。Docker能够将应用程序与基础架构分开,从而可以快速交付软件。借助Docker,可以与管理应用程序相同的方式来管理基础架构。通过利用Docker的方法来快速交付,测试和部署代码,可以大大减少编写代码和在生产环境中运行代码之间的延迟。在开发者笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、 bare metal、OpenStack 集群和其他的基础应用平台。
二、Docker应用场景
- web应用的自动化打包和发布
- 自动化测试和持续集成、发布
- 在服务型环境中部署和调整数据库或其他的后台应用
- 从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境
- 在同一硬件上运行更多工作负载
三、Docker与虚拟机
虚拟机体系结构图
server
– 真实电脑Host OS
– 真实电脑的操作系统,例如:Windows,LinuxHypervisor
– 虚拟机平台,模拟硬件,如VMWare,VirtualBoxGuest OS
– 虚拟机平台上安装的操作系统,例如CentOS LinuxApp
– 虚拟机操作系统上的应用,例如mysql,elasticsearch
Docker体系结构图
server
– 表示真实电脑Host OS
– 真实电脑的操作系统,例如:Windows,LinuxDocker Engine
– 新一代虚拟化技术,不需要包含单独的操作系统App
– 所有的应用程序现在都作为Docker容器运行
Docker与虚拟机的对比
项目 | Docker | 虚拟机 |
---|---|---|
启动时间 | 秒级 | 分钟级 |
镜像大小 | 通常以M为单位 | 以G为单位 |
资源占用 | 小,轻量级 | 大,重量级 |
安全性 | 较差 | 较好 |
配置 | 快速,基本上是一键配置 | 配置时间长 |
性能 | 接近原生态 | 弱于原生态 |
系统支持数量 | 单机支持上千个 | 一般不多于几十个 |
操作系统 | 在性能上有优势,可以轻易的运行多个操作系统 | 可以安装任何系统,但是性能不及容器 |
原理 | 和宿主机共享内核,所有容器运行在容器引擎之上,没有Hypervisor层开销,容器并非一个完整的操作系统,所有容器共享操作系统,在进程级进行隔离 | 建立在虚拟的硬件之上,需要Hypervisor层支持,提供指令级的虚拟,具备一个完整的操作系统 |
资源管理 | 弹性资源分配:资源可以在没有关闭容器的情况下添加,数据卷也无需重新分配大小 | 虚拟机需要重启,虚拟机里边的操作系统需要处理新加入的资源,如磁盘等,都需要重新分区 |
远程管理 | 根据操作系统的不同,可以通过shell或者远程桌面进行 | 远程控制由虚拟化平台提供,可以在虚拟机启动之前连接 |
优点 | 高效、集中。一个硬件节点可以运行数以百计的的容器,非常节省资源。内核由提供者升级,服务由服务提供者管理 | 对操作系统具有绝对权限,对系统版本和系统升级具有完全的管理权限。具有一整套的的资源:CPU、RAM 和磁盘。每一个虚拟机就像一个真实的物理机一样,可以实现不同的操作系统运行在同一物理节点上。 |
缺点 | 对内核没有控制权限,只有容器的提供者具备升级权限。只有一个内核运行在物理节点上,几乎不能实现不同的操作系统混合。容器提供者一般仅提供少数的几个操作系统 | 每一台虚拟机都具有更大的负载,耗费更多的资源,用户需要全权维护和管理。一台物理机上能够运行的虚拟机非常有限 |
四、Docker架构
docker client
: 即 docker 命令行工具docker host
: 宿主机,docker daemon 的运行环境服务器docker daemon
: docker 的守护进程,docker client 通过命令行与 docker daemon 交互container
: 容器,最小型的一个操作系统环境,可以对各种服务以及应用容器化image
: 镜像,可以理解为一个容器的模板配置,通过一个镜像可以启动多个容器registry
: 镜像仓库,存储大量镜像,可以从镜像仓库拉取和推送镜像
五、docker run运行流程
六、分层原理及联合文件系统
docker在远程仓库拉取镜像时是采用分层下载进行的,docker其实所采用的是联合文件系统,联合文件系统是通过创建图层进行操作的文件系统,使其非常轻便且快速。Docker Engine使用UnionFS为容器提供构建模块。Docker Engine可以使用多个UnionFS变体,包括AUFS,btrfs,vfs和DeviceMapper
docker的分层原理: docker中的镜像绝大部分都是在 base 镜像的基础上去进行创建叠加的,也就是说docker是通过扩展现有镜像,从而创建新的镜像。
一个docker镜像由多个可读的镜像层组成,然后运行的容器会在这个docker的镜像上面多加一层可写的容器层,任何的对文件的更改都只存在此容器层。因此任何对容器的操作均不会影响到 base 镜像。如果需要获取某个文件,那么容器层会从上到下,去下一层的镜像层去获取文件,如果该层文件不存在,那么就会去下一镜像层去寻找,直到最后一层。而任何对于文件的操作都会记录在容器层,例如说修改文件,容器层会把在镜像层找到的文件拷贝到容器层然后进行修改,删除文件则会在容器层内记录删除文件的记录。
当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作容器层,容器层之下的都叫镜像层。所有对容器的改动,无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。镜像层数量可能会很多,所有镜像层会联合在一起组成一个统一的文件系统,即联合文件系统。
- 添加文件:在容器中创建文件时,新文件被添加到容器层中。
- 读取文件:在容器中读取某个文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后打开并读入内存。
- 修改文件:在容器中修改已存在的文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后修改之。
- 删除文件:在容器中删除文件时,Docker 也是从上往下依次在镜像层中查找此文件。找到后,会在容器层中记录下此删除操作。
优点 :
- 基本上每个软件都是基于某个镜像去运行的,因此一旦某个底层环境出了问题,就不需要去修改全部基于该镜像的软件的镜像,只需要修改底层环境的镜像
- 共享资源,其他相同环境的软件镜像都共同去享用同一个环境镜像,而不需要每个软件镜像要去创建一个底层环境