translate underly into traditional chinese

This commit is contained in:
a504082002
2014-11-19 01:03:13 +08:00
parent cb4963b8fa
commit 6b168bced1
7 changed files with 71 additions and 71 deletions

View File

@@ -1,13 +1,13 @@
# 底层实现
# 底層實現
Docker 底的核心技包括 Linux 上的名字空Namespaces、控制Control groups、Union 文件系Union file systems和容器格式Container format
Docker 底的核心技包括 Linux 上的名字空Namespaces、控制Control groups、Union 文件系Union file systems和容器格式Container format
知道,传统的虚拟机通过在宿主主机中运行 hypervisor 来模拟一整套完整的硬件境提供给虚拟机的操作系统。虚拟机系统看到的境是可限制的,也是彼此隔的。
这种直接的做法实现了对资源最完整的封,但很多候往往意味着系统资源的浪
例如,以宿主机和虚拟机系统都为 Linux 系统为例,虚拟机中运行的用其可以利用宿主机系统中的运行环境。
知道,傳統的虛擬機通過在宿主主機中運行 hypervisor 來模擬一整套完整的硬件境提供給虛擬機的操作系統。虛擬機系統看到的境是可限制的,也是彼此隔的。
這種直接的做法實現了對資源最完整的封,但很多候往往意味著系統資源的浪
例如,以宿主機和虛擬機系統都為 Linux 系統為例,虛擬機中運行的用其可以利用宿主機系統中的運行環境。
知道,在操作系中,包括核、文件系统、网络、PID、UID、IPC、存、硬、CPU 等等,所有的源都是应用进程直接共享的。
要想实现虚拟化,除了要实现对内存、CPU、网络IO、硬IO、存储空间等的限制外,还要实现文件系统、网络、PID、UID、IPC等等的相互隔
前者相容易实现一些,后者则需要宿主机系统的深入支持。
知道,在操作系中,包括核、文件系統、網絡、PID、UID、IPC、存、硬、CPU 等等,所有的源都是應用進程直接共享的。
要想實現虛擬化,除了要實現對內存、CPU、網絡IO、硬IO、存儲空間等的限制外,還要實現文件系統、網絡、PID、UID、IPC等等的相互隔
前者相容易實現一些,後者則需要宿主機系統的深入支持。
随着 Linux 系统对于名字空功能的完善实现,程序员已经可以实现上面的所有需求,某些程在彼此隔的名字空间中运行。大家然都共用一个内核和某些运行时环境(例如一些系命令和系统库),但是彼此看不到,都以为系统中只有自己的存在。这种机制就是容器Container利用名字空间来做权限的隔控制,利用 cgroups 来做资源分配。
隨著 Linux 系統對於名字空功能的完善實現,程序員已經可以實現上面的所有需求,某些程在彼此隔的名字空間中運行。大家然都共用一個內核和某些運行時環境(例如一些系命令和系統庫),但是彼此看不到,都以為系統中只有自己的存在。這種機制就是容器Container利用名字空間來做權限的隔控制,利用 cgroups 來做資源分配。

View File

@@ -1,10 +1,10 @@
## 基本架
Docker 采用了 C/S架,包括客端和服端。
Docker daemon 作为服务端接受自客户的请求,并处理这些请求(建、行、分容器)。
端和服端既可以行在一个机器上,也可通 socket 或者 RESTful API 来进行通信。
## 基本架
Docker 采用了 C/S架,包括客端和服端。
Docker daemon 作為服務端接受自客戶的請求,並處理這些請求(建、行、分容器)。
端和服端既可以行在一個機器上,也可通 socket 或者 RESTful API 來進行通信。
![Docker 基本架](../_images/docker_arch.png)
![Docker 基本架](../_images/docker_arch.png)
Docker daemon 一般在宿主主机后台运行,等待接收自客端的消息。
Docker 客户端则为用户提供一系列可行命令,用户用这些命令实现跟 Docker daemon 交互。
Docker daemon 一般在宿主主機後臺運行,等待接收自客端的消息。
Docker 客戶端則為用戶提供一系列可行命令,用戶用這些命令實現跟 Docker daemon 交互。

View File

@@ -1,9 +1,9 @@
## 控制
## 控制
控制[cgroups](http://en.wikipedia.org/wiki/Cgroups))是 Linux 核的一特性,主要用来对共享资源进行隔、限制、审计等。只有能控制分配到容器的源,才能避免当多个容器同时运行时的对系统资源的竞争
控制[cgroups](http://en.wikipedia.org/wiki/Cgroups))是 Linux 核的一特性,主要用來對共享資源進行隔、限制、審計等。只有能控制分配到容器的源,才能避免當多個容器同時運行時的對系統資源的競爭
控制组技术最早是由 Google 的程序 2006 年起提出Linux 核自 2.6.24 始支持。
控制組技術最早是由 Google 的程序 2006 年起提出Linux 核自 2.6.24 始支持。
控制可以提供容器的存、CPU、磁 IO 等源的限制和审计管理。
控制可以提供容器的存、CPU、磁 IO 等源的限制和審計管理。

View File

@@ -1,4 +1,4 @@
## 容器格式
最初Docker 采用了 LXC 中的容器格式。自 1.20 版本Docker 也始支持新的 [libcontainer](https://github.com/docker/libcontainer) 格式,并作为默认选项
最初Docker 采用了 LXC 中的容器格式。自 1.20 版本Docker 也始支持新的 [libcontainer](https://github.com/docker/libcontainer) 格式,並作為默認選項
更多容器格式的支持,还在进一步的展中。
更多容器格式的支持,還在進一步的展中。

View File

@@ -1,22 +1,22 @@
## 名字空
名字空是 Linux 核一个强大的特性。每容器都有自己单独的名字空间,运行在其中的用都像是在立的操作系统中运行一。名字空间保证了容器之彼此互不影
## 名字空
名字空是 Linux 核一個強大的特性。每容器都有自己單獨的名字空間,運行在其中的用都像是在立的操作系統中運行一。名字空間保證了容器之彼此互不影
### pid 名字空
不同用户的进程就是通 pid 名字空间隔离开的,且不同名字空中可以有相同 pid。所有的 LXC 程在 Docker 中的父进程为Docker程,每 LXC 程具有不同的名字空。同时由于允许嵌套,因此可以很方便的实现嵌套的 Docker 容器。
### pid 名字空
不同用戶的進程就是通 pid 名字空間隔離開的,且不同名字空中可以有相同 pid。所有的 LXC 程在 Docker 中的父進程為Docker程,每 LXC 程具有不同的名字空。同時由於允許嵌套,因此可以很方便的實現嵌套的 Docker 容器。
### net 名字空
有了 pid 名字空, 每名字空中的 pid 能相互隔,但是网络端口是共享 host 的端口。网络隔离是通 net 名字空间实现的, 每 net 名字空间有独立的 网络设备, IP 地址, 路由表, /proc/net 目录。这样每个容器的网络就能隔离开来。Docker 默采用 veth 的方式,容器中的虚拟网卡同 host 上的一 Docker 网桥 docker0 接在一起。
### net 名字空
有了 pid 名字空, 每名字空中的 pid 能相互隔,但是網絡端口是共享 host 的端口。網絡隔離是通 net 名字空間實現的, 每 net 名字空間有獨立的 網絡設備, IP 地址, 路由表, /proc/net 目錄。這樣每個容器的網絡就能隔離開來。Docker 默采用 veth 的方式,容器中的虛擬網卡同 host 上的一 Docker 網橋 docker0 接在一起。
### ipc 名字空
容器中程交互是采用了 Linux 常见的进程间交互方法(interprocess communication - IPC), 包括信量、消息列和共享存等。然而同 VM 不同的是,容器的进程间交互实际上还是 host 上具有相同 pid 名字空中的进程间交互,因此需要在 IPC 源申请时加入名字空信息,每 IPC 源有一唯一的 32 位 id。
### ipc 名字空
容器中程交互是采用了 Linux 常見的進程間交互方法(interprocess communication - IPC), 包括信量、消息列和共享存等。然而同 VM 不同的是,容器的進程間交互實際上還是 host 上具有相同 pid 名字空中的進程間交互,因此需要在 IPC 源申請時加入名字空信息,每 IPC 源有一唯一的 32 位 id。
### mnt 名字空
似 chroot将一个进程放到一特定的目录执行。mnt 名字空间允许不同名字空间的进程看到的文件结构不同,这样每个名字空 中的程所看到的文件目就被隔离开了。同 chroot 不同,每名字空中的容器在 /proc/mounts 的信息只包含所在名字空的 mount point。
### mnt 名字空
似 chroot將一個進程放到一特定的目錄執行。mnt 名字空間允許不同名字空間的進程看到的文件結構不同,這樣每個名字空 中的程所看到的文件目就被隔離開了。同 chroot 不同,每名字空中的容器在 /proc/mounts 的信息只包含所在名字空的 mount point。
### uts 名字空
UTS("UNIX Time-sharing System") 名字空间允许每个容器拥有独立的 hostname 和 domain name, 使其在网络上可以被作一个独立的节点而非 主上的一个进程。
### uts 名字空
UTS("UNIX Time-sharing System") 名字空間允許每個容器擁有獨立的 hostname 和 domain name, 使其在網絡上可以被作一個獨立的節點而非 主上的一個進程。
### user 名字空
容器可以有不同的用户和组 id, 也就是可以在容器用容器部的用户执行程序而非主上的用
### user 名字空
容器可以有不同的用戶和組 id, 也就是可以在容器用容器部的用戶執行程序而非主上的用
*注:关于 Linux 上的名字空[篇文章](http://blog.scottlowe.org/2013/09/04/introducing-linux-network-namespaces/) 介的很好。
*註:關於 Linux 上的名字空[篇文章](http://blog.scottlowe.org/2013/09/04/introducing-linux-network-namespaces/) 介的很好。

View File

@@ -1,39 +1,39 @@
## Docker 网络实现
## Docker 網絡實現
Docker 的网络实现其实就是利用了 Linux 上的网络名字空间和虚拟网络设备(特是 veth pair。建先熟悉了解这两部分的基本概念再阅读本章。
Docker 的網絡實現其實就是利用了 Linux 上的網絡名字空間和虛擬網絡設備(特是 veth pair。建先熟悉了解這兩部分的基本概念再閱讀本章。
### 基本原理
首先,要实现网络通信,器需要至少一个网络接口(物理接口或虚拟接口)来收发数据包;此外,如果不同子网之间要进行通信,需要路由制。
首先,要實現網絡通信,器需要至少一個網絡接口(物理接口或虛擬接口)來收發數據包;此外,如果不同子網之間要進行通信,需要路由制。
Docker 中的网络接口默都是虚拟的接口。虚拟接口的优势之一是转发效率高。
Linux 通过在内核中进行数据复制来实现虚拟接口之间的数据转发,发送接口的发送缓存中的数据包被直接制到接收接口的接收存中。对于本地系和容器内系统看来就像是一正常的以太卡,只是它不需要真正同外部网络设备通信,速度要快很多。
Docker 中的網絡接口默都是虛擬的接口。虛擬接口的優勢之一是轉發效率高。
Linux 通過在內核中進行數據復制來實現虛擬接口之間的數據轉發,發送接口的發送緩存中的數據包被直接制到接收接口的接收存中。對於本地系和容器內系統看來就像是一正常的以太卡,只是它不需要真正同外部網絡設備通信,速度要快很多。
Docker 容器网络就利用了这项技术。它在本地主和容器内分别创建一个虚拟接口,并让它们彼此通(这样的一接口叫做 `veth pair`)。
Docker 容器網絡就利用了這項技術。它在本地主和容器內分別創建一個虛擬接口,並讓它們彼此通(這樣的一接口叫做 `veth pair`)。
### 创建网络参数
Docker 建一容器的候,会执行如下操作:
* 建一对虚拟接口,分放到本地主和新容器中;
* 本地主一端接到默的 docker0 或指定网桥上,具有一唯一的名字,如 veth65f9
* 容器一端放到新容器中,修改名字作 eth0这个接口只在容器的名字空间可见
* 从网桥可用地址段中取一个空闲地址分配容器的 eth0配置默路由到桥接网卡 veth65f9。
### 創建網絡參數
Docker 建一容器的候,會執行如下操作:
* 建一對虛擬接口,分放到本地主和新容器中;
* 本地主一端接到默的 docker0 或指定網橋上,具有一唯一的名字,如 veth65f9
* 容器一端放到新容器中,修改名字作 eth0這個接口只在容器的名字空間可見
* 從網橋可用地址段中取一個空閑地址分配容器的 eth0配置默路由到橋接網卡 veth65f9。
完成些之,容器就可以使用 eth0 虚拟网卡来连接其他容器和其他网络
完成些之,容器就可以使用 eth0 虛擬網卡來連接其他容器和其他網絡
可以在 `docker run`候通 `--net` 参数来指定容器的网络配置有4个可选值:
* `--net=bridge` 这个是默值,接到默认的网桥
* `--net=host` Docker 不要容器网络放到隔的名字空中,即不要容器化容器内的网络。此容器使用本地主机的网络,它有完全的本地主接口访问权限。容器程可以跟主其它 root 程一可以打开低范围的端口,可以访问本地网络服务比如 D-bus可以容器做一些影响整个主机系统的事情,比如重启主机。因此使用这个选项的时候要非常小心。如果一步的使用 `--privileged=true`,容器被允直接配置主机的网络堆栈
* `--net=container:NAME_or_ID` Docker 新建容器的程放到一已存在容器的网络栈中,新容器程有自己的文件系统、进程列表和源限制,但和已存在的容器共享 IP 地址和端口等网络资源,两者进程可以直接通 `lo` 回接口通信。
* `--net=none` Docker 新容器放到隔离的网络栈中,但是不进行网络配置。之,用可以自己行配置。
可以在 `docker run`候通 `--net` 參數來指定容器的網絡配置有4個可選值:
* `--net=bridge` 這個是默值,接到默認的網橋
* `--net=host` Docker 不要容器網絡放到隔的名字空中,即不要容器化容器內的網絡。此容器使用本地主機的網絡,它有完全的本地主接口訪問權限。容器程可以跟主其它 root 程一可以打開低範圍的端口,可以訪問本地網絡服務比如 D-bus可以容器做一些影響整個主機系統的事情,比如重啟主機。因此使用這個選項的時候要非常小心。如果一步的使用 `--privileged=true`,容器被允直接配置主機的網絡堆棧
* `--net=container:NAME_or_ID` Docker 新建容器的程放到一已存在容器的網絡棧中,新容器程有自己的文件系統、進程列表和源限制,但和已存在的容器共享 IP 地址和端口等網絡資源,兩者進程可以直接通 `lo` 回接口通信。
* `--net=none` Docker 新容器放到隔離的網絡棧中,但是不進行網絡配置。之,用可以自己行配置。
### 网络配置细节
使用 `--net=none` ,可以自行配置网络,让容器到跟平常一具有访问网络的权限。通过这个过程,可以了解 Docker 配置网络的细节
### 網絡配置細節
使用 `--net=none` ,可以自行配置網絡,讓容器到跟平常一具有訪問網絡的權限。通過這個過程,可以了解 Docker 配置網絡的細節
首先,启动一个 `/bin/bash` 容器,指定 `--net=none` 参数
首先,啟動一個 `/bin/bash` 容器,指定 `--net=none` 參數
```
$ sudo docker run -i -t --rm --net=none base /bin/bash
root@63f36fc01b5f:/#
```
在本地主查找容器的程 id并为它创建网络命名空
在本地主查找容器的程 id並為它創建網絡命名空
```
$ sudo docker inspect -f '{{.State.Pid}}' 63f36fc01b5f
2778
@@ -41,20 +41,20 @@ $ pid=2778
$ sudo mkdir -p /var/run/netns
$ sudo ln -s /proc/$pid/ns/net /var/run/netns/$pid
```
检查桥接网卡的 IP 和子网掩码信息。
檢查橋接網卡的 IP 和子網掩碼信息。
```
$ ip addr show docker0
21: docker0: ...
inet 172.17.42.1/16 scope global docker0
...
```
建一 “veth pair” 接口 A 和 B定 A 到网桥 `docker0`并启用它
建一 “veth pair” 接口 A 和 B定 A 到網橋 `docker0`並啟用它
```
$ sudo ip link add A type veth peer name B
$ sudo brctl addif docker0 A
$ sudo ip link set A up
```
B放到容器的网络命名空,命名 eth0启动它并配置一可用 IP桥接网段)和默认网关
B放到容器的網絡命名空,命名 eth0啟動它並配置一可用 IP橋接網段)和默認網關
```
$ sudo ip link set B netns $pid
$ sudo ip netns exec $pid ip link set dev B name eth0
@@ -62,8 +62,8 @@ $ sudo ip netns exec $pid ip link set eth0 up
$ sudo ip netns exec $pid ip addr add 172.17.42.99/16 dev eth0
$ sudo ip netns exec $pid ip route add default via 172.17.42.1
```
以上,就是 Docker 配置网络的具体过程。
以上,就是 Docker 配置網絡的具體過程。
容器结束后Docker 清空容器,容器的 eth0 会随网络命名空一起被清除A 接口也被自动从 `docker0`
容器結束後Docker 清空容器,容器的 eth0 會隨網絡命名空一起被清除A 接口也被自動從 `docker0`
此外,用可以使用 `ip netns exec` 命令在指定网络名字空间中进行配置,而配置容器内的网络
此外,用可以使用 `ip netns exec` 命令在指定網絡名字空間中進行配置,而配置容器內的網絡

View File

@@ -1,10 +1,10 @@
## Union 文件系
Union文件系[UnionFS](http://en.wikipedia.org/wiki/UnionFS))是一种分层、轻量级并且高性能的文件系,它支持文件系的修改作一次提交来一层层的叠加,同可以不同目录挂载到同一个虚拟文件系下(unite several directories into a single virtual filesystem)。
## Union 文件系
Union文件系[UnionFS](http://en.wikipedia.org/wiki/UnionFS))是一種分層、輕量級並且高性能的文件系,它支持文件系的修改作一次提交來一層層的疊加,同可以不同目錄掛載到同一個虛擬文件系下(unite several directories into a single virtual filesystem)。
Union 文件系是 Docker 像的基础。镜像可以通过分层来进行继承,基于基础镜像(有父像),可以制作各种具体的应用镜像。
Union 文件系是 Docker 像的基礎。鏡像可以通過分層來進行繼承,基於基礎鏡像(有父像),可以制作各種具體的應用鏡像。
另外,不同 Docker 容器就可以共享一些基的文件系统层,同再加上自己有的改动层,大大提高了存的效率。
另外,不同 Docker 容器就可以共享一些基的文件系統層,同再加上自己有的改動層,大大提高了存的效率。
Docker 中使用的 AUFSAnotherUnionFS就是一 Union FS。 AUFS 支持每一个成员目录(类似 Git 的分支)定只readonly读写readwritewhiteout-able限, 同 AUFS 有一个类似分的概念, 对只读权限的分支可以逻辑上进行增量地修改(不影响只读部分的)。
Docker 中使用的 AUFSAnotherUnionFS就是一 Union FS。 AUFS 支持每一個成員目錄(類似 Git 的分支)定只readonly讀寫readwritewhiteout-able限, 同 AUFS 有一個類似分的概念, 對只讀權限的分支可以邏輯上進行增量地修改(不影響只讀部分的)。
Docker 目前支持的 Union 文件系统种类包括 AUFS, btrfs, vfs 和 DeviceMapper。
Docker 目前支持的 Union 文件系統種類包括 AUFS, btrfs, vfs 和 DeviceMapper。