Docker介绍
Docker 本身并不是容器,而是一个使用容器的工具。容器是 Linux 内核提供的技术,Docker 只是将这种技术的使用简便化了。Docker 的主要目标是 “Build,Ship and Run Any APP,Anywhere”(“一次封装,到处运行”) ,即对组件的封装、分发、部署、运行等生命周期的管理。
早期 Docker 是基于 LXC 容器的二次封装,后来 Docker 自建了一个容器引擎叫做 libcontainer 。再后来 CNCF 介入, Docker 又研发了一个工业标准化的容器引擎 runC。目前最新版的 Docker,所使用的容器引擎就是 Runc。
1. Docker原理
早期 Docker 利用 LXC 作为容器管理引擎,但是在创建容器时,不再使用模板去安装生成,而是通过镜像技术,即把操作系统用户空间所需要使用到的组件事先编排好,并打包成一个 image 文件,将镜像文件放在一个仓库中。当需要创建容器时,Docker 连接到镜像服务器上下载匹配的镜像文件,基于镜像启动容器。Docker 极大简化了容器的使用难度,只需要使用命令 docker-run
和 docker-stop
就可以启动和停止一个容器。
2. Docker和虚拟机的差异
Docker 有比虚拟机更少的抽象层。Docker 不需要 Hypervisor 实现硬件资源虚拟化,运行在 docker 容器上的程序直接使用的是实际物理机的硬件资源,因此 docker 在效率上会有明显的优势。 Docker 不需要 Guest OS ,利用的是宿主机的内核,节省了 Guest OS 占用的资源。
docker 不需要 Guest OS,创建一个容器时,不需要和虚拟机一样重新加载一个操作系统内核。从而避免引寻、加载操作系统内核返回时耗时耗资源的过程。当新建一个虚拟机时,虚拟机软件需要加载 Guest OS,返回新建过程需要几分钟。而新建一个 docker 容器只需要几秒钟。
虚拟机 | Docker 容器 | |
---|---|---|
磁盘占用 | 几个 GB 到 几十个 GB 不等 | 几十 MB 到 几百 MB 不等 |
CPU 和内存占用 | 通过虚拟层调用,CPU和内存占用率高 | Docker 直接作用于硬件资源,占用少 |
启动速度 | 几分钟 | 几秒钟 |
安装管理 | 需要专门的运维技术 | 安装、管理方便 |
应用部署 | 手动部署,速度慢 | 体系化部署,可以自动化,速度快 |
隔离性 | 系统级别(安全性高) | 进程级别(安全性低) |
封装程度 | 打包整个操作系统 | 打包项目和依赖环境 |
3. Docker和JVM的差异
容器 | JVM | Docker 容器 |
---|---|---|
性能 | JVM 需要占用一定的 CPU 和内存 | 基本没有损失 |
虚拟层面 | 基于 JVM 虚拟机,更加上层 | 基于操作系统,更加通用 |
代码无关性 | 一个特定代码的执行平台,它是运行时才存在的,只能支撑特定代码的执行,并且必须是在 JVM 进程内 | 模拟了一整个操作系统,它是静态存在的,可以支撑任何相同平台的应用程序 |
主机隔离性 | JVM 不隔离主机 | 通过命名空间实现隔离 |