Update title style

Signed-off-by: Kang HuaiShuai <khs1994@khs1994.com>
This commit is contained in:
Kang HuaiShuai
2019-11-05 23:35:43 +08:00
parent 3ba7560b4d
commit 709c77adcb
39 changed files with 297 additions and 316 deletions

View File

@@ -1,4 +1,4 @@
## 基本架构
# 基本架构
Docker 采用了 `C/S` 架构包括客户端和服务端Docker 守护进程 `Daemon`作为服务端接受来自客户端的请求并处理这些请求创建运行分发容器

View File

@@ -1,4 +1,4 @@
## 控制组
# 控制组
控制组[cgroups](https://en.wikipedia.org/wiki/Cgroups))是 Linux 内核的一个特性,主要用来对共享资源进行隔离、限制、审计等。只有能控制分配到容器的资源,才能避免当多个容器同时运行时的对系统资源的竞争。

View File

@@ -1,4 +1,4 @@
## 容器格式
# 容器格式
最初Docker 采用了 `LXC` 中的容器格式 0.7 版本以后开始去除 LXC转而使用自行开发的 [libcontainer](https://github.com/docker/libcontainer),从 1.11 开始,则进一步演进为使用 [runC](https://github.com/opencontainers/runc) 和 [containerd](https://containerd.tools/)。

View File

@@ -1,22 +1,22 @@
## 命名空间
# 命名空间
命名空间是 Linux 内核一个强大的特性每个容器都有自己单独的命名空间运行在其中的应用都像是在独立的操作系统中运行一样命名空间保证了容器之间彼此互不影响
### pid 命名空间
## pid 命名空间
不同用户的进程就是通过 pid 命名空间隔离开的且不同命名空间中可以有相同 pid所有的 LXC 进程在 Docker 中的父进程为 Docker 进程每个 LXC 进程具有不同的命名空间同时由于允许嵌套因此可以很方便的实现嵌套的 Docker 容器
### net 命名空间
## net 命名空间
有了 pid 命名空间每个命名空间中的 pid 能够相互隔离但是网络端口还是共享 host 的端口网络隔离是通过 net 命名空间实现的 每个 net 命名空间有独立的 网络设备IP 地址路由表/proc/net 目录这样每个容器的网络就能隔离开来Docker 默认采用 veth 的方式将容器中的虚拟网卡同 host 上的一 个Docker 网桥 docker0 连接在一起
### ipc 命名空间
## ipc 命名空间
容器中进程交互还是采用了 Linux 常见的进程间交互方法(interprocess communication - IPC) 包括信号量消息队列和共享内存等然而同 VM 不同的是容器的进程间交互实际上还是 host 上具有相同 pid 命名空间中的进程间交互因此需要在 IPC 资源申请时加入命名空间信息每个 IPC 资源有一个唯一的 32 id
### mnt 命名空间
## mnt 命名空间
类似 chroot将一个进程放到一个特定的目录执行mnt 命名空间允许不同命名空间的进程看到的文件结构不同这样每个命名空间 中的进程所看到的文件目录就被隔离开了 chroot 不同每个命名空间中的容器在 /proc/mounts 的信息只包含所在命名空间的 mount point
### uts 命名空间
## uts 命名空间
UTS("UNIX Time-sharing System") 命名空间允许每个容器拥有独立的 hostname domain name 使其在网络上可以被视作一个独立的节点而非 主机上的一个进程
### user 命名空间
## user 命名空间
每个容器可以有不同的用户和组 id 也就是说可以在容器内用容器内部的用户执行程序而非主机上的用户
*更多关于 Linux 上命名空间的信息请阅读 [这篇文章](https://blog.scottlowe.org/2013/09/04/introducing-linux-network-namespaces/)。

View File

@@ -1,8 +1,8 @@
## Docker 网络实现
# Docker 网络实现
Docker 的网络实现其实就是利用了 Linux 上的网络命名空间和虚拟网络设备特别是 veth pair建议先熟悉了解这两部分的基本概念再阅读本章
### 基本原理
## 基本原理
首先要实现网络通信机器需要至少一个网络接口物理接口或虚拟接口来收发数据包此外如果不同子网之间要进行通信需要路由机制
Docker 中的网络接口默认都是虚拟的接口虚拟接口的优势之一是转发效率较高
@@ -10,7 +10,7 @@ Linux 通过在内核中进行数据复制来实现虚拟接口之间的数据
Docker 容器网络就利用了这项技术它在本地主机和容器内分别创建一个虚拟接口并让它们彼此连通这样的一对接口叫做 `veth pair`
### 创建网络参数
## 创建网络参数
Docker 创建一个容器的时候会执行如下操作
* 创建一对虚拟接口分别放到本地主机和新容器中
* 本地主机一端桥接到默认的 docker0 或指定网桥上并具有一个唯一的名字 veth65f9
@@ -25,7 +25,7 @@ Docker 创建一个容器的时候,会执行如下操作:
* `--net=container:NAME_or_ID` Docker 将新建容器的进程放到一个已存在容器的网络栈中新容器进程有自己的文件系统进程列表和资源限制但会和已存在的容器共享 IP 地址和端口等网络资源两者进程可以直接通过 `lo` 环回接口通信
* `--net=none` Docker 将新容器放到隔离的网络栈中但是不进行网络配置之后用户可以自己进行配置
### 网络配置细节
## 网络配置细节
用户使用 `--net=none` 可以自行配置网络让容器达到跟平常一样具有访问网络的权限通过这个过程可以了解 Docker 配置网络的细节
首先启动一个 `/bin/bash` 容器指定 `--net=none` 参数

View File

@@ -1,4 +1,4 @@
## 联合文件系统
# 联合文件系统
联合文件系统[UnionFS](https://en.wikipedia.org/wiki/UnionFS))是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。