Docker容器技术-基础与架构
一、什么是容器
容器是对应用程序及其依赖关系的封装。
1.容器的优点
- 容器与主机的操作系统共享资源,提高了效率,性能损耗低
- 容器具有可移植性
- 容器是轻量的,可同时运行数十个容器,模拟分布式系统
- 不必花时间在配置和安装上,无需担心系统的改动,以及依赖关系是否满足
2.容器与虚拟机
运行在同一主机的3个虚拟机

运行在同一主机的3个容器

区别:
A.容器只能运行与主机一样的内核
B.程序库可以共用
C.容器中执行的进程与主机的进程等价(没有虚拟机管理程序的损耗)
D.隔离能力,虚拟机更高(将容器运行在虚拟机中)
3.容器与Docker
Docker利用现有的Linux容器技术,以不同方式将其封装及扩展(通过提供可移植的镜像及友好的接口),来创建及发布方案。
两部分:
- 负责创建与运行容器的Docker引擎
- 用来发布容器的云服务Docker Hub
二、Docker架构
1.总架构

主要模块:
DockerClient(与Daemon建立通信,发起容器的管理请求)
DockerDaemon(接收Client请求,处理请求)
Docker Regisrty(镜像管理)
Graph(存储镜像)
Drvier(镜像管理驱动)
libcontainer(系统内核特性,提供完整、明确的接口给Daemon)
Docker Container
2.各模块功能及实现
1)Docker Client
Docker架构中用户与Docker Daemon建立通信的客户端。
用户可以使用可执行文件docker作为Docker Client,发起Docker容器的管理请求。
三种方式建立通信:
tcp://host:port
unix://path_to_socket
fd://socketfd
Docker Client发送容器管理请求后,请求由Docker Daemon接收并处理,当Docker Client接收到返回的请求响应并做简单处理后,Docker Client一次完整的生命周期就结束了。
2)Docker Daemon
常驻在后台的系统进程。

主要作用:
接收并处理Docker Client发送的请求
管理所有的Docker容器
Docker Daemon运行时,会在后台启动一个Server,Server负责接收Docker Client发送的请求;接收请求后,Server通过路由与分发调度,找到相应的Handler来处理请求。
三部分组成:
A.Docker Server
专门服务于Docker Client,接收并调度分发Client请求。

Server通过包gorilla/mux创建mux。Router路由器,提供请求的路由功能,每一个路由项由HTTP请求方法(PUT、POST、GET、DELETE)、URL和Handler组成。
每一个Client请求,Server均会创建一个全新的goroutine来服务,在goroutine中,Server首先读取请求内容,然后做请求解析工作,接着匹配相应的路由项,随后调用相应的Handler来处理,最后Handler处理完请求后给Client回复响应。
B.Engine
核心模块,运行引擎。
存储着大量容器信息,管理着Docker大部分Job的执行。
handlers对象:
存储众多特定Job各自的处理方法handler。
例如:
{"create":daemon.ContainerCreate,}
当执行名为"create"的Job时,执行的是daemon.ContainerCreate这个handler。
C.Job
Engine内部最基本的执行单元,Daemon完成的每一项工作都体现为一个Job。
3)Docker Registry
存储容器镜像(Docker Image)的仓库。
Docker Image是容器创建时用来初始化容器rootfs的文件系统内容。
主要作用:
- 搜索镜像
- 下载镜像
- 上传镜像
方式:
- 公有Registry
- 私有Registry
4)Graph
容器镜像的保管者。

5)Driver
驱动模块,通过Driver驱动,Docker实现对Docker容器运行环境的定制,定制的维度包括网络、存储、执行方式。

作用:
将与Docker容器有关的管理从Daemon的所有逻辑中区分开。
实现:
A.graphdriver
用于完成容器镜像管理。
初始化前的四种文件系统或类文件系统的驱动在Daemon中注册:
aufs、btrfs、devmapper用于容器镜像的管理
vfs用于容器volume的管理

B.networkdriver
完成Docker容器网络环境的配置。

C.execdriver
执行驱动,负责创建容器运行时的命名空间,负责容器资源使用的统计与限制,负责容器内部进程的真正运行等。
Daemon启动过程中加载ExecDriverflag参数在配置文件中默认设为native。

6)libcontainer
使用Go语言设计的库,不依靠任何依赖,直接访问内核中与容器相关的系统调用。

7)Docker Container
服务交付的最终体现。
用户对Docker容器的配置:
- 通过指定容器镜像,使得Docker容器可以自定义rootfs等文件系统;
- 通过指定物理资源的配额,使得Docker容器使用受限的资源;
- 通过配置容器网络及其安全策略,使得Docker容器拥有独立且安全的网络环境;
*通过指定容器的运行命令,使得Docker容器执行指定的任务。
Docker容器技术-基础与架构的更多相关文章
- docker容器技术基础入门
目录 docker容器技术基础入门 容器(Container) 传统虚拟化与容器的区别 Linux容器技术 Linux Namespaces CGroups LXC docker基本概念 docker ...
- docker容器技术基础之联合文件系统OverlayFS
我们在上篇介绍了容器技术中资源隔离与限制docker容器技术基础之linux cgroup.namespace 这篇小作文我们要尝试学习容器的另外一个重要技术之联合文件系统之OverlayFS,在介绍 ...
- Docker容器技术基础
Docker基础 目录 Docker基础 容器(Container) 传统虚拟化与容器的区别 Linux容器技术 Linux Namespaces CGroups LXC docker基本概念 doc ...
- Docker容器技术-基础命令
一.基础命令 1.运行一个镜像 [root@bogon ~]# docker run debian echo "Hello World" Unable to find image ...
- 1.docker容器技术基础入门
内容来自:https://www.cnblogs.com/marility/p/10215062.html https://blog.51cto.com/gouyc/2310785?source=dr ...
- docker容器技术基础之linux cgroup、namespace
一.开头 接触过docker的同学多多少少听过这样一句话"docker容器通过linux namespace.cgroup特性实现资源的隔离与限制".今天我们来尝试学习一下这两个东 ...
- 1、docker容器技术基础入门
Docker和传统虚拟机的区别 参考文章: https://lwn.net/Articles/531114/ 操作中的命名空间详解 https://blog.yadu ...
- 1.云原生之Docker容器技术基础知识介绍
转载自:https://www.bilibili.com/read/cv15180540/?from=readlist
- 微服务架构:基于微服务和Docker容器技术的PaaS云平台架构设计(微服务架构实施原理)
版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发.部署.运维管理.持续开发持续集成的流程 ...
随机推荐
- python django -5 进阶
高级知识点包括: 静态文件处理 中间件 上传图片 Admin站点 分页 使用jquery完成ajax 管理静态文件 项目中的CSS.图片.js都是静态文件 配置静态文件 在settings 文件中定义 ...
- WPF的本质:数据和行为
如果自己来做一个UI框架,我们会首先关注哪些方面?我想UI框架主要处理的一定包括两个主要层次的内容,一个是数据展现,另一个就是数据操作,所以UI框架必须能够接收各种不同的数据并通过UI界面展现出来,然 ...
- iOS面试题--Model层--数据持久化储存方案
数据持久化储存方案有哪些? iOS中的数据持久化方式,基本上有以下四种:属性列表.对象归档.SQLite3和Core Data 1.属性列表涉及到的主要类:NSUserDefaults,一般 [NSU ...
- gcc 编译 连接 生成可执行文件
gcc c语言编译器 g++ c++编译器 gcc a.c 生成默认的a.out 可执行文件 ./a.out 来执行 gcc -c a.c 编译生成 a.o 目标文件 可以检查语法错误 gcc ...
- IOS开发之----常用加密方法
本文转载至 http://blog.csdn.net/wildfireli/article/details/23191983 (AES.MD5.Base64) 分类: iPhone 2014-04-0 ...
- (转)gethostbyname() -- 用域名或主机名获取IP地址
struct hostent *gethostbyname(const char *name); 这个函数的传入值是域名或者主机名,例如"www.google.cn"等等.传出值, ...
- JavaScript严格模式为何要禁用With语句
看了很多遍JavaScript严格模式,其中有说“禁用With语句”,以前看到这都是骑马观花,一带而过,因为平时就很少用到这个语句,禁不禁用对自己关系都不是很大.今天禁不住想知道为何“严格模式”就容不 ...
- 1084 矩阵取数问题 V2
1084 矩阵取数问题 V2 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 一个M*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,先从左上走到右下 ...
- 1060 最复杂的数(反素数玄学dfs)
1060 最复杂的数 题目来源: Ural 1748 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 把一个数的约数个数定义为该数的复杂程度,给出一个n,求1-n中 ...
- docker related,docker history
History of an image and size of layers: docker history --no-trunc=true zabbix/zabbix-3.0 | tr -s ' ' ...