Docker系列【1】——什么是Docker?

Docker是什么呢?在理解Docker之前,我们先来区分清楚两个概念,容器虚拟机

相信很多人都有使用过虚拟机,无论是Ubuntu还是其他一些Linux系统,每台虚拟机都必须安装一个操作系统,并且分配给它一定的资源,当虚拟机被开启时,预先分配给它的资源将被全部占用。每一台虚拟机都有完整的操作系统,必要的二进制和库。

容器技术与虚拟机不同,容器是与宿主机共享硬件资源和操作系统,可以实现资源的动态分配。容器以进程的形式在用户的操作系统中运行。容器技术可以在资源受到隔离的进程中运行程序,通过容器我们可以轻松打包程序和配置,使其变成容易运行的构建块,并且部署起来不受用户操作系统环境的影响。

Docker系列【1】——什么是Docker?
Docker属于Linux容器的一种封装,提供简单易用的使用接口。
Linux容器不是模拟一个完整的操作系统,而是对进程进行隔离,相当于在正常的进程外面套了一个保护层,对于容器内部的进程来说,它接触到的资源都是虚拟的,从而实现与底层系统的隔离。
Docker将应用程序与该程序的依赖,打包在一个文件当中,运行这个文件,就会形成一个虚拟容器。程序在这个容器中运行,就好像在真实的物理机运行一样。使用Docker,我们可以方便地创建和使用容器,还可以把自己的程序打包成镜像,快速部署而不需要重新配置环境。

Docker的优势

读到这里,你可能对Docker在实际开发的作用还是不太了解,让我们以实际的开发场景来讨论使用Docker的好处。在开发过程中,部署各种的环境是一件令人头疼的事情,比如Nginx、MySQL、JRE等等,复杂的环境配置和版本更新使得程序员可能出现在本地上能跑通,但在别人电脑就运行不起来的尴尬情况,显然这是环境问题;资源利用率也是一个值得考虑的问题,但应用程序越来越多,如果机器配置不够高,运行虚拟机会非常地吃力;当项目需要迁移时,部署起来非常地不方便。

Docker在当中能解决什么问题呢?

1.我们知道,一个程序要跑起来,需要这么几部分:代码 + 运行环境 + 配置 + 依赖的服务。代码当然就是同一份代码,不同的环境都一样,通常不会有问题,Docker image中包含了运行环境+配置,这对部署相当友好。Docker提供了镜像文件,也可以自己打包镜像,将Nginx或JRE打包成一个个镜像,只需在本地拉取镜像即可快速完成环境的部署,解决了依赖问题,再也不会出现“我的电脑明明可以运行”的情况。

2.机器的资源利用率提高,不需要再重新在虚拟一个操作系统而耗费许多的资源。Docker的启动属于秒级别,虚拟机需要几分钟去启动。

3.与虚拟机相比,Docker隔离性更弱,属于进程之间的隔离,虚拟机可实现系统级别的隔离

4.快速创建、删除:虚拟化创建是分钟级别的, Docker 容器创建是秒级别的, Docker 的快速迭代性,决定了无论是开发、测试、部署都可以节约大量时间

5.交付、部署:虚拟机可以通过镜像实现环境交付的一致性,但镜像分发无法体系化。 DockerDockerfile 中记录了容器构建过程,可在集群中实现快速分发和快速部署

下面这张表格可以清楚地看到容器相比传统虚拟机的优势所在:

特性 容器 虚拟机
启动 秒级 分钟级
硬盘使用 一般为MB 一般为GB
性能 接近原生 弱于
系统支持量 单机支持上千个容器 一般是几十个

Docker的缺陷:

Docker用于部署那些无状态的程序非常好用,比如Apache、Nginx等,但是如果把数据库等一些需要持久化的数据部署在Docker当中,就会存在一些问题。容器中的数据不是持久化,如果容器删除了,这些数据也就没了;由于容器之间互相隔离,所以主机上的其它进程不方便访问这些数据;对这些容器的I/O会经过存储驱动,然后到达主机,引入了一层间接层,因此性能有所下降

写在后面的话:

由于笔者也是在学习Docker的过程中,所以写下文章帮助自己梳理Docker的知识点,如果有错误的地方欢迎指出。

参考文章:
这可能是最为详细的Docker入门吐血总结
什么是Docker, 为什么这么火