一、什么是 Docker?
要学 Docker,肯定得知道 Docker 是个啥~
按照官方文档的说法,Docker 是一个用于开发、打包和运行应用程序的开源应用容器引擎,开发者可以打包应用以及依赖到一个可移植的镜像中,发布到任何 Linux 或 Windows 机器上,其它开发者可以很方便地通过该镜像实现虚拟化。
隔离和容器化是 Docker 的关键思想。
二、什么是容器?
前面提到了 Docker 是一个容器引擎,那么什么是容器?
按照官方的说法,容器是一个标准化的软件单元,它将代码及其所有依赖关系打包,以便应用从一个计算机环境可靠快速地运行到另一个计算环境。Docker 容器镜像是一个轻量的独立的可执行的软件包。包含程序运行时所需的一切:代码,运行时间,系统工具,系统库和设置。
再附上网上搜到对容器的解读:容器是应用层的抽象,多个容器可以在同一台机器上运行,与其它容器共享内核,在用户空间中作为独立进程运行。
个人理解,容器将内部的东西与外部产生一定的隔离,使得内部和外部之间互不影响。应用层面上看,操作系统的许多系统资源被分配了一部分出来,专门给某些进程使用,这些进程不会影响组外的其它进程。
Docker 本意是运输船上一个一个的集装箱,其实也很好地表明了容器的特点,一个运输船可以看作一台计算机,集装箱就是计算机上运行的各个容器,容器之间互不影响,互相隔离。
**这里主要记录基本的容器思想,具体怎么实现将会在学习原理的时候知道,主要牵扯到的是系统的命名空间(Linux 的 namespace)和硬件资源分配(Linux 的 cgroup)。
三、容器和虚拟机
虚拟化的手段不只有容器,虚拟机(VM)技术也可以实现虚拟化,两者比较之下还是有区别的。
虚拟机(VM)是计算机系统的仿真,通过 Hypervisor 访问自己所属的硬件资源,每个 VM 都需要自己底层的操作系统,每个 VM 不仅运行操作系统的完整副本,还运行操作系统需要运行的所有硬件的虚拟副本,这很快就会增加大量的 RAM 和 CPU 周期。

容器相比虚拟机将虚拟的层向上提了一层,它通过容器管理器与宿主机的操作系统进行交互,不需要像虚拟机那样运行一个操作系统的副本,也因此更为轻量,但是因为容器的隔离是进程级别隔离,仍然可以被同一个操作系统感知到,所以相比 VM 安全性下降了(VM 虚拟的范围延伸到操作系统,操作系统之间完全隔离)。

总体而言,容器比虚拟机来着要轻量,但是安全性相比虚拟机来着要低。
四、Docker 的应用
Docker 可以应用于不同的场景。
1、Linux 环境配置
配置过 Linux 运行环境的同学肯定有过花费大量时间跑通一个服务器框架的经历,配置一个服务器框架比如 apache、nginx、mongo 之类的往往不会那么顺利,因为不同操作系统发行版本的依赖是有差异的,软件包之间的差异以及软件版本对系统的依赖也是配置繁琐的个中原因。
每次重新部署都会花费时间在对服务器版本和应用版本以及依赖关系的配置上,这其实是一种人力和时间上的浪费。
Docker 的应用可以很好地节省下被浪费的时间,通过将已经部署好的环境打包成一个镜像,下次需要重新部署的时候只需要通过这个镜像启动一个容器即可,省去了环境配置的时间。
2、多版本混合部署
在一台机器上部署一个应用的多个版本有时并不会很顺利,文件路径、端口等资源都有可能发生冲突,造成多个版本无法共存的问题。
使用 Docker 即可解决这个问题,通过将每个版本的应用放在一个容器里运行,使用端口映射实现容器与外部的数据交互,即可解决这个问题。
3、环境升级或回滚
有的时候我们需要升级一个服务器的运行环境,增加或者删除一部分东西,如果只有一台机器,这种操作意味着回滚的时候会很麻烦,需要重新配回原来的东西,有的时候甚至需要重新安装一遍东西。
使用 Docker 保存不同版本的环境镜像即可解决这个问题,环境升级时新开一个容器配置测试然后打包成新版本镜像,停用旧版本容器即可。当需要回滚的时候使用旧版本镜像构建出旧版本容器,停用新版本容器即可。
4、脚本化构建服务器
有的时候非开发人员可能需要一个自己的服务器,这个时候可能需要一个开发人员帮忙配置,无形中占用了开发的人力。
通过 Docker 即可解决这个问题,打包一个 Docker 镜像或者编写一个 DockerFile,然后通过脚本也好,UI 交互界面也好,将非开发人员可以编辑的部分暴露出来,其它的配置过程等等都隐藏起来,这样就不需要人力,非开发人员自己就可以解决构建服务器的过程。
概念解读
1、虚拟化
指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机,每个逻辑计算机可以运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响。
2、Hypervisor
运行在基础物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享软件,也可叫做虚拟机监视器 (VMM),总体而言它能够实现对不同虚拟机的硬件分配。
目前主流的 hypevisor:VMware 的 ESXi、Microsoft 的 Hyper-V 和思杰的 XenServer 等等。
3、Linux 容器(LXC)
Linux Container 是最初的 Linux 容器技术,用于在单个主机上运行多个隔离的 Linux 系统。