docker三要素以及架构
docker由三部分组成:image(镜像)、容器(container)、仓库(repository).
1.image
Image是一个只读模板,其中包含有关创建Docker容器的说明;Image可以用来创建容器且一个镜像可以创造多个容器。通常,一个Image基于另一个Image,并带有一些额外的自定义。通过引入分层技术,可以增加镜像复用度,减少磁盘占用;同时可以实现差分上传下载,加快镜像pull、push性能。
2.container
Docker利用容器(container)独立运行的一个或者一组应用。容器是利用镜像创建的运行实例(相对于Java中的类和对象的概念)。容器可以被启动、开始、停止、删除。每个容器都是互相隔离的,保证安全的平台。可以把容器看做是一个简易版的Linux环境 (包括root用户名权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
容器的定义和镜像几乎是一模一样的,也是一堆层的统一视角, 唯一区别的是容器的最上面那一层是可读可写的。
容器是镜像启动或执行阶段。Docker中的每个容器都包含了一个软件镜像,该镜像可以被创建、启动、关闭、重启和销毁。
3.repository
集中存放Image的场所,Repository很容易和下面说的Registry(仓库注册服务器)混淆。通俗地说,它们的关系是Registry上往往存放着多个Repository,每个Repository存又放着一大堆Images,每个Image存在不同的标签(Tag);用户可以从通过注册服务器从仓库拉取(带有某个tag的)Image,从而创建Container。
docker-registry
Docker registries是指存储Docker Image的地方。如Docker Hub是任何人都可以使用的公共registries,这一性质类似于Github。Docker默认配置为在Docker Hub上查找你所需要的Image。注意和Repository进行区分
unionfs
UnionFS(联合文件系统)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下;UnionFS一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。UnionFS是Docker镜像的基础,镜像通过分层进行继承,基于基础镜像(images that no parent image),可以制作各种具体应用的镜像。
因此,我们会想,那基础镜像是什么呢?答案就是bootfs(boot file system),其主要包含bootloader和kernel。bootloader主要是引导、加载Kernel。这一层和典型的Linux/Unix系统是一样的,当boot加载完成之后整个内核就会在内存中了,此时内存的使用权已由bootfs交给Kernel,此时系统也会卸载bootfs。
ok,那在bootfs之上,又是什么呢?其实也和典型Linux/Unix一样,即是系统中的/dev、/proc、/bin、/etc等标准目录和文件,这些文件称为rootfs(root filesystem),是各种不同操作系统的发行版,如Centos、Ubuntu.Docker就是这样一个创建精简OS的工具,具有灵活迁移、部署的特性,因此广受业界欢迎。其rootfs可以很小,只需要包括最基本的命令、工具和程序库,因为底层直接使用Host的kernel。
容器在内核中支持的两种重要技术:
docker本质就是宿主机的一个进程,docker是通过namespace实现资源隔离,通过cgroup实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘比如分配500g并不是实际占用物理磁盘500g)
1)namespaces 名称空间
2)control Group 控制组
cgroup的特点是:
cgroup的api以一个伪文件系统的实现方式,用户的程序可以通过文件系统实现cgroup的组件管理
cgroup的组件管理操作单元可以细粒度到线程级别,另外用户可以创建和销毁cgroup,从而实现资源载分配和再利用
所有资源管理的功能都以子系统的方式实现,接口统一子任务创建之初与其父任务处于同一个cgroup的控制组
四大功能:
资源限制:可以对任务使用的资源总额进行限制
优先级分配:通过分配的cpu时间片数量以及磁盘IO带宽大小,实际上相当于控制了任务运行优先级
资源统计:可以统计系统的资源使用量,如cpu时长,内存用量等
任务控制:cgroup可以对任务执行挂起、恢复等操作
docker架构:
docker daemon就是docker的守护进程即server端,可以是远程的,也可以是本地的,这个不是C/S架构吗,客户端Docker client 是通过rest api进行通信
docker cli 用来管理容器和镜像,客户端提供一个只读镜像,然后通过镜像可以创建多个容器,这些容器可以只是一个RFS(Root file system根文件系统),也可以ishi一个包含了用户应用的RFS,容器再docker client中只是要给进程,两个进程之间互不可见
用户不能与server直接交互,但可以通过与容器这个桥梁来交互,由于是操作系统级别的虚拟技术,中间的损耗几乎可以不计
docker run 运行流程图:
本文地址:https://blog.csdn.net/lemontree0526/article/details/107396108
推荐阅读
-
docker(1)应用场景以及安装
-
在Linux系统下使用Docker以及Weave搭建Nginx反向代理
-
Windows下docker的安装以及遇到的问题
-
Ubuntu编译安装HAprox+Keepalived+MySQL负载高可用架构(结合Docker容器配置)
-
基于 Docker 的微服务架构实践
-
Linux下Docker以及portainer相关配置
-
Docker CentOS7的系统上安装部署以及基础教程
-
# 构建以及运行Springboot Docker镜像时的变量传递
-
11.Spark Streaming源码解读之Driver中的ReceiverTracker架构设计以及具体实现彻底研究
-
阿里P8架构师谈:消息中间件介绍、典型使用场景、以及使用原则