阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Docker的体系结构

99次阅读
没有评论

共计 3239 个字符,预计需要花费 9 分钟才能阅读完成。

Docker 的体系结构

docker 使用 C / S 架构,docker  daemon 作为 server 端接受 client 的请求,并处理(创建、运行、分发容器),他们可以运行在一个机器上,也通过 sockerts 或者 RESTfulAPI 通信。

Docker 的体系结构 

Dockerdaemon 一般在宿主主机后台运行,用户使用 client 而直接跟 daemon 交互。Docker  client 以系统做 bin 命令的形式存在,用户用 docker 命令来跟 docker  daemon 交互。

1、Docker 的内部组件
docker 有三个内部组件

docker  images

docker  registries

docker  containers

Docker  images

dockerimages 就是一个只读的模板。比如:一个 image 可以包含一个 Ubuntu 的操作系统,里面安装了 apache 或者你需要的应用程序。images 可以用来创建 docker  containers,docker 提供了一个很简单的机制来创建 images 或者更新现有的 images,你甚至可以直接从其他人那里下载一个已经做好的 images

Docker  registries

Docker  registries 也叫 docker 仓库,它有公有仓库和私有仓库 2 种形式,他们都可以用来让你上传和下载 images。公有的仓库也叫 DockerHub。它提供了一个巨大的 image 库可以让你下载,你也可以在自己的局域网内建一个自己的私有仓库。

Docker  containers

Docker  containers 也叫 docker 容器,容器是从 image 镜像创建的。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、安全的平台。

2、dockerimage 的工作原理
每个 docker 都有很多层次构成,docker 使用 unionfile systems 将这些不同的层结合到一个 image 中去。

AUFS(AnotherUnionFS)是一种 UnionFS, 简单来说就是支持将不同目录挂载到同一个虚拟文件系统下 (uniteseveral directories into a single virtual filesystem) 的文件系统, 更进一步的理解,AUFS 支持为每一个成员目录 (类似 GitBranch) 设定 readonly、readwrite 和 whiteout-able 权限, 同时 AUFS 里有一个类似分层的概念, 对 readonly 权限的 branch 可以逻辑上进行修改(增量地, 不影响 readonly 部分的)。通常 UnionFS 有两个用途, 一方面可以实现不借助 LVM、RAID 将多个 disk 挂到同一个目录下, 另一个更常用的就是将一个 readonly 的 branch 和一个 writeable 的 branch 联合在一起,LiveCD 正是基于此方法可以允许在 OSimage 不变的基础上允许用户在其上进行一些写操作。Docker 在 AUFS 上构建的 containerimage 也正是如此。

3、docker 仓库
docker 仓库用来保存我们的 images,当我们创建了自己的 image 之后我们就可以使用 push 命令将它上传到公有或者私有仓库,这样下次要在另外一台机器上使用这个 image 时候,只需要从仓库上 pull 下来就可以了。

4、docker 容器
当我们运行 dockerrun -i -t ubuntu /bin/bash 命令时,docker 在后台运行的操作如下:

如果本地有 ubuntu 这个 image 就从它创建容器,否则从公有仓库下载

从 image 创建容器

分配一个文件系统,并在只读的 image 层外面挂载一层可读写的层

从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去

从地址池配置一个 ip 地址给容器

执行你指定的程序,在这里启动一个 /bin/bash 进程

-i- t 指定标准输入和输出

5、Docker 底层技术
docker 底层的 2 个核心技术分别是 Namespaces 和 Controlgroups

以下内容摘自 InfoQDocker,自 1.20 版本开始 docker 已经抛开 lxc,不过下面的内容对于理解 docker 还是有很大帮助。

1)pidnamespace

不同用户的进程就是通过 pidnamespace 隔离开的,且不同 namespace 中可以有相同 pid。所有的 LXC 进程在 docker 中的父进程为 docker 进程,每个 lxc 进程具有不同的 namespace。同时由于允许嵌套,因此可以很方便的实现 Dockerin Docker。

2)net namespace

有了 pidnamespace, 每个 namespace 中的 pid 能够相互隔离,但是网络端口还是共享 host 的端口。网络隔离是通过 netnamespace 实现的,每个 netnamespace 有独立的 networkdevices, IP addresses, IP routing tables, /proc/net 目录。这样每个 container 的网络就能隔离开来。docker 默认采用 veth 的方式将 container 中的虚拟网卡同 host 上的一个 dockerbridge: docker0 连接在一起。

3)ipc namespace

container 中进程交互还是采用 linux 常见的进程间交互方法(interprocesscommunication – IPC), 包括常见的信号量、消息队列和共享内存。然而同 VM 不同的是,container 的进程间交互实际上还是 host 上具有相同 pidnamespace 中的进程间交互,因此需要在 IPC 资源申请时加入 namespace 信息 - 每个 IPC 资源有一个唯一的 32 位 ID。

4)mnt namespace

类似 chroot,将一个进程放到一个特定的目录执行。mntnamespace 允许不同 namespace 的进程看到的文件结构不同,这样每个 namespace 中的进程所看到的文件目录就被隔离开了。同 chroot 不同,每个 namespace 中的 container 在 /proc/mounts 的信息只包含所在 namespace 的 mountpoint。

5)uts namespace

UTS(“UNIXTime-sharing System”) namespace 允许每个 container 拥有独立的 hostname 和 domainname, 使其在网络上可以被视作一个独立的节点而非 Host 上的一个进程。

6)user namespace

每个 container 可以有不同的 user 和 groupid, 也就是说可以在 container 内部用 container 内部的用户执行程序而非 Host 上的用户。

Controlgroups 主要用来隔离各个容器和宿主主机的资源利用。

CentOS 6/ 7 系列安装 Docker http://www.linuxidc.com/Linux/2014-07/104768.htm 

Docker 的搭建 Gitlab CI 全过程详解 http://www.linuxidc.com/Linux/2013-12/93537.htm 

Docker 安装应用(CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm 

Docker 和一个正常的虚拟机有何区别? http://www.linuxidc.com/Linux/2013-12/93740.htm 

在 Docker 中使用 MySQL http://www.linuxidc.com/Linux/2014-01/95354.htm 

Docker 将改变所有事情 http://www.linuxidc.com/Linux/2013-12/93998.htm 

Docker 安装应用(CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm 

Docker 的详细介绍:请点这里
Docker 的下载地址:请点这里

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-20发表,共计3239字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中