什么是 Docker?它能用来做什么?
文章目录
- 什么是云计算?
- 什么是 Docker?
- 虚拟化技术演变
- 特点
- 架构
- 镜像(Image)
- 仓库(Registry )
- 容器(Container)
- 应用场景
什么是云计算?
云计算是一种资源的服务模式,该模式可以实现随时随地、便捷按需地从可配置计算资源共享池中获取所需的资源(如网络、服务器、存储、应用及服务),资源能够快速供应并释放,大大减少了资源管理工作开销,用户甚至可以再也不用理会那些令人头痛的传统服务供应商了。
经典的云计算架构包括以下三层服务:
- IaaS(Infrastructure as a Service,基础设施即服务):面向基础设施运维人员,提供计算、存储、网络及其他基础资源,云平台使用者可以在上面部署和运行包括操作系统和应用程序在内的任意软件,无需再为基础设施的管理而分心。
- PaaS(Platform as a Service,平台即服务):面向应用开发人员,提供支撑应用运行所需的软件运行时环境、相关工具与服务,如数据库服务、日志服务、监控服务等,让应用开发者可以专注于核心业务的开发。
- SaaS(Software as a Service,软件即服务):面向一般用户,提供了一套完整可用的软件系统,让一般用户无需关注技术细节,只需通过浏览器、应用客户端等方式就能使用部署在云上的应用服务。
什么是 Docker?
Docker 是一个能够把开发的应用程序自动部署到容器的开源引擎。由 Docker 公司(前 dotCloud)的团队编写,基于 Apache 2.0 开源授权协议发行。
Docker 在虚拟化的容器执行环境中增加了一个应用程序部署引擎。该引擎的目标就是提供一个轻量、快速的环境,能够运行开发者的程序,并方便高效地将程序从开发者的笔记本部署到测试环境,然后再部署到生产环境。
Docker 极其简洁,它所需的全部环境只是一台仅仅安装了兼容版本的 Linux 内核和二进制文件最小限的宿主机。
虚拟化技术演变
虚拟化技术演变路径可分为三个时代:
-
物理机时代,多个应用程序可能跑在一台物理机器上。
-
虚拟机时代,一台物理机器启动多个虚拟机实例,一个虚拟机跑多个应用程序。
-
容器化时代,一台物理机上启动多个容器实例,一个容器跑多个应用程序。
虚拟机通过中间层 Hypervisor 将一台或多台独立的机器虚拟运行于物理硬件之上,而容器则是直接运行在操作系统内核之上的用户空间,因此它们存在很大的差异:
特性 | Docker | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
交付/部署 | 开发、测试、生产环境一致 | - |
性能 | 近似物理机 | 性能损耗大 |
镜像存储 | MB 级 | GB 级 |
集群规模 | 上万 | 上百 |
隔离级别 | 进程级 | 操作系统级 |
隔离策略 | CGroups | Hypervisor |
高可用策略 | 弹性、负载、动态 | 备份、容灾、迁移 |
特点
- 提供一个简单、轻量的建模方式:Docker 上手非常快,用户只需要几分钟,就可以把自己的程序 Dockerize。Docker 依赖于写时复制(copy-on-write)模型,使修改应用程序也非常迅速。大多数 Docker 容器只需不到 1 秒钟即可启动。由于去除了管理程序的开销,Docker 容器拥有很高的性能,同时同一台宿主机中也可以运行更多的容器,使用户可以尽可能充分地利用系统资源。
- 职责的逻辑分离:开发人员只需要关心容器中运行的应用程序,而运维人员只需要关心如何管理容器。Docker 设计的目的就是要加强开发人员写代码的开发环境与应用程序要部署的生产环境的一致性。
- 快速、高效的开发生命周期:缩短代码从开发、测试到部署、上线运行的周期,让应用程序具备可移植性,易于构建,并易于协作。
- 鼓励使用面向服务的架构:Docker 推荐单个容器只运行一个应用程序或进程,这样就形成了一个分布式的应用程序模型,在这种模型下,应用程序或服务都可以表示为一系列内部互联的容器,从而使分布式部署应用程序,扩展或调试应用程序都变得非常简单,同时也提高了程序的内省性。
架构
Docker 使用客户端/服务器(C/S)架构,如下图所示:
客户端只需向 Docker 服务器或守护进程(daemon)发出请求,服务器或守护进程将完成所有工作并返回结果。Docker 守护进程有时也称为 Docker 引擎。Docker 提供了一个命令行工具 docker 以及一整套RESTful API 来与守护进程交互。用户可以在同一台宿主机上运行 Docker 守护进程和客户端,也可以从本地的 Docker 客户端连接到运行在另一台宿主机上的远程 Docker 守护进程。
镜像(Image)
镜像是用于创建 Docker 容器的模板,它就像是容器的源代码一样,包含了一系列的构建指令。
镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
仓库(Registry )
Docker 用 Registry 来保存用户构建的镜像。Registry 分为公共和私有两种。Docker 公司运营的公共 Registry 叫作 Docker Hub。用户可以在 Docker Hub 注册账号,分享并保存自己的镜像。
容器(Container)
镜像和容器的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。我们可以认为,镜像是 Docker 生命周期中的构建或打包阶段,而容器则是启动或执行阶段。
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间(namespaces)。因此容器可以拥有自己的 root 文件系统、网络配置、进程空间,甚至用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。
应用场景
- 加速本地开发和构建流程,使其更加高效、更加轻量化。本地开发人员可以构建、运行并分享 Docker 容器。容器可以在开发环境中构建,然后轻松地提交到测试环境中,并最终进入生产环境。
- 能够让独立服务或应用程序在不同的环境中,得到相同的运行结果。这一点在面向服务的架构和重度依赖微型服务的部署中尤其实用。
- 用 Docker 创建隔离的环境来进行测试。
- Docker 可以让开发者先在本机上构建一个复杂的程序或架构来进行测试,而不是一开始就在生产环境部署、测试。
- 构建一个多用户的平台即服务(PaaS)基础设施。
- 为开发、测试提供一个轻量级的独立沙盒环境,
- 提供软件即服务(SaaS)应用程序。
- 高性能、超大规模的宿主机部署。