From 1f6d7449c814d7ba352ea6b1329750a9bf066da4 Mon Sep 17 00:00:00 2001 From: Baohua Yang Date: Fri, 5 Sep 2014 15:49:42 +0800 Subject: [PATCH] Add the architecture chapter --- arch/README.md | 7 +++++++ arch/container.md | 9 +++++++++ arch/image.md | 3 +++ arch/internal.md | 13 +++++++++++++ arch/repo.md | 1 + arch/underly.md | 23 +++++++++++++++++++++++ 6 files changed, 56 insertions(+) diff --git a/arch/README.md b/arch/README.md index e69de29..cc9e75c 100644 --- a/arch/README.md +++ b/arch/README.md @@ -0,0 +1,7 @@ +#架构 +docker使用C/S架构,docker daemon作为server端接受client的请求,并处理(创建、运行、分发容器),他们可以运行在一个机器上,也通过sockerts或者RESTful API通信。 + +![Docker基本架构](../images/docker_arch.png) + + +Docker daemon一般在宿主主机后台运行,用户使用client而直接跟daemon交互。Docker client 以系统做bin命令的形式存在,用户用docker命令来跟docker daemon交互。 \ No newline at end of file diff --git a/arch/container.md b/arch/container.md index e69de29..d91e7e9 100644 --- a/arch/container.md +++ b/arch/container.md @@ -0,0 +1,9 @@ +当我们运行`docker run -i -t ubuntu /bin/bash`命令时,docker 在后台运行的操作如下: + +* 如果本地有ubuntu这个image就从它创建容器,否则从公有仓库下载 +* 从image创建容器 +* 分配一个文件系统,并在只读的image层外面挂载一层可读写的层 +* 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去 +* 从地址池配置一个ip地址给容器 +* 执行你指定的程序,在这里启动一个/bin/bash进程 +* -i -t 指定标准输入和输出 \ No newline at end of file diff --git a/arch/image.md b/arch/image.md index e69de29..2bb830b 100644 --- a/arch/image.md +++ b/arch/image.md @@ -0,0 +1,3 @@ +每个docker都有很多层次构成,docker使用 union file systems 将这些不同的层结合到一个image中去。 + +AUFS (AnotherUnionFS) 是一种 Union FS, 简单来说就是支持将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)的文件系统, 更进一步的理解, AUFS支持为每一个成员目录(类似Git Branch)设定readonly、readwrite 和 whiteout-able 权限, 同时 AUFS 里有一个类似分层的概念, 对 readonly 权限的 branch 可以逻辑上进行修改(增量地, 不影响 readonly 部分的)。通常 Union FS 有两个用途, 一方面可以实现不借助 LVM、RAID 将多个disk挂到同一个目录下, 另一个更常用的就是将一个 readonly 的 branch 和一个 writeable 的 branch 联合在一起,Live CD正是基于此方法可以允许在 OS image 不变的基础上允许用户在其上进行一些写操作。Docker 在 AUFS 上构建的 container image 也正是如此。 \ No newline at end of file diff --git a/arch/internal.md b/arch/internal.md index e69de29..9e74c6d 100644 --- a/arch/internal.md +++ b/arch/internal.md @@ -0,0 +1,13 @@ +docker有三个内部组件 +* docker images +* docker registries +* docker containers + +### Docker images +docker images 就是一个只读的模板。比如:一个image可以包含一个ubuntu的操作系统,里面安装了apache或者你需要的应用程序。images可以用来创建docker containers,docker提供了一个很简单的机制来创建images或者更新现有的images,你甚至可以直接从其他人那里下载一个已经做好的images + +###Docker registries +Docker registries 也叫docker 仓库,它有公有仓库和私有仓库2种形式,他们都可以用来让你上传和下载images。公有的仓库也叫 Docker Hub。它提供了一个巨大的image库可以让你下载,你也可以在自己的局域网内建一个自己的私有仓库。 + +###Docker containers +Docker containers也叫docker容器,容器是从image镜像创建的。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、安全的平台。 \ No newline at end of file diff --git a/arch/repo.md b/arch/repo.md index e69de29..bfcbd53 100644 --- a/arch/repo.md +++ b/arch/repo.md @@ -0,0 +1 @@ +docker仓库用来保存我们的images,当我们创建了自己的image之后我们就可以使用push命令将它上传到公有或者私有仓库,这样下次要在另外一台机器上使用这个image时候,只需要从仓库上pull下来就可以了。 \ No newline at end of file diff --git a/arch/underly.md b/arch/underly.md index e69de29..dc02323 100644 --- a/arch/underly.md +++ b/arch/underly.md @@ -0,0 +1,23 @@ +docker底层的2个核心技术分别是Namespaces和Control groups。 + +以下内容摘自InfoQ Docker,自1.20版本开始docker已经抛开lxc,不过下面的内容对于理解docker还是有很大帮助。 + +###pid namespace +不同用户的进程就是通过pid namespace隔离开的,且不同 namespace 中可以有相同pid。所有的LXC进程在docker中的父进程为docker进程,每个lxc进程具有不同的namespace。同时由于允许嵌套,因此可以很方便的实现 Docker in Docker。 + +###net namespace +有了 pid namespace, 每个namespace中的pid能够相互隔离,但是网络端口还是共享host的端口。网络隔离是通过net namespace实现的, 每个net namespace有独立的 network devices, IP addresses, IP routing tables, /proc/net 目录。这样每个container的网络就能隔离开来。docker默认采用veth的方式将container中的虚拟网卡同host上的一个docker bridge: docker0连接在一起。 + +###ipc namespace +container中进程交互还是采用linux常见的进程间交互方法(interprocess communication - IPC), 包括常见的信号量、消息队列和共享内存。然而同 VM 不同的是,container 的进程间交互实际上还是host上具有相同pid namespace中的进程间交互,因此需要在IPC资源申请时加入namespace信息 - 每个IPC资源有一个唯一的 32 位 ID。 + +###mnt namespace +类似chroot,将一个进程放到一个特定的目录执行。mnt namespace允许不同namespace的进程看到的文件结构不同,这样每个 namespace 中的进程所看到的文件目录就被隔离开了。同chroot不同,每个namespace中的container在/proc/mounts的信息只包含所在namespace的mount point。 + +###uts namespace +UTS("UNIX Time-sharing System") namespace允许每个container拥有独立的hostname和domain name, 使其在网络上可以被视作一个独立的节点而非Host上的一个进程。 + +###user namespace +每个container可以有不同的 user 和 group id, 也就是说可以在container内部用container内部的用户执行程序而非Host上的用户。 + +Control groups主要用来隔离各个容器和宿主主机的资源利用。 \ No newline at end of file