一、 前言
场景一: 单个服务器如何部署不同的项目(各个项目之间依赖版本不同或者不同技术的项目、PHP、Go、Java),如依赖不同Node版本的项目?
场景二: 开发(安装、配置环境)->测试(安装、配置环境)->预发(安装、配置环境)->生产(安装、配置环境),如何保证运行环境的严格一致性及不同平台(如集群化部署)的快速迁移?
场景三: 如何更快的回滚代码(项目前后版本不仅代码的不同,而且项目各种依赖的不同)?
二、介绍
Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 OverlayFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。
三、和传统虚拟机对比
1、下面的图片比较了 Docker 和传统虚拟化方式的不同之处。传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
2、对比传统虚拟机总结
四、Docker的优势
1、更高效的利用系统资源
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。
2、更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
3、标准化了运行环境,部署更加稳定可靠
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。
4、更易于持续交付和部署(CI/CD)
对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。
而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。真正实现 “一次构建,处处运行”。
5、 运维更加高效,秒级回滚
● 传统的部署模式是:安装(包管理工具或者源码包编译)->配置->运行
● Docker的部署模式是:复制->运行。实现更轻量级的,方便快速部署,对于部署来说可以极大的减少部署的时间成本和人力成本。
特别是对于项目迁移,已经使用 docker 技术的项目,迁移起来根本不费事。因为已经将代码和运行环境带包成了一个整体,迁到哪个服务器上就去哪个服务器拉这个已经制作好的镜像就好了。
五、Docker 包括三个基本概念
镜像(Image)
容器(Container)
仓库(Repository)
理解了这三个概念,就理解了 Docker 的整个生命周期。