我们通过四W(what,when, why, how)原则去学习一下docker
What
什么是docker?
docker是一种虚拟化技术,太过专业的术语这里不聊,反而容易乱。可以将其比作类似vmware的虚拟软件,一个docker容器里面可以包含一套完整的软件运行环境。
When
什么时候需要使用docker技术,或者说docker技术的应用场景有哪些?
场景一:节省项目环境部署时间
1.单项目打包
每次部署项目到测试、生产等环境,都要部署一大堆依赖的软件、工具,而且部署期间出现问题几率很大,不经意就花费了很长时间。
Docker主要理念就是环境打包部署,可在任意Docker Engine运行。前期我们只需要将每个项目环境打包到镜像,push到镜像仓库,当有需要部署这个项目时,直接pull镜像启动容器,这个项目就可以访问了!一次构建多次部署,一劳永逸。
2.整套项目打包
公司有一项这样的业务:有一个产品可以整套部署到客户那里,以往都是派一名实施工程师到客户那部署。如果用了Docker,我们可以前期将这套项目封装打包起来,实现一键部署,分分钟钟搞定,就不需要再派人过去了。比如官方的Docker Compose编排工具。
3.新开源技术试用
有时,我们想调研一些开源项目,我们可以直接从公共镜像仓库pull项目官方做好镜像启动容器即可。
场景二:环境一致性
开发工程师在Windows系统上开发项目,测试、生产环境操作系统都是Linux系统,这就产生了环境不一致的情况:项目在开发电脑本地运行没问题,到了测试或生产环境就运行不起来,解决这问题最好方式就是这三处环境保持一致。软件版本、操作系统、物理机、云主机......试想下,能做到吗?
Docker将项目环境打包成镜像,可以在任何Docker Engine上浪。此时Docker就是我们这些项目的基石,Docker可移植性,保持运行状态一致性,可想而知,是否更容易解决问题呢?
场景三:持续集成
一个项目版本快速迭代的测试场景,需要一个合理的CI(持续集成)/CD(持续部署)环境支撑。CI/CD是一个周期性自动化项目测试流程,包括构建、部署、测试、发布等工作,很少需要人工干预。
Docker结合Jenkins构建持续集成环境大致如下图:
Docker在上面这个图的作用是项目镜像构建和快速部署,打通测试环境与生产环境,高度保持多个环境之间一致性。
场景四:微服务
微服务是近几年来IT圈内谈论比较多的一个名词,意义也很简单:尽可能细粒度拆分业务程序架构,由多个独立服务组成业务系统。
Docker的容器设计原则:一个容器一个服务,容器之间相互隔离,不妨试想一下,如果容器作为这些独立服务的部署单元,是不是有点恰到好处呢?
场景五:弹性伸缩
说到弹性伸缩,通常是集群模式下存在。像AWS AutoScaling,可以自定义资源阈值,SLB自动添加EC2云主机,应对业务访问量突发情况。
当适用Docker技术以后,这种弹性伸缩的单元就是云主机之上的容器了。
容器集群化管理已经有成熟的解决方案,比如:官方的Swarm,谷歌的K8S
由于Docker容器快速启动特性,可以很快速的启动几十个、上百个容器来提供更多并发和资源利用率(如果宿主机资源不够,还需要加主机到集群中)。
总结:简化部署流程,提高生产力!
Why
为什么使用docker?
我们来比较一下虚拟机和docker容器的架构
kvm虚拟机
docker容器
通过上面两图的比较,可以发行架构上有两个区别:
1、引擎不一样,一个是hypervisor引擎,一个是docker daemon引擎
2、虚拟机在hypervisor之上,需要一个guest os(客户端操作系统);而docker没有
docker容器与虚拟机的比较
既然架构上有区别了,那么具体在性能等一些方面,肯定会有所不同,这也是我们why使用docker的原因。
时间上:docker秒级启动,kvm虚拟机分钟级别(多了一层guest os,肯定会拖延启动的时间)
空间上:docker资源占用小,部署起来比虚拟机更快速(docker镜像通常以M为单位,而虚拟机通常以G为单位)
性能上:docker共享宿主机内核,系统级虚拟化,占用资源少,容器性能接近物理机;虚拟机需要hypervisor支持来虚拟化一些设备,而且有完整的GuestOs,虚拟化开销大,故而性能没有容器的好
安全上:docker只是进程级的隔离(每个容器是一个进程,进程之间是共享宿主机器内核的),所以 隔离性 和 稳定性 不如虚拟机
使用上:docker容器可运行在主流的任何linux发行版上(因为容器共享宿主机内核,不用考虑pu是否支持虚拟化技术);而kvm是基于硬件的完全虚拟化,需要硬件的支持,如果cpu不支持虚拟化技术的话,虚拟机就无法正确安装
How
怎么使用docker,这是最费脑子的环节了,需要记忆的东西比较多,拆分开来一一介绍,这里只做一些基本概念的介绍
基本概念
仓库(Registry)
仓库服务器上可以放多个仓库,每个仓库可以包含多个镜像。
镜像(Image)
是一个只读的模板。如:一个镜像可以包含一个完整的操作系统环境,里面仅仅安装了python环境。
镜像可以用来创建Docker容器,一个镜像可以创建很多容器。
容器(Container)
容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。
可以把容器看做是一个简易版的Linux环境和运行在其中的应用程序
记住一个原则:容器只做运算,不做存储,就算连程序的代码也不要放到docker里(只是推荐,并非一定要这样)