1.1.Docker 简介
如果说主机时代大家比拼的是单个服务器物理性能(比如 CPU 主频和内存), 那么在云时代, 最为看重的则是凭借虚拟化技术所构建的集群处理能力.
传统来看, 虚拟化既可以通过硬件模拟来实现, 也可以通过操作系统软件来实现.
而容器技术则更为优雅, 它充分利用了操作系统本身的机制和特性, 可以实现远超传统虚拟机的轻量级虚拟化. 因此, 有人甚至把它称为 "新一代的虚拟化" 技术, 并将基于容器打造的云平台亲切的称为"容器云".
1.什么是 Docker
Docker 的构想是要实现对应用的封装(Packaging), 分发(Distribution), 部署(Deployment), 运行(Runtime)生命周期进行管理, 达到应用组件 "一次封装, 到处运行" 的目的.
这里的应用组件, 既可以是一个 web 应用, 一个编译环境, 也可以是一套数据库平台服务, 甚至是一个操作系统或集群.
简单的讲, 可以将 Docker 容器理解为一种轻量级的沙盒, 每个容器内运行着一个应用, 不同的容器相互隔离, 容器之间也可以通过网络互相通信.
容器的创建和停止都十分快速, 几乎个创建和终止原生应用一致; 另外, 容器自身对系统资源的额外需求也十分有限, 远远低于传统虚拟机. 很多时候, 甚至直接把容器当做应用本身也没有任何问题.
我个人更倾向于将 Docker 理解为一个软件容器平台, 通过 Docker 我们可以创建容器和管理容器的生命周期. 并且 Docker 还能将应用自动部署到容器中.
2.什么是容器
容器是一种虚拟化的方案, 属于操作系统级别的虚拟化技术, 所以只能运行在相同或相似内核的操作系统; 而Docker依赖于 Linux 内核特性: Namespace 和 Cgroups, 所以只能运行在基于 Linux 内核上.
1.2.为什么要使用 Docker
1.Docker 容器虚拟化的好处
在云时代, 开发者创建的应用必须要能很方便的在网络上传播, 也就是说应用必须脱离底层物理硬件的限制; 同时必须是 "任何时间, 任何地点" 可以获取的.
因此, 开发者需要一种新型的创建分布式应用程序的方式, 快速分发和部署, 这正是 Docker 所能够提供的最大优势.
举个简单的例子, 假设用户视图基于常见的Linux+Tomcat+Java 组合来构建一个网站. 按照传统的做法, 首先需要安装 Tomcat 和 Java, 之后分别对他们进行配置; 还需要进行功能测试, 看是否工作正常, 如果不正常, 则进行调试和追踪, 意味着需要付出很多时间. 如果应用数目变多, 事情会变得更加难以处理.
如果一旦需要服务器迁移(例如从亚马逊云迁移到其他云), 那么还需要对应用进行重新部署和调试.
而Docker 提供了一种更为聪明的方式, 通过容器来打包应用, 意味着迁移的时候, 只需要在新的服务器上启动需要的容器就可以了, 无论新旧服务器还是统一类型的平台.
2.Docker 在开发和运维的优势
**更快速的交付和部署: **使用 Docker, 开发人员可以使用镜像来快速构建一套标准的开发环境; 开发完成后, 测试和运维人员可以直接使用完全相同的环境部署代码.只要开发测试通过的代码, 就可以确保在生产环境无缝运行.
**更高效的资源利用: **Docker 容器的运行不需要额外的虚拟化管理程序, 它是内核级的虚拟化, 可以实现更高的性能, 同时对资源的额外需求很低.
**更轻松的迁移和扩展: **Docker 容器几乎可以在任意的平台上运行, 包括物理机 虚拟机 公有云 私有云 个人电脑 服务器等, 同时支持主流的操作系统发行版. 让用户可以在不同平台之间轻松迁移应用.
**更简单的更新管理: **使用 Dockerfile, 只需要小小的配置修改, 就可以替代以往大量的更新工作. 并且所有修改都已增量的方式被分发和更新, 从而实现自动化并高效的容器管理.
3.容器和虚拟机比较
容器和虚拟机具有类似的资源隔离和分配优势, 但功能不同
因为容器虚拟化操作系统, 而不是硬件, 容器更加便携和高效.
左图是Docker容器
我们只需要在我们的操作系统上安装 Docker 容器就可以创建多个应用和依赖的库. 这样就大大减少了资源的占用.
右图是虚拟机
我们将一台服务器上安装上虚拟机软件, 并且创建出三个虚拟机, 每个虚拟机都有独立的系统, 独立的依赖库和我们的应用.
这样做会非常占用磁盘空间, 一个几十兆的应用, 就需要占用几G 的磁盘空间.
Docker 容器很快, 启动和停止可以在秒级实现, 而传统的虚拟机方式需要数分钟.
Docker 容器对系统资源需求很少, 一台主机上可以同时运行数万个 Docker 通过类似 GIT 设计理念的操作来方便获取, 发布和更新应用镜像, 存储复用, 增量更新.
Docker 通过 Dockerfile 支持灵活的自动化创建和部署机制, 提高工作效率, 使流程标准化.
Docker 架构
Docker 使用客户端 - 服务器架构.
Docker 客户端与 Docker 守护进程进行交流.
Docker 客户端和守护进程可以在同一个系统上运行, 也可以进行远程连接.
Docker 客户端和守护进程使用REST API, 通过 UNIX 套接字或网络接口进行通信.
Docker 客户端
Docker client 是 Docker 用户与 Docker 进行交互的主要方式. 并且
Docker 客户端可以与多个守护进程通信。
Docker 守护进程
Docker 守护程序监听 Docker API 请求并管理 Docker 对象, 如镜像,容器, 网络. 守护进程还可以与其他守护进程通信来管理Docker服务。
Docker 的大部分操作都是围绕着它的三大核心概念--镜像 容器和仓库而展开.
Docker Image 镜像
镜像就是用来创建容器的模板, 提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)
通常镜像是基于另一个镜像创建的, 这有点想 ps 的图层, 每一层都包含特定的文件.
镜像很多工具都没有(例如 VI), 我们可以通过镜像叠加的方式来增加功能.
镜像是只读的, 容器从镜像启动的时候, 会在镜像的最上层创建一个可写层.
Docker Container 容器
容器类似于一个轻量级的沙箱, Docker 利用容器来运行和隔离应用. 容器是从镜像创建的应用运行实例. 可以将其启动 开始 停止 删除, 而这些容器都是彼此相互隔离的, 互不可见的.
可以把容器看做是一个简易版的 Linux 系统环境(包括 root 用户权限 进程空间 用户空间和网络空间等).
Docker Registry 仓库
Docker 仓库类似于 Git 仓库, 它是 Docker 集中存放镜像文件的场所.