Docker 是什么
Docker是将发布程序运行所需要的所有环境打包到一起,自动化运行的容器;是一个开源项目,支持大部分的linux发行版,操作系统层以上的虚拟化技术。容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker 架构图
-
组成图
-
传统 hypervisor 组成图
-
容器 Docker 架构图
Docker 优缺点
对比传统虚拟机Hypervisor和Docker容器组成图:
项目 | 传统虚拟机 | Docker虚拟机 |
---|---|---|
占用空间 | "大" GB数量级 | "小" M数量级 |
启动速度 | "慢" 分钟级别 | "快" 毫秒级别 |
资源利用率 | "低" 一台物理机装多个虚拟操作系统 | "高" 一台物理机装一个操作系统启动多个容器 |
运行基础 | "Hypervisor" CPU 虚拟化技术 | "linux 内核" linux 内核虚拟化 |
部署 | "复杂" 先装操作系统再装应用 | "方便" 直接启动镜像 |
隔离 | 操作系统级别 | 容器级别 基于namespace隔离 |
相互通信 | "简单" 操作系统间通信 | "复杂" 容器间通信 |
Docker 架构图说明:
Docker有以下几个部分组成:
Docker Client客户端 通过Api 访问Docker Daemon 管理Docker 镜像
Docker Daemon 守护进程 负责Docker 镜像的创建、删除、启动、停止等服务
Docker Image镜像 一张 “只读” 的系统CD
Docker Container容器 Docker的容器,Docker Images运行实例。
Docker Registry : Docker Images的仓库,Dock Hub https://www.dockerhub.com。
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker 容器通过 Docker 镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。
Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。 客户端和服务端既可以运行在一个机器上,也可通过 socket 或者RESTful API 来进行通信。
Docker 能做什么?
使应用的打包与部署自动化
创建轻量、私密的PAAS环境
实现自动化测试和持续的集成/部署
部署与扩展webapp、数据库和后台服务
Docker 基础概念
Docker 包括三个基本概念
镜像(Image)
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。
容器(Container)
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
仓库(Repository)
一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。