一、欢迎来到 Docker 世界1. Docker 与虚拟化
在没有 Docker 的时代,我们会使用硬件虚拟化(虚拟机)以提供隔离 。这里,虚拟机通过在操作系统上建立了一个中间虚拟软件层 Hypervisor,并利用物理机器的资源虚拟出多个虚拟硬件环境来共享宿主机的资源,其中的应用运行在虚拟机内核上 。但是,虚拟机对硬件的利用率存在瓶颈,因为虚拟机很难根据当前业务量动态调整其占用的硬件资源,因此容器化技术得以流行 。其中,Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 linux 机器上 。
文章插图
Docker 容器不使用硬件虚拟化,它的守护进程是宿主机上的一个进程,换句话说,应用直接运行在宿主机内核上 。因为容器中运行的程序和计算机的操作系统之间没有额外的中间层,没有资源被冗余软件的运行或虚拟硬件的模拟而浪费掉 。
Docker 的优势不仅如此,我们来比较一番 。
特性Docker虚拟机启动速度秒级分钟级交付/部署开发、测试、生产环境一致无成熟体系性能近似物理机性能损耗大体量极小(MB)较大(GB)迁移/扩展跨平台,可复制较为复杂
2. 镜像、容器和仓库
Docker 由镜像(Image)、容器(Container)、仓库(Repository) 三部分组成 。
Docker 的镜像可以简单的类比为电脑装系统用的系统盘,包括操作系统,以及必要的软件 。例如,一个镜像可以包含一个完整的 centos 操作系统环境,并安装了 Nginx 和 Tomcat 服务器 。注意的是,镜像是只读的 。这一点也很好理解,就像我们刻录的系统盘其实也是可读的 。我们可以使用 docker images 来查看本地镜像列表 。
Docker 的容器可以简单理解为提供了系统硬件环境,它是真正跑项目程序、消耗机器资源、提供服务的东西 。例如,我们可以暂时把容器看作一个 Linux 的电脑,它可以直接运行 。那么,容器是基于镜像启动的,并且每个容器都是相互隔离的 。注意的是,容器在启动的时候基于镜像创建一层可写层作为最上层 。我们可以使用 docker ps-a 查看本地运行过的容器 。
Docker 的仓库用于存放镜像 。这一点,和 Git 非常类似 。我们可以从中心仓库下载镜像,也可以从自建仓库下载 。同时,我们可以把制作好的镜像 commit 到本地,然后 push 到远程仓库 。仓库分为公开仓库和私有仓库,最大的公开仓库是官方仓库 Dock Hub,国内的公开仓库也有很多选择,例如阿里云等 。
文章插图
图片来源互联网
3. Docker 促使开发流程变更
笔者认为,Docker 对开发流程的影响在于使环境标准化 。例如,原来我们存在三个环境:开发(日常)环境、测试环境、生产环境 。这里,我们对于每个环境都需要部署相同的软件、脚本和运行程序,如图所示 。事实上,对于启动脚本内容都是一致的,但是没有统一维护,经常会出问题 。此外,对于运行程序而言,如果所依赖的底层运行环境不一致,也会造成困扰和异常 。
文章插图
现在,我们通过引入 Docker 之后,我们只需要维护一个 Docker 镜像 。换句话说,多套环境,一个镜像,实现系统级别的一次构建到处运行 。此时,我们把运行脚本标准化了,把底层软件镜像化了,然后对于相同的将要部署的程序实行标准化部署 。因此,Docker 为我们提供了一个标准化的运维模式,并固化运维步骤和流程 。
文章插图
通过这个流程的改进,我们更容易实现 DevOps 的目标,因为我们的镜像生成后可以跑在任何系统,并快速部署 。此外,使用 Docker 的很大动力是基于 Docker 实现弹性调度,以更充分地利用机器资源,节省成本 。
哈哈,笔者在使用 Docker 过程中,还发现了一些很棒的收益点,例如我们发布回滚的时候只需要切换 TAG 并重启即可 。还比如,我们对环境升级,也只需要升级基础镜像,那么新构建的应用镜像,自动会引用新的版本 。(欢迎补充~~~)
二、从搭建 Web 服务器开始说起
1. 环境先行,安装 Docker
现在,我们需要安装以下步骤安装 Docker 。