Docker 简介


  • 什么是 Docker

首先 Docker 是一个在 2013 年开源的应用程序并且是一个基于 go 语言编写是一个开源的 pass 服务 (Platform as a Service,平台即服务的缩写),go 语言是由google 开发,docker 公司最早叫 dotCloud 后由于 Docker 开源后大受欢迎就将公司改名为 Docker Inc,总部位于美国加州的旧金山,Docker 是基于 linux 内核实现,Docker 最早采用 LXC 技术 (LinuX Container 的简写,LXC 是 Linux 原生支持的容器技术,可以提供轻量级的虚拟化,可以说 docker 就是基于 LXC 发展起来的,提供 LXC 的高级封装,发展标准的配置方法),而虚拟化技术 KVM (Kernel based Virtual Machine) 基于模块实现,Docker 后改为自己研发并开源的 runc 技术运行容器。
Docker 相比虚拟机的交付速度更快,资源消耗更低,Docker 采用客户端/服务端架构,使用远程 API 来管理和创建 Docker 容器,其可以轻松的创建一个轻量级的、可移植的、自给自足的容器,docker 的三大理念是 build(构建)、ship(运输)、 run(运行),Docker 遵从 aoache 2.0 协议,并通过(namespace 及cgroup 等)来提供容器的资源隔离与安全保障等,所以 Docke 容器在运行时不需要类似虚拟机(空运行的虚拟机占用物理机 6-8%性能)的额外资源开销,因此可以大幅提高资源利用率,总而言之 Docker 是一种用了新颖方式实现的轻量级虚拟机.类似于 VM 但是在原理和应用上和 VM 的差别还是很大的,并且 docker 的专业叫法是应用容器 (Application Container)。

IDC/IAAS/PAAS/SAAS 对比

Docker 简介_第1张图片
image.png


  • Docker 组成
    1.Docker 客户端(Client):客户端使用 docker 命令或其他工具调用 docker API。
    2.Docker 服务端(Server):Docker 守护进程,运行 docker 容器。
    3.Docker 镜像(Images):镜像可以理解为创建实例使用的模板。
    4.Docker 容器(Container): 容器是从镜像生成对外提供服务的一个或一组服务。
    5.Docker 仓库(Registry): 保存镜像的仓库,类似于 git 或 svn 这样的版本控制系统,官方仓库: https://hub.docker.com/
    6.Docker 主机(Host):一个物理机或虚拟机,用于运行 Docker 服务进程和容器。
    Docker 简介_第2张图片
    image.png

  • 对比虚拟机
    1.资源利用率更高:一台物理机可以运行数百个容器,但是一般只能运行数十个虚拟机。
    2.开销更小:不需要启动单独的虚拟机占用硬件资源。
    3.启动速度更快:可以在数秒内完成启动。


    Docker 简介_第3张图片
    image.png

  • Docker 优势
    1.快速部署:短时间内可以部署成百上千个应用,更快速交付到线上。
    2.高效虚拟化:不需要额外的 hypervisor 支持,直接基于 linux 实现应用虚拟化,相比虚拟机大幅提高性能和效率。
    3.节省开支:提高服务器利用率,降低 IT 支出。
    4.简化配置:将运行环境打包保存至容器,使用时直接启动即可。
    5.快速迁移和扩展:可夸平台运行在物理机、虚拟机、公有云等环境,良好的兼容性可以方便将应用从 A 宿主机迁移到 B 宿主机,甚至是 A 平台迁移到 B 平台。

  • Docker 缺点
    1.隔离性:各应用之间的隔离不如虚拟机。

  • Docker (容器)的核心技术

1.容器规范

除了 docker 之外的 docker 技术,还有 coreOS 的 rkt,还有阿里的 Pouch,为了保证容器生态的标志性和健康可持续发展,包括 Google、Docker 等公司共同成立了一个叫 open container(OCI)的组织,其目的就是制定开放的标准的容器规范,目前 OCI 一共发布了两个规范,分别是 runtime spec 和 image format spec,有了这两个规范,不通的容器公司开发的容器只要兼容这两个规范,就可以保证容器的可移植性和相互可操作性。

2.容器 runtime

runtime 是真正运行容器的地方,因此为了运行不同的容器 runtime 需要和操作系统内核紧密合作相互在支持,以便为容器提供相应的运行环境。
目前主流的三种 runtime:
(1) Lxc:linux 上早期的 runtime,Docker 早期就是采用 lxc 作为 runtime。
(2) runc:目前 Docker 默认的 runtime,runc 遵守 OCI 规范,因此可以兼容 lxc。
(3) rkt:是 CoreOS 开发的容器 runtime,也符合 OCI 规范,所以使用 rktruntime 也可以运行 Docker 容器。

3.容器管理工具

管理工具连接 runtime 与用户,对用户提供图形或命令方式操作,然后管理工具将用户操作传递给 runtime 执行。
(1) Lxd 是 lxc 的管理工具。
(2) Runc 的管理工具是 docker engine,docker engine 包含后台 deamon 和 cli 两部分,大家经常提到的 Docker 就是指的 docker engine。
(3) Rkt 的管理工具是 rkt cli。

4.容器定义工具

容器定义工具允许用户定义容器的属性和内容,以方便容器能够被保存、共享和重建。
(1) Docker image:是 docker 容器的模板,runtime 依据 docker image 创建容器。
(2) Dockerfile:包含 N 个命令的文本文件,通过 dockerfile 创建出 docker image。
(3) ACI(App container image):与 docker image 类似,是 CoreOS 开发的 rkt 容器的镜像格式。

5.Registry

统一保存共享镜像的地方,叫做镜像仓库。
(1) Image registry:docker 官方提供的私有仓库部署工具。
(2) Docker hub:docker 官方的公共仓库,已经保存了大量的常用镜像,可以方便大家直接使用。
(3) Harbor:vmware 提供的自带 web 的镜像仓库,目前有很多公司使用。

6.编排工具

当多个容器在多个主机运行的时候,单独管理每个容器是相当负载而且很容易出错,而且也无法实现某一台主机宕机后容器自动迁移到其他主机从而实现高可用的目的,也无法实现动态伸缩的功能,因此需要有一种工具可以实现统一管理、动态伸缩、故障自愈、批量执行等功能,这就是容器编排引擎。 容器编排通常包括容器管理、调度、集群定义和服务发现等功能。
(1) Docker swarm:docker 开发的容器编排引擎。
(2) Kubernetes:google 领导开发的容器编排引擎,内部项目为 Borg,且其同时支持 docker 和 CoreOS。
(3) Mesos+Marathon:通用的集群组员调度平台,mesos 与 marathon 一起提供容器编排引擎功能。


  • Docker (容器) 的依赖技术

1.容器网络

docker 自带的网络 docker network 仅支持管理单机上的容器网络,当多主机运行的时候需要使用第三方开源网络,例如 calico、flannel 等。

2.服务发现

容器的动态扩容特性决定了容器 IP 也会随之变化,因此需要有一种机制开源自动识别并将用户请求动态转发到新创建的容器上,kubernetes 自带服务发现功能,需要结合 kube-dns 服务解析内部域名

3.容器监控

可以通过原生命令 docker ps/top/stats 查看容器运行状态,另外也可以使 heapster/ Prometheus 等第三方监控工具监控容器的运行状态。

4.数据管理

容器的动态迁移会导致其在不通的 Host 之间迁移,因此如何保证与容器相关的数据也能随之迁移或随时访问,可以使用逻辑卷/存储挂载等方式解决。

5.日志收集

docker 原生的日志查看工具 docker logs,但是容器内部的日志需要通过 ELK 等专门的日志收集分析和展示工具进行处理。

你可能感兴趣的:(Docker 简介)