1、docker工作原理
docker关键组件
镜像(Image)——一个特殊的文件系统
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)
容器(Container)——镜像运行时的实体
容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等
仓库(Repository)——集中存放镜像文件的地方
镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry就是这样的服务
Docker采用了C/S架构。客户端和服务端可以运行在一个机器上,也可以通过socket或者RESTful API 来进行通信。
Docker Daemon: 一般在宿主机后台运行,等待接收客户端的消息
Docker Client:则为客户提供一系列可执行的命令, 用户使用这些命令跟docker daemon交互
docker架构与内部组件
Docker daemon:
Docker daemmon是Docker架构中的主要用户接口。首先,它提供了API Server用于接收来自Docker client的请求,其后根据不同的请求分发给Docker daemon的不同模块执行相应的工作
Image managerment:
需要创建DOcker容器时,可通过镜像管理(image management)部分的distribution和registry模块从Docker registry中下载镜像,并通过镜像管理的image、reference和layer存储镜像的元数据,通过镜像存储驱动graphdriver将镜像文件存储于具体的文件系统中
Network:
当需要为Docker容器创建网络环境时,通过网络模块network调用libnetwork创建并配置Docker容器的网络环境
Volume:
当需要为容器创建数据卷volume时,则通过volume模块调用某个具体的volumedrive,来创建一个数据卷并负责后续的挂载操作
Execdriver:
当需要限制Docker容器运行资源或执行用户指令操作时,则通过execdrive来完成
Libcontainer:
是对cgroups和namespace的二次封装,execdrive是通过libcontainer来实现对容器的具体管理,包括利用UTS、IPC、PID、Network、Mount、User等namespace实现容器之间的资源隔离和利用cgroups实现对容器的资源限制.当运行容器的命令执行完毕后,一个实际的容器就处于运行状态,该容器具有独立的文件系统、相对安全且相互隔离的运行环境.
1、用户是使用Docker Client与Docker Daemon建立通信,并发送请求给后者
2、Engine执行Docker内部的一系列工作,每一项工作都是以一个Job的形式的存在。
3、Job的运行过程中,当需要容器镜像时,则从Docker Registry中下载镜像,并通过镜像管理驱动graphdriver将下载镜像以Graph的形式存储;当需要为Docker创建网络环境时,通过网络管理驱动networkdriver创建并配置Docker容器网络环境;当需要限制Docker容器运行资源或执行用户指令等操作时,则通过execdriver来完成。libcontainer是一项独立的容器管理包,networkdriver以及execdriver都是通过libcontainer来实现具体对容器进行的操作。
1、容器和虚拟机对比
2、Docker的优势
3、Docker的劣势
4、Docker的应用场景
Docker 的的优势:
持续部署和测试
发到产品发布的整个过程中使用相同的容器来确保没有任何差异或者人工干预。Docker可以保证测试环境、开发环境、生产环境的一致性。
可移植性
容器可以移动到任意一台Docker主机上,而不需要过多关注底层系统。
弹性伸缩更快速
配合K8S可以很容易的无状态应用的弹性伸缩,只需要改一个yml的数字即可。利用docker能在几秒钟之内启动大量的容器,这是虚拟机无法办到的,快速启动,秒级和分钟级的对比。
资源利用率高
由于docker不需要Hypervisor实现硬件资源虚拟化,docker容器和内核交互,几乎没有性能损耗,性能优于通过Hypervisor层与内核层的虚拟化。一台机器启动上前台容器也没问题。
对硬件无要求
不需要CPU支持虚拟化
Docker 的的劣势
资源隔离
docker是利用cgroup实现资源隔离的,只能限制资源消耗的最大值,而不能隔绝其他应用程序占用自己的资源; docker属于进程之间的隔离,虚拟机可实现系统级别隔离;
安全性问题
一个用户拥有执行docker的权限,可以删除任何用户创建的容器。
兼容性问题
docker目前还在版本快速更新中,细节功能调整较大,一些核心的模块依赖于高版本的内核,存在兼容性的问题。