Docker的体系结构

Docker的体系结构

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



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

1Docker的内部组件

docker有三个内部组件

  • docker  images

  • docker  registries

  • docker  containers

Docker  images

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

Docker  registries

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

Docker  containers

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

2dockerimage的工作原理

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

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

3docker仓库

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

4docker容器

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

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

  • image创建容器

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

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

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

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

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

5Docker底层技术

docker底层的2个核心技术分别是NamespacesControlgroups

以下内容摘自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资源有一个唯一的32ID

4)mnt namespace

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

5)uts namespace

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

6)user namespace

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值