VM vs Docker
在虚拟化架构中,底层是硬件服务,然后是操作系统再然后是虚拟化层的Hypervisor,有了Hypervisor,就可以安装虚拟机操作系统,然后配置应用运行所需要的依赖环境,然后安装各种APP,在容器时代,底层也是硬件和操作系统,然而不是安装Hypervisor,而是安装一个Docker引擎,安装完Docker引擎之后,就可以在容器中配置应用运行所需要的依赖环境,然后安装各种各样的APP,就可以运行起来了。很直观的对比说明,容器的运行不需要安装虚拟机的操作系统,容器是一种比虚拟机更加轻量级的虚拟化技术。
Docker的优势
运行在同样的主机上,Docker容器共用一个container,而虚拟机则使用自己的操作系统上的container,虚拟机之间拥有比Docker更好的隔离性,但Docker相对于虚拟机来说有更多的优势,比如虚拟机操作系统的存在额外占用了更多的计算资源,其次,从空间占用上,虚拟机基本都是GB级别的,而对容器来说可以小至几MB。Docker比虚拟机有更强的跨平台迁移能力,如虚拟机无法从Vmware迁移到KVM,但只要安装了Docker引擎,Docker容器就可以在这些平台上运行起来。
容器、镜像、仓库
容器和虚拟机都是承载相关应用的载体。
镜像可以用虚拟机模板进行类比,当容器安装了特定应用以后,就可以打包成镜像,需要此应用的时候,就可以将镜像下载下来,快速地运行起来。
仓库是存储镜像的地方。
Docker容器
容器有三种状态:Running、Stopped、Paused,对应虚拟机的运行、关机、挂起是相似的,通过Docker命令可以将容器重启、停止、启动、挂起、恢复启动。
Docker镜像
当镜像下载到本地后就可以启动一个基于这个镜像的容器,当对容器做修改以后,也可以将容器commit回去,这时会生成一个新版本的镜像。Docker镜像是一层级结构的文件系统,镜像最上层往往是可写的,存储着已经运行的容器的修改信息,当对容器进行kill时,这些修改信息就会被删掉,当容器的commit成为新的镜像时,这些修改信息也会保存成新的层级。镜像的生成除了commit之外,还有一种更标准更常用的方法:使用Dockerfile来build镜像,这种方式build出的镜像更干净透明。
Docker仓库
Dockerhub是Docker的官方镜像仓库,仓库中存放了各种标准化的镜像,可以使用pull命令直接从Dockerhub中下载镜像到本地进行使用,使用Docker还可以建立其余的镜像仓库, 用来存放常用镜像和企业自定义的应用镜像,还可以从私有的仓库中下载需要的镜像,也可以定制镜像上传到私有仓库中。
Build、Ship、Run
由上可知,Docker的核心技术主要在build、ship、run。首先利用Dockerfile将代码组建build成为镜像,接着将镜像上传到企业之间的镜像仓库中,当需要用到镜像时,就可以在任何地方连接到镜像仓库,将镜像下载到本地,然后将其run下来就可以。这样可以实现Docker一次构建,在任何地方运行的构想。
Docker数据卷
前面说到容器一旦关闭,其上的修改信息就会丢失,这对于有状态的应用来说是不可接受的。我们可以通过给容器挂载文件目录或存储来解决,从而可以存储一些容器运行中的一些数据。当容器崩溃时候,重新启动一个容器时依然可以访问之前存储下来的数据,这种方式也可以解决容器间、主机和容器间的数据访问。
数据卷存在意义:
- 容器运行时可使用数据卷中的文件
- 数据卷可在多个容器间共享
- 存储容器运行过程中产生的数据
- 方便主机对容器数据的访问
Docker网络
容器间的通信、容器和web应用之间的通信往往需要容器的网络来实现,Docker的网络有四种模式:Bridged、Host、Container、None。
Bridged:表示容器可以与主机上的容器、主机、web进行通信。
Host:表示容器只能与主机进行通信
Container:表示容器,只能与容器之间进行通信,而无法与主机进行通信
None:表示没有网络连接
常用的是Bridged模式,安装Docker之后,主机会生成一个Docker网桥,每个容器拥有一个虚拟网卡,容器网卡通过网桥连接到主机的物理网卡,然后与web进行通信。