Docker是什么?
- docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。
- docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的linux服务器,也可以实现虚拟化。
- 容器是完全使用沙箱机制,相互之间不会有任何接口(类iphone的app),并且容器开销极其低。
简单来说,通过docker,我们可以在不同的硬件设备上使用同样的软件环境和配置。在实际的开发场景中,开发人员、测试人员往往不共用一套环境,这导致产品开发完成在转测后出现各种环境不适配、缺少依赖的问题,给测试人员带来了巨大的工作量。而通过docker,开发人员只要定义一个docker镜像,测试人员拉取该镜像并在其中进行相应产品的测试,就可以完全解决运行项目时的环境适配难题。
如下图,开发人员从功能模块中拉取主线代码创建自己的分支,并在个人分支上开发完成后合并回主分支,然后提交时候触发流水线。对于流水线中的三个任务分别启动不同的docker。
补充概念
镜像 & 容器
镜像和容器的关系类似于面向对象编程中类和对象(实例)的关系。从镜像中其中一个容器,容器是镜像的运行实例。一个镜像可以启动多个容器。
容器 & 虚拟机
容器实质上是一个进程,它在linux本机上运行,并且容器之间共享主机内核。而虚拟机运行的是一个完整的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问。区别如图。容器共享相同的主机操作系统,虚拟机则有各自的操作系统。
Docker架构
Docker的简易架构如下图所示。
Docker Client
Docker是一个C/S架构程序,通过客户端Client发送请求至服务器或守护进程,而后服务器或守护进程将完成所有的工作后返回结果给客户端。Docker提供了一整套的Restful接口供客户端和服务端通信使用;此外,docker还提供了命令行工具。用户可以很方便的从本地docker客户端连接到远程docker服务器或远程服务器上运行着的docker守护进程。
Docker Daemon
Docker daemon是一个常驻在后台的系统进程,负责接收和响应客户端的请求。该守护进程在后台启动一个server,server负载接受docker client发送的请求;接受请求后,server通过路由与分发调度,找到相应的handler来执行请求。
Docker server
Docker server专门服务于client,接受并调度分发client的请求。
Engine
Engine是docker架构中的运行引擎,也是核心模块。Engine承担着docker容器存储仓库的责任,通过执行job的方式管理操作容器。
Job
Job是engine内部最基本的工作执行单元。Docker可以做的每一项工作,都可以抽象为一个job。例如:在容器内部运行一个进程,这是一个job;创建一个新的容器,这是一个job,从Internet上下载一个文档,这是一个job。
Job的设计者,把Job设计得与Unix进程相仿。比如说:Job有一个名称,有参数,有环境变量,有标准的输入输出,有错误处理,有返回状态等。
Docker Registry
Docker Registry是一个存储镜像的仓库。而镜像是在容器被创建时,被加载用来初始化容器的文件架构与目录。在docker的运行过程中,docker daemon会与docker registry通信,实现搜索、下载和上传镜像的功能。
Graph
Graph是docker已下载镜像的管理者,以及已下载镜像之间关系的记录者。一方面,Graph存储着本地具有版本信息的文件系统镜像,另一方面也通过GraphDB记录着所有文件系统镜像彼此之间的关系。
Driver
Driver是驱动模块,主要可以分为三类:graphdriver、networkdriver和execdriver。
- Graphdriver用于完成镜像的管理,包括存储和获取。
- Networkdriver用于完成docker容器网络环境的配置。
- Execdriver则负责创建容器运行命名空间,负责容器资源使用的统计与限制,负责容器内部进程的真正运行等。
Libcontainer
libcontainer是Docker架构中一个使用Go语言设计实现的库,该库可以不依靠任何依赖,直接访问内核中与容器相关的API。Docker可以直接调用libcontainer实现对容器namespace、cgroups、apparmor、网络设备以及防火墙规则等的操纵。另外,libcontainer提供了一整套标准的接口来满足上层对容器管理的需求。或者说,libcontainer屏蔽了Docker上层对容器的直接管理。
Docker Container
Docker容器是docker架构服务最终交付的形式。用户通过指定容器镜像,使得Docker容器可以自定义rootfs等文件系统; 用户通过指定计算资源的配额,使得Docker容器使用指定的计算资源; 用户通过配置网络及其安全策略,使得Docker容器拥有独立且安全的网络环境; 用户通过指定运行的命令,使得Docker容器执行指定的工作。
参考文章:https://www.cnblogs.com/zhangxingeng/p/11236968.html#auto_id_22
|