目录
一:什么是 Docker
Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 OverlayFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。
由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。
Docker早期版本实现是基于 LXC,从 0.7 版本以后开始去除 LXC,转而使用自行开发的libcontainer,从 1.11 版本开始,则进一步演进为使用 runC 和 containerd。
Docker的理念是将应用及依赖包打包到一个可移植的容器中,可发布到任意Linux发行版Docker引擎上。使用沙箱机制运行程序。程序之间相互隔离。
Docker的容器设计原则:一个容器一个服务,容器之间相互隔离
二:为什么选择Docker
2.1:启动速度快
Docker秒级启动,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。
虚拟机分钟级启动
2.2:轻量级
Docker镜像大小通常以M为单位,虚拟机以G为单位(以centos系统为例,docker镜像200M而虚拟机需要好几个G)
容器资源占用小,要比虚拟机部署更快速。
2.3:更高效利用系统资源
容器共享主机内核,系统级虚拟化,占用资源少,没有Hypervisor层开销,容器性能基本接近物理主机;
虚拟机需要Hypervisor层支持,虚拟化一些设备,具备完整的GuestOS,虚拟化开销大,因而降低性能,没有容器性能好。
2.4:安全性高
由于共享宿主机内核, 只是进程级隔离,因此隔离性和稳定性不如虚拟机,容器具有一定权限访问宿主机内核,存在一定安全隐患。还有docker防火墙的问题
2.5:使用门槛低
虚拟机基于硬件的完全虚拟化,需要硬件CPU虚拟化技术支持;
容器共享宿主机内核,可运行在主流的Linux发行版,不用考虑CPU是否支持虚拟化技术。
2.6:一致的运行环境,更轻松的迁移
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现「这段代码在我机器上没问题啊」 这类问题。
三:Docker容器与传统虚拟机的区别比较
传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;
容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
特性 | 容器 | 虚拟机 |
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为MB | 一般为GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般为几十个 |
四:Docker体系结构
通过下图可以得知, Docker 在运行时分为 Docker 引擎(服务端守护进程) 和 客户端工具 ,我们日常使用各种 docker 命令 ,其实就是在使用 客户端工具 与 Docker 引擎 进行交互。
Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上,然后通过Socket连接从客户端,守护进程从客户端接受命令并管理运行在主机上的容器
五:Docker内部核心组件
5.1:namespace
命名空间,Linux内核提供的一种对进程资源隔离的机制,例如进程、网络、挂载点等资源。
5.2:CGroups
控制组,Linux内核提供的一种限制进程资源的机制;例如CPU、内存等资源。
5.3:UnionFS
联合文件系统,支持将不同位置的目录挂载到同一虚拟文件系统,形成一种分层的模型。
六:Docker应用场景
场景一:节省项目环境部署时间
1:单项目打包
2:整套项目打包
3:新开源技术试用