merge master and develop

This commit is contained in:
a504082002
2014-11-20 00:59:41 +08:00
69 changed files with 730 additions and 730 deletions

View File

@@ -1,12 +1,12 @@
# 高级网络配置
本章将介绍 Docker 的一些高级网络配置和选项
# 高級網絡配置
本章將介紹 Docker 的一些高級網絡配置和選項
Docker 启动时,会自动在主机上创建一 `docker0` 虚拟网桥,实际上是 Linux 的一 bridge可以理解为一个软件交换机。它会在挂载到它的口之间进行转发
Docker 啟動時,會自動在主機上創建一 `docker0` 虛擬網橋,實際上是 Linux 的一 bridge可以理解為一個軟件交換機。它會在掛載到它的口之間進行轉發
Docker 随机分配一本地未占用的私有段(在 [RFC1918](http://tools.ietf.org/html/rfc1918) 中定)中的一地址 `docker0` 接口。比如典型的 `172.17.42.1`,掩码为 `255.255.0.0`。此后启动的容器内的网口也会自动分配一同一段(`172.17.0.0/16`)的地址。
Docker 隨機分配一本地未占用的私有段(在 [RFC1918](http://tools.ietf.org/html/rfc1918) 中定)中的一地址 `docker0` 接口。比如典型的 `172.17.42.1`,掩碼為 `255.255.0.0`。此後啟動的容器內的網口也會自動分配一同一段(`172.17.0.0/16`)的地址。
当创建一 Docker 容器的候,同时会创建了一 `veth pair` 接口(当数据包发送到一接口,另外一接口也可以收到相同的数据包)。这对接口一端在容器,即 `eth0`;另一端在本地并被挂载`docker0` 网桥,名`veth` 开头(例如 `vethAQI2QT`)。通过这种方式,主可以跟容器通信,容器之也可以相互通信。Docker 就建了在主和所有容器之间一个虚拟共享网络
當創建一 Docker 容器的候,同時會創建了一 `veth pair` 接口(當數據包發送到一接口,另外一接口也可以收到相同的數據包)。這對接口一端在容器,即 `eth0`;另一端在本地並被掛載`docker0` 網橋,名`veth` 開頭(例如 `vethAQI2QT`)。通過這種方式,主可以跟容器通信,容器之也可以相互通信。Docker 就建了在主和所有容器之間一個虛擬共享網絡
![Docker 网络](../_images/network.png)
![Docker 網絡](../_images/network.png)
接下的部分将介绍在一些景中Docker 所有的网络定制配置。以及通 Linux 命令来调整、充、甚至替 Docker 默认的网络配置。
接下的部分將介紹在一些景中Docker 所有的網絡定制配置。以及通 Linux 命令來調整、充、甚至替 Docker 默認的網絡配置。

View File

@@ -1,35 +1,35 @@
## 容器访问控制
容器的访问控制,主要通 Linux 上的 `iptables` 防火墙来进行管理和实现`iptables` 是 Linux 上默的防火墙软件,在大部分行版中都自
## 容器訪問控制
容器的訪問控制,主要通 Linux 上的 `iptables` 防火墻來進行管理和實現`iptables` 是 Linux 上默的防火墻軟件,在大部分行版中都自
### 容器访问外部网络
容器要想访问外部网络,需要本地系统的转发支持。在Linux 系中,检查转发是否打
### 容器訪問外部網絡
容器要想訪問外部網絡,需要本地系統的轉發支持。在Linux 系中,檢查轉發是否打
```
$sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
```
如果 0说明没有开启转发,则需要手动打开
如果 0說明沒有開啟轉發,則需要手動打開
```
$sysctl -w net.ipv4.ip_forward=1
```
如果在启动 Docker 服务的时候设`--ip-forward=true`, Docker 就会自动设定系`ip_forward` 参数为 1。
如果在啟動 Docker 服務的時候設`--ip-forward=true`, Docker 就會自動設定系`ip_forward` 參數為 1。
### 容器之间访问
容器之相互访问,需要方面的支持。
* 容器的网络拓扑是否已经互联。默认情况下,所有容器都会被连接到 `docker0` 网桥上。
* 本地系的防火墙软件 -- `iptables` 是否允许通过
### 容器之間訪問
容器之相互訪問,需要方面的支持。
* 容器的網絡拓撲是否已經互聯。默認情況下,所有容器都會被連接到 `docker0` 網橋上。
* 本地系的防火墻軟件 -- `iptables` 是否允許通過
#### 访问所有端口
当启动 Docker 服务时候,默认会添加一条转发策略到 iptables 的 FORWARD 上。策略为通过`ACCEPT`是禁止(`DROP`)取决于配置`--icc=true`(缺省值)`--icc=false`然,如果手指定 `--iptables=false` 则不会添加 `iptables` 规则
#### 訪問所有端口
當啟動 Docker 服務時候,默認會添加一條轉發策略到 iptables 的 FORWARD 上。策略為通過`ACCEPT`是禁止(`DROP`)取決於配置`--icc=true`(缺省值)`--icc=false`然,如果手指定 `--iptables=false` 則不會添加 `iptables` 規則
,默认情况下,不同容器之是允许网络互通的。如果了安全考,可以在 `/etc/default/docker` 文件中配置 `DOCKER_OPTS=--icc=false` 禁止它。
,默認情況下,不同容器之是允許網絡互通的。如果了安全考,可以在 `/etc/default/docker` 文件中配置 `DOCKER_OPTS=--icc=false` 禁止它。
#### 访问指定端口
在通 `-icc=false` 关闭网络访问后,还可以通 `--link=CONTAINER_NAME:ALIAS` 选项来访问容器的放端口。
#### 訪問指定端口
在通 `-icc=false` 關閉網絡訪問後,還可以通 `--link=CONTAINER_NAME:ALIAS` 選項來訪問容器的放端口。
例如,在启动 Docker 服务时,可以同使用 `icc=false --iptables=true` 参数来关闭允许相互的网络访问,并让 Docker 可以修改系中的 `iptables` 规则
例如,在啟動 Docker 服務時,可以同使用 `icc=false --iptables=true` 參數來關閉允許相互的網絡訪問,並讓 Docker 可以修改系中的 `iptables` 規則
,系中的 `iptables` 规则可能是
,系中的 `iptables` 規則可能是
```
$ sudo iptables -nL
...
@@ -39,9 +39,9 @@ DROP all -- 0.0.0.0/0 0.0.0.0/0
...
```
后,启动容器(`docker run`使用 `--link=CONTAINER_NAME:ALIAS` 选项。Docker `iptable`为 两个容器分添加一 `ACCEPT` 规则,允相互访问开放的端口(取决于 Dockerfile 中的 EXPOSE 行)。
後,啟動容器(`docker run`使用 `--link=CONTAINER_NAME:ALIAS` 選項。Docker `iptable`為 兩個容器分添加一 `ACCEPT` 規則,允相互訪問開放的端口(取決於 Dockerfile 中的 EXPOSE 行)。
添加了 `--link=CONTAINER_NAME:ALIAS` 选项后,添加了 `iptables` 规则
添加了 `--link=CONTAINER_NAME:ALIAS` 選項後,添加了 `iptables` 規則
```
$ sudo iptables -nL
...
@@ -52,4 +52,4 @@ ACCEPT tcp -- 172.17.0.3 172.17.0.2 tcp dpt:80
DROP all -- 0.0.0.0/0 0.0.0.0/0
```
意:`--link=CONTAINER_NAME:ALIAS` 中的 `CONTAINER_NAME` 目前必是 Docker 分配的名字,或使用 `--name` 参数指定的名字。主机名则不会被识别
意:`--link=CONTAINER_NAME:ALIAS` 中的 `CONTAINER_NAME` 目前必是 Docker 分配的名字,或使用 `--name` 參數指定的名字。主機名則不會被識別

View File

@@ -1,21 +1,21 @@
## 自定义网桥
除了默`docker0` 网桥,用也可以指定网桥来连接各容器。
## 自定義網橋
除了默`docker0` 網橋,用也可以指定網橋來連接各容器。
启动 Docker 服务的时候,使用 `-b BRIDGE``--bridge=BRIDGE` 指定使用的网桥
啟動 Docker 服務的時候,使用 `-b BRIDGE``--bridge=BRIDGE` 指定使用的網橋
如果服务已经运行,那需要先停止服务,并删除旧的网桥
如果服務已經運行,那需要先停止服務,並刪除舊的網橋
```
$ sudo service docker stop
$ sudo ip link set dev docker0 down
$ sudo brctl delbr docker0
```
后创建一个网桥 `bridge0`
後創建一個網橋 `bridge0`
```
$ sudo brctl addbr bridge0
$ sudo ip addr add 192.168.5.1/24 dev bridge0
$ sudo ip link set dev bridge0 up
```
查看确认网桥创建并启动
查看確認網橋創建並啟動
```
$ ip addr show bridge0
4: bridge0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state UP group default
@@ -23,12 +23,12 @@ $ ip addr show bridge0
inet 192.168.5.1/24 scope global bridge0
valid_lft forever preferred_lft forever
```
配置 Docker 服,默认桥接到建的网桥上。
配置 Docker 服,默認橋接到建的網橋上。
```
$ echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker
$ sudo service docker start
```
启动 Docker 服
新建一容器,可以看到它已经桥接到了 `bridge0` 上。
啟動 Docker 服
新建一容器,可以看到它已經橋接到了 `bridge0` 上。
可以继续`brctl show` 命令查看接的信息。另外,在容器中可以使用 `ip addr``ip route` 命令查看 IP 地址配置和路由信息。
可以繼續`brctl show` 命令查看接的信息。另外,在容器中可以使用 `ip addr``ip route` 命令查看 IP 地址配置和路由信息。

View File

@@ -1,5 +1,5 @@
## 编辑网络配置文件
## 編輯網絡配置文件
Docker 1.2.0 始支持在行中的容器里编辑 `/etc/hosts`, `/etc/hostname``/etc/resolve.conf` 文件。
Docker 1.2.0 始支持在行中的容器裏編輯 `/etc/hosts`, `/etc/hostname``/etc/resolve.conf` 文件。
但是些修改是临时的,只在行的容器中保留,容器止或重启后并不会被保存下。也不`docker commit` 提交。
但是些修改是臨時的,只在行的容器中保留,容器止或重啟後並不會被保存下。也不`docker commit` 提交。

View File

@@ -1,8 +1,8 @@
## 配置 DNS
Docker 没有为每个容器专门定制像,那么怎么自定配置容器的主名和 DNS 配置呢?
就是它利用虚拟文件来挂载到来容器的 3 个相关配置文件。
Docker 沒有為每個容器專門定制像,那麽怎麽自定配置容器的主名和 DNS 配置呢?
就是它利用虛擬文件來掛載到來容器的 3 個相關配置文件。
在容器中使用 mount 命令可以看到挂载信息:
在容器中使用 mount 命令可以看到掛載信息:
```
$ mount
...
@@ -11,19 +11,19 @@ $ mount
tmpfs on /etc/resolv.conf type tmpfs ...
...
```
这种机制可以宿主主 DNS 信息生更新,所有 Docker 容器的 dns 配置通 `/etc/resolv.conf` 文件立刻得到更新。
這種機制可以宿主主 DNS 信息生更新,所有 Docker 容器的 dns 配置通 `/etc/resolv.conf` 文件立刻得到更新。
如果用想要手指定容器的配置,可以利用下面的选项
如果用想要手指定容器的配置,可以利用下面的選項
`-h HOSTNAME or --hostname=HOSTNAME`
定容器的主名,它会被写到容器`/etc/hostname``/etc/hosts`。但它在容器外部看不到,既不`docker ps`示,也不在其他的容器的 `/etc/hosts` 看到。
定容器的主名,它會被寫到容器`/etc/hostname``/etc/hosts`。但它在容器外部看不到,既不`docker ps`示,也不在其他的容器的 `/etc/hosts` 看到。
`--link=CONTAINER_NAME:ALIAS`
选项会在创建容器的候,添加一其他容器的主名到 `/etc/hosts` 文件中,新容器的程可以使用主名 ALIAS 就可以接它。
選項會在創建容器的候,添加一其他容器的主名到 `/etc/hosts` 文件中,新容器的程可以使用主名 ALIAS 就可以接它。
`--dns=IP_ADDRESS`
添加 DNS 服器到容器的 `/etc/resolv.conf` 中,容器用这个服务器来解析所有不在 `/etc/hosts` 中的主名。
添加 DNS 服器到容器的 `/etc/resolv.conf` 中,容器用這個服務器來解析所有不在 `/etc/hosts` 中的主名。
`--dns-search=DOMAIN`
定容器的搜索域,当设定搜索域 `.example.com` ,在搜索一个名为 host 的主机时DNS 不搜索host还会搜索 `host.example.com`
意:如果有上述最 2 个选项Docker 会默认用主上的 `/etc/resolv.conf` 配置容器。
定容器的搜索域,當設定搜索域 `.example.com` ,在搜索一個名為 host 的主機時DNS 不搜索host還會搜索 `host.example.com`
意:如果有上述最 2 個選項Docker 會默認用主上的 `/etc/resolv.conf` 配置容器。

View File

@@ -1,22 +1,22 @@
## 配置 docker0 网桥
Docker 服务默认会创建一 `docker0` 网桥(其上有一 `docker0` 部接口),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主都放到同一物理网络
## 配置 docker0 網橋
Docker 服務默認會創建一 `docker0` 網橋(其上有一 `docker0` 部接口),它在內核層連通了其他的物理或虛擬網卡,這就將所有容器和本地主都放到同一物理網絡
Docker 默指定了 `docker0` 接口 的 IP 地址和子网掩码,让主机和容器之可以通过网桥相互通信,它还给出了 MTU接口允接收的最大传输单元),通常是 1500 Bytes或宿主主机网络路由上支持的默值。些值都可以在服务启动的时候进行配置。
* `--bip=CIDR` -- IP 地址加掩格式,例如 192.168.1.5/24
* `--mtu=BYTES` -- 覆盖默认的 Docker mtu 配置
Docker 默指定了 `docker0` 接口 的 IP 地址和子網掩碼,讓主機和容器之可以通過網橋相互通信,它還給出了 MTU接口允接收的最大傳輸單元),通常是 1500 Bytes或宿主主機網絡路由上支持的默值。些值都可以在服務啟動的時候進行配置。
* `--bip=CIDR` -- IP 地址加掩格式,例如 192.168.1.5/24
* `--mtu=BYTES` -- 覆蓋默認的 Docker mtu 配置
也可以在配置文件中配置 DOCKER_OPTS后重启服务
目前 Docker 网桥是 Linux 网桥,用可以使用 `brctl show` 查看网桥和端口接信息。
也可以在配置文件中配置 DOCKER_OPTS後重啟服務
目前 Docker 網橋是 Linux 網橋,用可以使用 `brctl show` 查看網橋和端口接信息。
```
$ sudo brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.3a1d7362b4ee no veth65f9
vethdda6
```
*`brctl` 命令在 Debian、Ubuntu 中可以使用 `sudo apt-get install bridge-utils` 来安装
*`brctl` 命令在 Debian、Ubuntu 中可以使用 `sudo apt-get install bridge-utils` 來安裝
每次建一新容器的Docker 可用的地址段中选择一个空闲的 IP 地址分配容器的 eth0 端口。使用本地主`docker0` 接口的 IP 作所有容器的默认网关
每次建一新容器的Docker 可用的地址段中選擇一個空閑的 IP 地址分配容器的 eth0 端口。使用本地主`docker0` 接口的 IP 作所有容器的默認網關
```
$ sudo docker run -i -t --rm base /bin/bash
$ ip addr show eth0

View File

@@ -1,8 +1,8 @@
## 工具和示例
在介自定义网络拓扑之前,你可能会对一些外部工具和例子感趣:
在介自定義網絡拓撲之前,你可能會對一些外部工具和例子感趣:
### pipework
Jérôme Petazzoni 编写了一叫 [pipework](https://github.com/jpetazzo/pipework) 的 shell 本,可以助用在比较复杂的场景中完成容器的接。
Jérôme Petazzoni 編寫了一叫 [pipework](https://github.com/jpetazzo/pipework) 的 shell 本,可以助用在比較復雜的場景中完成容器的接。
### playground
Brandon Rhodes 建了一提供完整的 Docker 容器网络拓扑管理的 [Python](https://github.com/brandon-rhodes/fopnp/tree/m/playground)包括路由、NAT 防火;以及一些提供 HTTP, SMTP, POP, IMAP, Telnet, SSH, FTP 的服器。
Brandon Rhodes 建了一提供完整的 Docker 容器網絡拓撲管理的 [Python](https://github.com/brandon-rhodes/fopnp/tree/m/playground)包括路由、NAT 防火;以及一些提供 HTTP, SMTP, POP, IMAP, Telnet, SSH, FTP 的服器。

View File

@@ -1,10 +1,10 @@
## 映射容器端口到宿主主机的实现
## 映射容器端口到宿主主機的實現
认情况下,容器可以主动访问到外部网络的连接,但是外部网络无法访问到容器。
### 容器访问外部实现
容器所有到外部网络的连接,源地址都被NAT成本地系的IP地址。是使用 `iptables` 的源地址伪装操作实现的。
認情況下,容器可以主動訪問到外部網絡的連接,但是外部網絡無法訪問到容器。
### 容器訪問外部實現
容器所有到外部網絡的連接,源地址都被NAT成本地系的IP地址。是使用 `iptables` 的源地址偽裝操作實現的。
查看主的 NAT 规则
查看主的 NAT 規則
```
$ sudo iptables -t nat -nL
...
@@ -13,15 +13,15 @@ target prot opt source destination
MASQUERADE all -- 172.17.0.0/16 !172.17.0.0/16
...
```
其中,上述规则将所有源地址在 `172.17.0.0/16` 段,目地址其他段(外部网络)的流量动态伪装为从系统网卡发出。MASQUERADE 跟传统 SNAT 的好是它能动态从网卡获取地址。
其中,上述規則將所有源地址在 `172.17.0.0/16` 段,目地址其他段(外部網絡)的流量動態偽裝為從系統網卡發出。MASQUERADE 跟傳統 SNAT 的好是它能動態從網卡獲取地址。
### 外部访问容器实现
### 外部訪問容器實現
容器允外部访问,可以在 `docker run` 候通 `-p``-P` 参数来启用。
容器允外部訪問,可以在 `docker run` 候通 `-p``-P` 參數來啟用。
不管用那种办法,其也是在本地的 `iptable` 的 nat 表中添加相应的规则
不管用那種辦法,其也是在本地的 `iptable` 的 nat 表中添加相應的規則
使用 `-P`
使用 `-P`
```
$ iptables -t nat -nL
...
@@ -30,14 +30,14 @@ target prot opt source destination
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:49153 to:172.17.0.2:80
```
使用 `-p 80:80`
使用 `-p 80:80`
```
$ iptables -t nat -nL
Chain DOCKER (2 references)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172.17.0.2:80
```
意:
* 这里的规则映射了 0.0.0.0,意味着将接受主机来自所有接口的流量。用可以通 `-p IP:host_port:container_port` 或 `-p
IP::port` 指定允许访问容器的主上的 IP、接口等以制定更格的规则
* 如果希望永久定到某固定的 IP 地址,可以在 Docker 配置文件 `/etc/default/docker` 中指定 `DOCKER_OPTS="--ip=IP_ADDRESS"`,之后重启 Docker 服即可生效。
意:
* 這裏的規則映射了 0.0.0.0,意味著將接受主機來自所有接口的流量。用可以通 `-p IP:host_port:container_port` 或 `-p
IP::port` 指定允許訪問容器的主上的 IP、接口等以制定更格的規則
* 如果希望永久定到某固定的 IP 地址,可以在 Docker 配置文件 `/etc/default/docker` 中指定 `DOCKER_OPTS="--ip=IP_ADDRESS"`,之後重啟 Docker 服即可生效。

View File

@@ -1,11 +1,11 @@
## 示例:建一个点到点连
认情况Docker 会将所有容器接到由 `docker0` 提供的虚拟子网中。
## 示例:建一個點到點連
認情況Docker 會將所有容器接到由 `docker0` 提供的虛擬子網中。
户有时候需要两个容器之可以直通信,而不用通过主机网桥进行桥接。
戶有時候需要兩個容器之可以直通信,而不用通過主機網橋進行橋接。
决办法很简单:创建一 `peer` 接口,分放到两个容器中,配置成点到点链路类型即可。
決辦法很簡單:創建一 `peer` 接口,分放到兩個容器中,配置成點到點鏈路類型即可。
首先启动 2 容器:
首先啟動 2 容器:
```
$ sudo docker run -i -t --rm --net=none base /bin/bash
root@1f1f4c1f931a:/#
@@ -13,7 +13,7 @@ $ sudo docker run -i -t --rm --net=none base /bin/bash
root@12e343489d2f:/#
```
找到进程号,然后创建网络名字空的跟文件。
找到進程號,然後創建網絡名字空的跟文件。
```
$ sudo docker inspect -f '{{.State.Pid}}' 1f1f4c1f931a
2989
@@ -24,7 +24,7 @@ $ sudo ln -s /proc/2989/ns/net /var/run/netns/2989
$ sudo ln -s /proc/3004/ns/net /var/run/netns/3004
```
建一 `peer` 接口,然配置路由
建一 `peer` 接口,然配置路由
```
$ sudo ip link add A type veth peer name B
@@ -38,8 +38,8 @@ $ sudo ip netns exec 3004 ip addr add 10.1.1.2/32 dev B
$ sudo ip netns exec 3004 ip link set B up
$ sudo ip netns exec 3004 ip route add 10.1.1.1/32 dev B
```
现在这 2 容器就可以相互 ping 通,成功建立接。点到点链路不需要子和子网掩码
現在這 2 容器就可以相互 ping 通,成功建立接。點到點鏈路不需要子和子網掩碼
此外,也可以不指定 `--net=none` 来创建点到点链路。这样容器可以通原先的网络来通信。
此外,也可以不指定 `--net=none` 來創建點到點鏈路。這樣容器可以通原先的網絡來通信。
利用似的法,可以建一只跟主通信的容器。但是一般情下,更推使用 `--icc=false` 来关闭容器之的通信。
利用似的法,可以建一只跟主通信的容器。但是一般情下,更推使用 `--icc=false` 來關閉容器之的通信。

View File

@@ -1,23 +1,23 @@
## 快速配置指南
下面是一跟 Docker 网络相关的命令列表。
下面是一跟 Docker 網絡相關的命令列表。
其中有些命令选项只有在 Docker 服务启动的时候才能配置,而且不能上生效。
* `-b BRIDGE or --bridge=BRIDGE` --指定容器挂载的网桥
* `--bip=CIDR` --定制 docker0 的掩
* `-H SOCKET... or --host=SOCKET...` --Docker 服端接收命令的通道
* `--icc=true|false` --是否支持容器之间进行通信
* `--ip-forward=true|false` --看下文容器之的通信
* `--iptables=true|false` --禁止 Docker 添加 iptables 规则
* `--mtu=BYTES` --容器网络中的 MTU
其中有些命令選項只有在 Docker 服務啟動的時候才能配置,而且不能上生效。
* `-b BRIDGE or --bridge=BRIDGE` --指定容器掛載的網橋
* `--bip=CIDR` --定制 docker0 的掩
* `-H SOCKET... or --host=SOCKET...` --Docker 服端接收命令的通道
* `--icc=true|false` --是否支持容器之間進行通信
* `--ip-forward=true|false` --看下文容器之的通信
* `--iptables=true|false` --禁止 Docker 添加 iptables 規則
* `--mtu=BYTES` --容器網絡中的 MTU
下面2命令选项既可以在启动服务时指定,也可以 Docker 容器启动`docker run`候指定。在 Docker 服务启动的时候指定则会成为默认值,后面执`docker run` 可以覆盖设置的默值。
* `--dns=IP_ADDRESS...` --使用指定的DNS服
下面2命令選項既可以在啟動服務時指定,也可以 Docker 容器啟動`docker run`候指定。在 Docker 服務啟動的時候指定則會成為默認值,後面執`docker run` 可以覆蓋設置的默值。
* `--dns=IP_ADDRESS...` --使用指定的DNS服
* `--dns-search=DOMAIN...` --指定DNS搜索域
后这些选项只有在 `docker run` 执行时使用,因它是针对容器的特性容。
* `-h HOSTNAME or --hostname=HOSTNAME` --配置容器主
* `--link=CONTAINER_NAME:ALIAS` --添加到另一容器的
* `--net=bridge|none|container:NAME_or_ID|host` --配置容器的接模式
* `-p SPEC or --publish=SPEC` --映射容器端口到宿主主
* `-P or --publish-all=true|false` --映射容器所有端口到宿主主
後這些選項只有在 `docker run` 執行時使用,因它是針對容器的特性容。
* `-h HOSTNAME or --hostname=HOSTNAME` --配置容器主
* `--link=CONTAINER_NAME:ALIAS` --添加到另一容器的
* `--net=bridge|none|container:NAME_or_ID|host` --配置容器的接模式
* `-p SPEC or --publish=SPEC` --映射容器端口到宿主主
* `-P or --publish-all=true|false` --映射容器所有端口到宿主主

View File

@@ -1,168 +1,168 @@
# Docker命令查
# Docker命令查
##基本
##基本
docker [OPTIONS] COMMAND [arg...]
一般来说Docker 命令可以用管理 daemon或者通 CLI 命令管理像和容器。可以通 `man docker` 查看些命令。
一般來說Docker 命令可以用管理 daemon或者通 CLI 命令管理像和容器。可以通 `man docker` 查看些命令。
##选项
##選項
-D=true|false
使用 debug 模式。默认为 false。
使用 debug 模式。默認為 false。
-H, --host=[unix:///var/run/docker.sock]: tcp://[host:port]来绑定或者 unix://[/path/to/socket] 使用。
在 daemon 模式下定的 socket过一个或多 tcp://host:port, unix:///path/to/socket, fd://* or fd://socketfd 指定。
-H, --host=[unix:///var/run/docker.sock]: tcp://[host:port]來綁定或者 unix://[/path/to/socket] 使用。
在 daemon 模式下定的 socket過一個或多 tcp://host:port, unix:///path/to/socket, fd://* or fd://socketfd 指定。
--api-enable-cors=true|false
端 API 中用 CORS 。缺省 false。
端 API 中用 CORS 。缺省 false。
-b=""
容器挂载到一已存在的网桥上。指定 'none' 时则禁用容器的网络
容器掛載到一已存在的網橋上。指定 'none' 時則禁用容器的網絡
--bip=""
让动态创建的 docker0 采用定的 CIDR 地址; -b 选项互斥。
讓動態創建的 docker0 采用定的 CIDR 地址; -b 選項互斥。
-d=true|false
使用 daemon 模式。缺省 false。
使用 daemon 模式。缺省 false。
--dns=""
Docker 使用定的 DNS 服器。
Docker 使用定的 DNS 服器。
-g=""
指定 Docker 运行时的 root 路。缺省 /var/lib/docker。
指定 Docker 運行時的 root 路。缺省 /var/lib/docker。
--icc=true|false
用容器通信。默认为 true。
用容器通信。默認為 true。
--ip=""
定端口候的默 IP 地址。缺省 0.0.0.0。
定端口候的默 IP 地址。缺省 0.0.0.0。
--iptables=true|false
禁止 Docker 添加 iptables 规则。缺省 true。
禁止 Docker 添加 iptables 規則。缺省 true。
--mtu=VALUE
指定容器网络的 mtu。缺省 1500。
指定容器網絡的 mtu。缺省 1500。
-p=""
指定 daemon 的 PID 文件路。缺省 /var/run/docker.pid。
指定 daemon 的 PID 文件路。缺省 /var/run/docker.pid。
-s=""
制 Docker 运行时使用定的存储驱动
制 Docker 運行時使用定的存儲驅動
-v=true|false
出版本信息退出。缺省值 false。
出版本信息退出。缺省值 false。
--selinux-enabled=true|false
用 SELinux 支持。缺省值 false。SELinux 目前不支持 BTRFS 存储驱动
用 SELinux 支持。缺省值 false。SELinux 目前不支持 BTRFS 存儲驅動
##命令
Docker 的命令可以采用 `docker-CMD` 或者 `docker CMD` 的方式行。者一致。
Docker 的命令可以采用 `docker-CMD` 或者 `docker CMD` 的方式行。者一致。
docker-attach(1)
依附到一正在行的容器中。
依附到一正在行的容器中。
docker-build(1)
从一个 Dockerfile 建一个镜
從一個 Dockerfile 建一個鏡
docker-commit(1)
从一个容器的修改中建一新的
從一個容器的修改中建一新的
docker-cp(1)
容器中制文件到宿主系
容器中制文件到宿主系
docker-diff(1)
查一容器文件系的修改
查一容器文件系的修改
docker-events(1)
从服务端获取实时的事件
從服務端獲取實時的事件
docker-export(1)
出容器内容为一个 tar 包
出容器內容為一個 tar 包
docker-history(1)
示一个镜像的
示一個鏡像的
docker-images(1)
列出存在的
列出存在的
docker-import(1)
入一文件(典型 tar 包)路或目录来创建一个镜
入一文件(典型 tar 包)路或目錄來創建一個鏡
docker-info(1)
示一些相的系信息
示一些相的系信息
docker-inspect(1)
示一容器的底层具体信息。
示一容器的底層具體信息。
docker-kill(1)
关闭一个运行中的容器 (包括程和所有源)
關閉一個運行中的容器 (包括程和所有源)
docker-load(1)
从一个 tar 包中加载一个镜
從一個 tar 包中加載一個鏡
docker-login(1)
注册或登到一 Docker 的仓库服务
註冊或登到一 Docker 的倉庫服務
docker-logout(1)
Docker 的仓库服务器登出
Docker 的倉庫服務器登出
docker-logs(1)
取容器的 log 信息
取容器的 log 信息
docker-pause(1)
停一容器中的所有
停一容器中的所有
docker-port(1)
查找一 nat 到一私有口的公共口
查找一 nat 到一私有口的公共口
docker-ps(1)
列出容器
docker-pull(1)
从一个Docker的仓库服务器下拉一个镜像或仓库
從一個Docker的倉庫服務器下拉一個鏡像或倉庫
docker-push(1)
将一个镜像或者仓库推送到一 Docker 的注册服务
將一個鏡像或者倉庫推送到一 Docker 的註冊服務
docker-restart(1)
启一个运行中的容器
啟一個運行中的容器
docker-rm(1)
删除给定的若干个容器
刪除給定的若幹個容器
docker-rmi(1)
删除给定的若干个镜
刪除給定的若幹個鏡
docker-run(1)
建一新容器,在其中运行给定命令
建一新容器,在其中運行給定命令
docker-save(1)
保存一个镜像为 tar 包文件
保存一個鏡像為 tar 包文件
docker-search(1)
在 Docker index 中搜索一个镜
在 Docker index 中搜索一個鏡
docker-start(1)
启动一个容器
啟動一個容器
docker-stop(1)
止一个运行中的容器
止一個運行中的容器
docker-tag(1)
为一个镜像打标签
為一個鏡像打標簽
docker-top(1)
查看一容器中的正在行的程信息
查看一容器中的正在行的程信息
docker-unpause(1)
将一个容器所有的进程从暂停状态中恢
將一個容器所有的進程從暫停狀態中恢
docker-version(1)
出 Docker 的版本信息
出 Docker 的版本信息
docker-wait(1)
阻塞直到一容器止,然后输出它的退出符
阻塞直到一容器止,然後輸出它的退出符
##一张图总结 Docker 的命令
##一張圖總結 Docker 的命令
![命令周期](../_images/cmd_logic.png)

View File

@@ -1,2 +1,2 @@
# 常见仓库介绍
本章将介绍常见的一些仓库和镜像的功能,使用方法和生成它的 Dockerfile 等。包括 Ubuntu、CentOS、MySQL、MongoDB、Redis、Nginx、Wordpress、Node.js 等。
# 常見倉庫介紹
本章將介紹常見的一些倉庫和鏡像的功能,使用方法和生成它的 Dockerfile 等。包括 Ubuntu、CentOS、MySQL、MongoDB、Redis、Nginx、Wordpress、Node.js 等。

View File

@@ -1,11 +1,11 @@
## [CentOS](https://registry.hub.docker.com/_/centos/)
### 基本信息
[CentOS](https://en.wikipedia.org/wiki/CentOS) 是流行的 Linux 行版,其件包大多跟 RedHat 系列保持一致。
该仓库提供了 CentOS 5 ~ 7 各版本的像。
[CentOS](https://en.wikipedia.org/wiki/CentOS) 是流行的 Linux 行版,其件包大多跟 RedHat 系列保持一致。
該倉庫提供了 CentOS 5 ~ 7 各版本的像。
### 使用方法
认会启动一个最小化的 CentOS 境。
認會啟動一個最小化的 CentOS 境。
```
$ sudo docker run --name some-centos -i -t centos bash
bash-4.2#

View File

@@ -1,20 +1,20 @@
## [MongoDB](https://registry.hub.docker.com/_/mongo/)
### 基本信息
[MongoDB](https://en.wikipedia.org/wiki/MongoDB) 是源的 NoSQL 数据库实现
该仓库提供了 MongoDB 2.2 ~ 2.7 各版本的像。
[MongoDB](https://en.wikipedia.org/wiki/MongoDB) 是源的 NoSQL 數據庫實現
該倉庫提供了 MongoDB 2.2 ~ 2.7 各版本的像。
### 使用方法
认会`27017` 端口启动数据库
認會`27017` 端口啟動數據庫
```
$ sudo docker run --name some-mongo -d mongo
```
使用其他应用连接到容器,可以用
使用其他應用連接到容器,可以用
```
$ sudo docker run --name some-app --link some-mongo:mongo -d application-that-uses-mongo
```
或者通 `mongo`
或者通 `mongo`
```
$ sudo docker run -it --link some-mongo:mongo --rm mongo sh -c 'exec mongo "$MONGO_PORT_27017_TCP_ADDR:$MONGO_PORT_27017_TCP_PORT/test"'
```

View File

@@ -1,19 +1,19 @@
## [MySQL](https://registry.hub.docker.com/_/mysql/)
### 基本信息
[MySQL](https://en.wikipedia.org/wiki/MySQL) 是源的关系数据库实现
该仓库提供了 MySQL 各版本的像,包括 5.6 系列、5.7 系列等。
[MySQL](https://en.wikipedia.org/wiki/MySQL) 是源的關系數據庫實現
該倉庫提供了 MySQL 各版本的像,包括 5.6 系列、5.7 系列等。
### 使用方法
认会`3306` 端口启动数据库
認會`3306` 端口啟動數據庫
```
$ sudo docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=mysecretpassword -d mysql
```
就可以使用其它应用来连接到容器。
就可以使用其它應用來連接到容器。
```
$ sudo docker run --name some-app --link some-mysql:mysql -d application-that-uses-mysql
```
或者通 `mysql`
或者通 `mysql`
```
$ sudo docker run -it --link some-mysql:mysql --rm mysql sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
```

View File

@@ -1,34 +1,34 @@
## [Nginx](https://registry.hub.docker.com/_/nginx/)
### 基本信息
[Nginx](https://en.wikipedia.org/wiki/Nginx) 是源的高效的 Web 服务器实现,支持 HTTP、HTTPS、SMTP、POP3、IMAP 等协议
该仓库提供了 Nginx 1.0 ~ 1.7 各版本的像。
[Nginx](https://en.wikipedia.org/wiki/Nginx) 是源的高效的 Web 服務器實現,支持 HTTP、HTTPS、SMTP、POP3、IMAP 等協議
該倉庫提供了 Nginx 1.0 ~ 1.7 各版本的像。
### 使用方法
下面的命令将作为一个静态页面服务器启动
下面的命令將作為一個靜態頁面服務器啟動
```
$ sudo docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx
```
也可以不使用这种映射方式,通利用 Dockerfile 直接将静态页面内容放到像中,内容为
也可以不使用這種映射方式,通利用 Dockerfile 直接將靜態頁面內容放到像中,內容為
```
FROM nginx
COPY static-html-directory /usr/share/nginx/html
```
生成新的像,并启动一个容器。
生成新的像,並啟動一個容器。
```
$ sudo docker build -t some-content-nginx .
$ sudo docker run --name some-nginx -d some-content-nginx
```
放端口,映射到本地的 `8080` 端口。
放端口,映射到本地的 `8080` 端口。
```
sudo docker run --name some-nginx -d -p 8080:80 some-content-nginx
```
Nginx的默配置文件路径为 `/etc/nginx/nginx.conf`,可以通映射它使用本地的配置文件,例如
Nginx的默配置文件路徑為 `/etc/nginx/nginx.conf`,可以通映射它使用本地的配置文件,例如
```
docker run --name some-nginx -v /some/nginx.conf:/etc/nginx/nginx.conf:ro -d nginx
```
使用配置文件时,为了在容器中正常行,需要保持 `daemon off;`
使用配置文件時,為了在容器中正常行,需要保持 `daemon off;`
### Dockerfile
* [1 ~ 1.7 版本](https://github.com/nginxinc/docker-nginx/blob/3713a0157083eb4776e71f5a5aef4b2a5bc03ab1/Dockerfile)

View File

@@ -1,23 +1,23 @@
## [Node.js](https://registry.hub.docker.com/_/node/)
### 基本信息
[Node.js](https://en.wikipedia.org/wiki/Node.js)是基 JavaScript 的可展服端和网络软件开发平台
该仓库提供了 Node.js 0.8 ~ 0.11 各版本的像。
[Node.js](https://en.wikipedia.org/wiki/Node.js)是基 JavaScript 的可展服端和網絡軟件開發平臺
該倉庫提供了 Node.js 0.8 ~ 0.11 各版本的像。
### 使用方法
目中建一 Dockerfile。
目中建一 Dockerfile。
```
FROM node:0.10-onbuild
# replace this with your application's default port
EXPOSE 8888
```
后创建镜像,并启动容器
後創建鏡像,並啟動容器
```
$ sudo docker build -t my-nodejs-app
$ sudo docker run -it --rm --name my-running-app my-nodejs-app
```
也可以直接行一个简单容器。
也可以直接行一個簡單容器。
```
$ sudo docker run -it --rm --name my-running-script -v "$(pwd)":/usr/src/myapp -w /usr/src/myapp node:0.10 node your-daemon-or-script.js
```

View File

@@ -1,25 +1,25 @@
## [Redis](https://registry.hub.docker.com/_/redis/)
### 基本信息
[Redis](https://en.wikipedia.org/wiki/Redis) 是源的存 Key-Value 数据库实现
该仓库提供了 Redis 2.6 ~ 2.8.9 各版本的像。
[Redis](https://en.wikipedia.org/wiki/Redis) 是源的存 Key-Value 數據庫實現
該倉庫提供了 Redis 2.6 ~ 2.8.9 各版本的像。
### 使用方法
认会`6379` 端口启动数据库
認會`6379` 端口啟動數據庫
```
$ sudo docker run --name some-redis -d redis
```
另外可以用 [持久存](http://redis.io/topics/persistence)。
另外可以用 [持久存](http://redis.io/topics/persistence)。
```
$ sudo docker run --name some-redis -d redis redis-server --appendonly yes
```
认数据存储位置在 `VOLUME/data`。可以使用 `--volumes-from some-volume-container``-v /docker/host/dir:/data` 将数据存放到本地。
認數據存儲位置在 `VOLUME/data`。可以使用 `--volumes-from some-volume-container``-v /docker/host/dir:/data` 將數據存放到本地。
使用其他应用连接到容器,可以用
使用其他應用連接到容器,可以用
```
$ sudo docker run --name some-app --link some-redis:redis -d application-that-uses-redis
```
或者通 `redis-cli`
或者通 `redis-cli`
```
$ sudo docker run -it --link some-redis:redis --rm redis sh -c 'exec redis-cli -h "$REDIS_PORT_6379_TCP_ADDR" -p "$REDIS_PORT_6379_TCP_PORT"'
```

View File

@@ -1,11 +1,11 @@
## [Ubuntu](https://registry.hub.docker.com/_/ubuntu/)
### 基本信息
[Ubuntu](https://en.wikipedia.org/wiki/Ubuntu) 是流行的 Linux 行版,其自带软件版本往往新一些。
该仓库提供了 Ubuntu12.04 ~ 14.10 各版本的像。
[Ubuntu](https://en.wikipedia.org/wiki/Ubuntu) 是流行的 Linux 行版,其自帶軟件版本往往新一些。
該倉庫提供了 Ubuntu12.04 ~ 14.10 各版本的像。
### 使用方法
认会启动一个最小化的 Ubuntu 境。
認會啟動一個最小化的 Ubuntu 境。
```
$ sudo docker run --name some-ubuntu -i -t ubuntu
root@523c70904d54:/#

View File

@@ -1,19 +1,19 @@
## [WordPress](https://registry.hub.docker.com/_/wordpress/)
### 基本信息
[WordPress](https://en.wikipedia.org/wiki/WordPress) 是源的 Blog 和容管理系框架,它基 PhP 和 MySQL。
该仓库提供了 WordPress 4.0 版本的像。
[WordPress](https://en.wikipedia.org/wiki/WordPress) 是源的 Blog 和容管理系框架,它基 PhP 和 MySQL。
該倉庫提供了 WordPress 4.0 版本的像。
### 使用方法
启动容器需要 MySQL 的支持,默端口 `80`
啟動容器需要 MySQL 的支持,默端口 `80`
```
$ sudo docker run --name some-wordpress --link some-mysql:mysql -d wordpress
```
启动 WordPress 容器可以指定的一些环境参数包括
* `-e WORDPRESS_DB_USER=...` 缺省 “root”
* `-e WORDPRESS_DB_PASSWORD=...` 缺省为连接 mysql 容器的环境变`MYSQL_ROOT_PASSWORD` 的值
* `-e WORDPRESS_DB_NAME=...` 缺省 “wordpress”
* `-e WORDPRESS_AUTH_KEY=...`, `-e WORDPRESS_SECURE_AUTH_KEY=...`, `-e WORDPRESS_LOGGED_IN_KEY=...`, `-e WORDPRESS_NONCE_KEY=...`, `-e WORDPRESS_AUTH_SALT=...`, `-e WORDPRESS_SECURE_AUTH_SALT=...`, `-e WORDPRESS_LOGGED_IN_SALT=...`, `-e WORDPRESS_NONCE_SALT=...` 缺省为随机 sha1 串
啟動 WordPress 容器可以指定的一些環境參數包括
* `-e WORDPRESS_DB_USER=...` 缺省 “root”
* `-e WORDPRESS_DB_PASSWORD=...` 缺省為連接 mysql 容器的環境變`MYSQL_ROOT_PASSWORD` 的值
* `-e WORDPRESS_DB_NAME=...` 缺省 “wordpress”
* `-e WORDPRESS_AUTH_KEY=...`, `-e WORDPRESS_SECURE_AUTH_KEY=...`, `-e WORDPRESS_LOGGED_IN_KEY=...`, `-e WORDPRESS_NONCE_KEY=...`, `-e WORDPRESS_AUTH_SALT=...`, `-e WORDPRESS_SECURE_AUTH_SALT=...`, `-e WORDPRESS_LOGGED_IN_SALT=...`, `-e WORDPRESS_NONCE_SALT=...` 缺省為隨機 sha1 串
### Dockerfile
* [4.0 版本](https://github.com/docker-library/wordpress/blob/aee00669e7c43f435f021cb02871bffd63d5677a/Dockerfile)

View File

@@ -1,7 +1,7 @@
# 资源链
* Docker 主站: https://www.docker.io
* Docker 注册中心API: http://docs.docker.com/reference/api/registry_api/
# 資源鏈
* Docker 主站: https://www.docker.io
* Docker 註冊中心API: http://docs.docker.com/reference/api/registry_api/
* Docker Hub API: http://docs.docker.com/reference/api/docker-io_api/
* Docker 远端应用API: http://docs.docker.com/reference/api/docker_remote_api/
* Dockerfile https://docs.docker.com/reference/builder/
* Dockerfile 最佳实践https://docs.docker.com/articles/dockerfile_best-practices/
* Docker 遠端應用API: http://docs.docker.com/reference/api/docker_remote_api/
* Dockerfile https://docs.docker.com/reference/builder/
* Dockerfile 最佳實踐https://docs.docker.com/articles/dockerfile_best-practices/

View File

@@ -1,7 +1,7 @@
## Docker 鏡像
Docker 鏡像就是一個唯讀的模板。
例如:一個鏡像可以包含一個完整的 ubuntu 作系統環境,裡面僅安裝了 Apache 或用戶需要的其它應用程序。
例如:一個鏡像可以包含一個完整的 ubuntu 作系統環境,裡面僅安裝了 Apache 或用戶需要的其它應用程序。
鏡像可以用來創建 Docker 容器。

View File

@@ -1,2 +1,2 @@
#实战案例
一些典型的应用场景和案例。
#實戰案例
一些典型的應用場景和案例。

View File

@@ -1,5 +1,5 @@
## 多物理主机之间的容器互(暴露容器到真实网络中)
Docker 默认的桥接网卡是 docker0。它只在本机桥接所有的容器卡,举例来说容器的虚拟网卡在主上看一般叫做 veth*** 而 Docker 只是把所有这些网卡桥接在一起,如下:
## 多物理主機之間的容器互(暴露容器到真實網絡中)
Docker 默認的橋接網卡是 docker0。它只在本機橋接所有的容器卡,舉例來說容器的虛擬網卡在主上看一般叫做 veth*** 而 Docker 只是把所有這些網卡橋接在一起,如下:
```
[root@opnvz ~]# brctl show
bridge name bridge id STP enabled interfaces
@@ -7,7 +7,7 @@ docker0 8000.56847afe9799 no veth0889
veth3c7b
veth4061
```
在容器中看到的地址一般是像下面这样的地址:
在容器中看到的地址一般是像下面這樣的地址:
```
root@ac6474aeb31d:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default
@@ -23,17 +23,17 @@ root@ac6474aeb31d:~# ip a
inet6 fe80::487d:68ff:feda:9cf/64 scope link
valid_lft forever preferred_lft forever
```
这样就可以把这个网络看成是一私有的网络,通 nat 接外,如果要让外网连接到容器中,就需要做端口映射,即 -p 参数
這樣就可以把這個網絡看成是一私有的網絡,通 nat 接外,如果要讓外網連接到容器中,就需要做端口映射,即 -p 參數
如果在企业内部应用,或者做多物理主的集群,可能需要将多个物理主的容器到一物理网络中来,那就需要将这个网桥桥接到我指定的卡上。
如果在企業內部應用,或者做多物理主的集群,可能需要將多個物理主的容器到一物理網絡中來,那就需要將這個網橋橋接到我指定的卡上。
### 拓扑图
A 和主 B 的卡一都连着物理交换机的同一 vlan 101,这样网桥一和网桥三就相当于在同一物理网络中了,而容器一、容器三、容器四也在同一物理网络中了,他们之间可以相互通信,而且可以跟同一 vlan 中的其他物理器互
![物理拓扑图](../_images/container_connect_topology.png)
### 拓撲圖
A 和主 B 的卡一都連著物理交換機的同一 vlan 101,這樣網橋一和網橋三就相當於在同一物理網絡中了,而容器一、容器三、容器四也在同一物理網絡中了,他們之間可以相互通信,而且可以跟同一 vlan 中的其他物理器互
![物理拓撲圖](../_images/container_connect_topology.png)
### ubuntu 示例
下面以 ubuntu 为例创建多个主机的容器联网:
建自己的网桥,编辑 /etc/network/interface 文件
下面以 ubuntu 為例創建多個主機的容器聯網:
建自己的網橋,編輯 /etc/network/interface 文件
```
auto br0
iface br0 inet static
@@ -44,9 +44,9 @@ bridge_ports em1
bridge_stp off
dns-nameservers 8.8.8.8 192.168.6.1
```
Docker 的默认网桥绑定到这个新建的 br0 上面,这样就将这台机器上容器定到 em1 这个网卡所对应的物理网络上了。
Docker 的默認網橋綁定到這個新建的 br0 上面,這樣就將這臺機器上容器定到 em1 這個網卡所對應的物理網絡上了。
ubuntu 修改 /etc/default/docker 文件,添加最一行
ubuntu 修改 /etc/default/docker 文件,添加最一行
```
# Docker Upstart and SysVinit configuration file
@@ -64,7 +64,7 @@ ubuntu 修改 /etc/default/docker 文件,添加最后一行内容
DOCKER_OPTS="-b=br0"
```
启动 Docker 的候 使用 -b 参数 将容器定到物理网络上。重 Docker 服务后,再入容器可以看到它已经绑定到你的物理网络上了。
啟動 Docker 的候 使用 -b 參數 將容器定到物理網絡上。重 Docker 服務後,再入容器可以看到它已經綁定到你的物理網絡上了。
```
root@ubuntudocker:~# docker ps
@@ -75,4 +75,4 @@ bridge name bridge id STP enabled interfaces
br0 8000.7e6e617c8d53 no em1
vethe6e5
```
这样就直接把容器暴露到物理网络上了,多物理主的容器也可以相互联网了。需要意的是,这样就需要自己来保证容器的网络安全了。
這樣就直接把容器暴露到物理網絡上了,多物理主的容器也可以相互聯網了。需要意的是,這樣就需要自己來保證容器的網絡安全了。

View File

@@ -1,14 +1,14 @@
## 标准化开发测试和生产环
对于大部分企业来说,搭建 PaaS 既有那精力,也没那个必要,用 Docker 做人的 sandbox 用又小了
## 標準化開發測試和生產環
對於大部分企業來說,搭建 PaaS 既有那精力,也沒那個必要,用 Docker 做人的 sandbox 用又小了
可以用 Docker 来标准化开发、测试、生产环境。
可以用 Docker 來標準化開發、測試、生產環境。
![业应用结构](../_images/enterprise_usage.png)
![業應用結構](../_images/enterprise_usage.png)
Docker 占用源小,在一 E5 128 G 存的服器上部署 100 容器都绰绰有余,可以单独抽一容器或者直接在宿主物理主上部署 samba利用 samba 的 home 分享方案将每个用户的 home 目映射到开发中心和测试部门的 Windows 器上。
Docker 占用源小,在一 E5 128 G 存的服器上部署 100 容器都綽綽有余,可以單獨抽一容器或者直接在宿主物理主上部署 samba利用 samba 的 home 分享方案將每個用戶的 home 目映射到開發中心和測試部門的 Windows 器上。
针对某个项目组,由架构师搭建好一个标准的容器境供项目组和测试部门使用,每个开发工程可以有自己单独的容器,通 `docker run -v` 将用户的 home 目映射到容器中。需要提交测试时,只需要将代码移交给测试部门,然分配一容器使用 `-v`载测试部门的 home 目录启动即可。这样,在公司部的开发、测试基本就一了,不会出现开发部门提交的代码,测试部门部署不了的问题
針對某個項目組,由架構師搭建好一個標準的容器境供項目組和測試部門使用,每個開發工程可以有自己單獨的容器,通 `docker run -v` 將用戶的 home 目映射到容器中。需要提交測試時,只需要將代碼移交給測試部門,然分配一容器使用 `-v`載測試部門的 home 目錄啟動即可。這樣,在公司部的開發、測試基本就一了,不會出現開發部門提交的代碼,測試部門部署不了的問題
测试部门发布测试通过的报告后,架构师再一次检测容器境,就可以直接交由部署工程师将代码和容器分部署到生产环境中了。这种方式的部署向性能的展性也好。
測試部門發布測試通過的報告後,架構師再一次檢測容器境,就可以直接交由部署工程師將代碼和容器分部署到生產環境中了。這種方式的部署向性能的展性也好。

View File

@@ -1,10 +1,10 @@
## 使用 Supervisor 管理
Docker 容器在启动的时候开启单个进程,比如,一 ssh 或者 apache 的 daemon 服。但我们经常需要在一个机器上开启多个服务,这可以有很多方法,最简单的就是把多个启动命令方到一个启动脚本里面,启动的时候直接启动这个脚本,另外就是安装进程管理工具。
## 使用 Supervisor 管理
Docker 容器在啟動的時候開啟單個進程,比如,一 ssh 或者 apache 的 daemon 服。但我們經常需要在一個機器上開啟多個服務,這可以有很多方法,最簡單的就是把多個啟動命令方到一個啟動腳本裏面,啟動的時候直接啟動這個腳本,另外就是安裝進程管理工具。
本小节将使用程管理工具 supervisor 管理容器中的多个进程。使用 Supervisor 可以更好的控制、管理、重启我们希望行的程。在这里我们演示一下如何同使用 ssh 和 apache 服
本小節將使用程管理工具 supervisor 管理容器中的多個進程。使用 Supervisor 可以更好的控制、管理、重啟我們希望行的程。在這裏我們演示一下如何同使用 ssh 和 apache 服
### 配置
首先建一 Dockerfile容和各部分的解如下。
首先建一 Dockerfile容和各部分的解如下。
```
FROM ubuntu:13.04
MAINTAINER examples@docker.com
@@ -13,28 +13,28 @@ RUN apt-get update
RUN apt-get upgrade -y
```
### 安 supervisor
ssh、apache 和 supervisor。
### 安 supervisor
ssh、apache 和 supervisor。
```
RUN apt-get install -y openssh-server apache2 supervisor
RUN mkdir -p /var/run/sshd
RUN mkdir -p /var/log/supervisor
```
这里安装 3 个软件,还创建了 2 ssh 和 supervisor 服正常行所需要的目
這裏安裝 3 個軟件,還創建了 2 ssh 和 supervisor 服正常行所需要的目
```
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
```
添加 supervisord 的配置文件,并复制配置文件到对应目录下面。
添加 supervisord 的配置文件,並復制配置文件到對應目錄下面。
```
EXPOSE 22 80
CMD ["/usr/bin/supervisord"]
```
这里我们映射了 22 和 80 端口,使用 supervisord 的可行路径启动服务
這裏我們映射了 22 和 80 端口,使用 supervisord 的可行路徑啟動服務
### supervisor配置文件
### supervisor配置文件
```
[supervisord]
nodaemon=true
@@ -44,14 +44,14 @@ command=/usr/sbin/sshd -D
[program:apache2]
command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND"
```
配置文件包含目录和进程,第一段 supervsord 配置件本身,使用 nodaemon 参数来运行。第二段包含要控制的 2 个服务。每一段包含一个服务的目录和启动这个服务的命令。
配置文件包含目錄和進程,第一段 supervsord 配置件本身,使用 nodaemon 參數來運行。第二段包含要控制的 2 個服務。每一段包含一個服務的目錄和啟動這個服務的命令。
### 使用方法
创建镜像。
創建鏡像。
```
$ sudo docker build -t test/supervisord .
```
启动 supervisor 容器。
啟動 supervisor 容器。
```
$ sudo docker run -p 22 -p 80 -t -i test/supervisords
2013-11-25 18:53:22,312 CRIT Supervisor running as root (no user in config file)
@@ -60,6 +60,6 @@ $ sudo docker run -p 22 -p 80 -t -i test/supervisords
2013-11-25 18:53:23,346 INFO spawned: 'sshd' with pid 6
2013-11-25 18:53:23,349 INFO spawned: 'apache2' with pid 7
```
使用 `docker run` 来启动我们创建的容器。使用多 `-p` 映射多端口,这样我们就能同时访问 ssh 和 apache 服了。
使用 `docker run` 來啟動我們創建的容器。使用多 `-p` 映射多端口,這樣我們就能同時訪問 ssh 和 apache 服了。
可以使用这个方法建一只有 ssh 服的基础镜像,之后创建镜像可以使用这个镜像为基础来创
可以使用這個方法建一只有 ssh 服的基礎鏡像,之後創建鏡像可以使用這個鏡像為基礎來創

View File

@@ -1,11 +1,11 @@
## 建 tomcat/weblogic 集群
### 安 tomcat
准备好需要的 jdk、tomcat 等件放到 home 目下面,启动一个容器
## 建 tomcat/weblogic 集群
### 安 tomcat
準備好需要的 jdk、tomcat 等件放到 home 目下面,啟動一個容器
```
docker run -t -i -v /home:/opt/data --name mk_tomcat ubuntu /bin/bash
```
这条命令挂载本地 home 目到容器的 /opt/data 目,容器内目录若不存在,则会自动创建。接下就是 tomcat 的基本配置jdk 环境变量设置好之后,将 tomcat 程序放到 /opt/apache-tomcat 下面
编辑 /etc/supervisor/conf.d/supervisor.conf 文件,添加 tomcat
這條命令掛載本地 home 目到容器的 /opt/data 目,容器內目錄若不存在,則會自動創建。接下就是 tomcat 的基本配置jdk 環境變量設置好之後,將 tomcat 程序放到 /opt/apache-tomcat 下面
編輯 /etc/supervisor/conf.d/supervisor.conf 文件,添加 tomcat
```
[supervisord]
nodaemon=true
@@ -18,19 +18,19 @@ command=/usr/sbin/sshd -D
docker commit ac6474aeb31d tomcat
```
新建 tomcat 文件,新建 Dockerfile。
新建 tomcat 文件,新建 Dockerfile。
```
FROM mk_tomcat
EXPOSE 22 8080
CMD ["/usr/bin/supervisord"]
```
Dockerfile 创建镜像。
Dockerfile 創建鏡像。
```
docker build tomcat tomcat
```
### 安 weblogic
### 安 weblogic
和 tomcat 基本一致,这里贴一下配置文件
和 tomcat 基本一致,這裏貼一下配置文件
```
supervisor.conf
[supervisord]
@@ -48,34 +48,34 @@ EXPOSE 22 7001
CMD ["/usr/bin/supervisord"]
```
### tomcat/weblogic 像的使用
#### 存的使用
启动的时候,使用 `-v` 参数
### tomcat/weblogic 像的使用
#### 存的使用
啟動的時候,使用 `-v` 參數
-v, --volume=[] Bind mount a volume (e.g. from the host: -v /host:/container, from docker: -v /container)
本地磁映射到容器部,它在主和容器之间是实时变化的,所以我更新程序、上传代码只需要更新物理主的目就可以了
本地磁映射到容器部,它在主和容器之間是實時變化的,所以我更新程序、上傳代碼只需要更新物理主的目就可以了
#### tomcat 和 weblogic 集群的实现
tomcat 只要开启多个容器即可
#### tomcat 和 weblogic 集群的實現
tomcat 只要開啟多個容器即可
```
docker run -d -v -p 204:22 -p 7003:8080 -v /home/data:/opt/data --name tm1 tomcat /usr/bin/supervisord
docker run -d -v -p 205:22 -p 7004:8080 -v /home/data:/opt/data --name tm2 tomcat /usr/bin/supervisord
docker run -d -v -p 206:22 -p 7005:8080 -v /home/data:/opt/data --name tm3 tomcat /usr/bin/supervisord
```
这里说一下 weblogic 的配置,大家知道 weblogic 有一域的概念。如果要使用常的 administrator +node 的方式部署,就需要在 supervisord 中分别写出 administartor server 和 node server 的启动脚本,这样做的优点是:
這裏說一下 weblogic 的配置,大家知道 weblogic 有一域的概念。如果要使用常的 administrator +node 的方式部署,就需要在 supervisord 中分別寫出 administartor server 和 node server 的啟動腳本,這樣做的優點是:
* 可以使用 weblogic 的集群,同步等概念
* 部署一集群用程序,只需要安一次用到集群上即可
* 部署一集群用程序,只需要安一次用到集群上即可
是:
* Docker 配置复杂
* 没办法自动扩展集群的算容量,如需添加节点,需要在 administrator 上先创建节点,然再配置新的容器 supervisor 启动脚本,然后再启动容器
另外方法是所有的程序都安在 adminiserver 上面,需要展的候,启动多个节点即可,它的优点和缺和上一方法恰恰相反。(建使用这种方式部署开发和测试环境)
是:
* Docker 配置復雜
* 沒辦法自動擴展集群的算容量,如需添加節點,需要在 administrator 上先創建節點,然再配置新的容器 supervisor 啟動腳本,然後再啟動容器
另外方法是所有的程序都安在 adminiserver 上面,需要展的候,啟動多個節點即可,它的優點和缺和上一方法恰恰相反。(建使用這種方式部署開發和測試環境)
```
docker run -d -v -p 204:22 -p 7001:7001 -v /home/data:/opt/data --name node1 weblogic /usr/bin/supervisord
docker run -d -v -p 205:22 -p 7002:7001 -v /home/data:/opt/data --name node2 weblogic /usr/bin/supervisord
docker run -d -v -p 206:22 -p 7003:7001 -v /home/data:/opt/data --name node3 weblogic /usr/bin/supervisord
```
这样在前端使用 nginx 来做负载均衡就可以完成配置了
這樣在前端使用 nginx 來做負載均衡就可以完成配置了

View File

@@ -1,6 +1,6 @@
# Docker 容器
容器是 Docker 又一核心概念。
简单的说,容器是独立运行的一或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的用。
簡單的說,容器是獨立運行的一或一組應用,以及它們的運行態環境。對應的,虛擬機可以理解為模擬運行的一整套作業系統(提供了運行態環境和其他系統環境)和跑在上面的用。
本章将具体介绍如何管理一容器,包括建、启动和停止等。
本章將具體介紹如何管理一容器,包括建、啟動和停止等。

View File

@@ -1,20 +1,20 @@
##守护态运
##守護態運
更多的候,需要 Docker 容器在后台以守护态Daemonized形式行。此,可以通添加 `-d` 参数来实现
更多的候,需要 Docker 容器在後臺以守護態Daemonized形式行。此,可以通添加 `-d` 參數來實現
例如下面的命令会在后台运行容器。
例如下面的命令會在後臺運行容器。
```
$ sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147
```
容器启动后会返回一唯一的 id也可以通 `docker ps` 命令查看容器信息。
容器啟動後會返回一唯一的 id也可以通 `docker ps` 命令查看容器信息。
```
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1e5535038e28 ubuntu:14.04 /bin/sh -c 'while tr 2 minutes ago Up 1 minute insane_babbage
```
取容器的出信息,可以通 `docker logs` 命令。
取容器的出信息,可以通 `docker logs` 命令。
```
$ sudo docker logs insane_babbage
hello world

View File

@@ -1,8 +1,8 @@
## 入容器
在使用 `-d` 参数时,容器启动后会进入后台
某些候需要入容器行操作,有很多方法,包括使用 `docker attach` 命令或 `nsenter` 工具等。
## 入容器
在使用 `-d` 參數時,容器啟動後會進入後臺
某些候需要入容器行操作,有很多方法,包括使用 `docker attach` 命令或 `nsenter` 工具等。
### attach 命令
`docker attach` 是Docker自的命令。下面示例如何使用命令。
`docker attach` 是Docker自的命令。下面示例如何使用命令。
```
$ sudo docker run -idt ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
@@ -12,12 +12,12 @@ CONTAINER ID IMAGE COMMAND CREATED
$sudo docker attach nostalgic_hypatia
root@243c32535da7:/#
```
但是使用 `attach` 命令有时候并不方便。当多个窗口同 attach 到同一容器的候,所有窗口都同步示。当某个窗口因命令阻塞,其他窗口也无法执行操作了。
但是使用 `attach` 命令有時候並不方便。當多個窗口同 attach 到同一容器的候,所有窗口都同步示。當某個窗口因命令阻塞,其他窗口也無法執行操作了。
### nsenter 命令
#### 安
`nsenter` 工具在 util-linux 包2.23版本包含。
如果系中 util-linux 包没有该命令,可以按照下面的方法从源码安装
#### 安
`nsenter` 工具在 util-linux 包2.23版本包含。
如果系中 util-linux 包沒有該命令,可以按照下面的方法從源碼安裝
```
$ cd /tmp; curl https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz | tar -zxf-; cd util-linux-2.24;
$ ./configure --without-ncurses
@@ -25,23 +25,23 @@ $ make nsenter && sudo cp nsenter /usr/local/bin
```
#### 使用
`nsenter` 可以访问另一个进程的名字空。nsenter 要正常工作需要有 root 限。
很不幸Ubuntu 14.4 仍然使用的是 util-linux 2.20。安最新版本的 util-linux2.24)版,按照以下步
`nsenter` 可以訪問另一個進程的名字空。nsenter 要正常工作需要有 root 限。
很不幸Ubuntu 14.4 仍然使用的是 util-linux 2.20。安最新版本的 util-linux2.24)版,按照以下步
```
$ wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz; tar xzvf util-linux-2.24.tar.gz
$ cd util-linux-2.24
$ ./configure --without-ncurses && make nsenter
$ sudo cp nsenter /usr/local/bin
```
为了连接到容器,你需要找到容器的第一个进程的 PID可以通下面的命令取。
為了連接到容器,你需要找到容器的第一個進程的 PID可以通下面的命令取。
```
PID=$(docker inspect --format "{{ .State.Pid }}" <container>)
```
过这个 PID就可以接到这个容器:
過這個 PID就可以接到這個容器:
```
$ nsenter --target $PID --mount --uts --ipc --net --pid
```
下面出一完整的例子。
下面出一完整的例子。
```
$ sudo docker run -idt ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
@@ -53,13 +53,13 @@ $ PID=$(docker-pid 243c32535da7)
$ sudo nsenter --target 10981 --mount --uts --ipc --net --pid
root@243c32535da7:/#
```
简单的,建大家下
[.bashrc_docker](https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker)并将内容放到 .bashrc 中。
簡單的,建大家下
[.bashrc_docker](https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker)並將內容放到 .bashrc 中。
```
$ wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker;
$ echo "[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker" >> ~/.bashrc; source ~/.bashrc
```
这个文件中定了很多方便使用 Docker 的命令,例如 `docker-pid` 可以取某容器的 PID`docker-enter` 可以入容器或直接在容器内执行命令。
這個文件中定了很多方便使用 Docker 的命令,例如 `docker-pid` 可以取某容器的 PID`docker-enter` 可以入容器或直接在容器內執行命令。
```
$ echo $(docker-pid <container>)
$ docker-enter <container> ls

View File

@@ -1,28 +1,28 @@
##出和入容器
##出和入容器
###出容器
如果要出本地某容器,可以使用 `docker export` 命令。
###出容器
如果要出本地某容器,可以使用 `docker export` 命令。
```
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7691a814370e ubuntu:14.04 "/bin/bash" 36 hours ago Exited (0) 21 hours ago test
$ sudo docker export 7691a814370e > ubuntu.tar
```
这样将导出容器快照到本地文件。
這樣將導出容器快照到本地文件。
###入容器快照
可以使用 `docker import` 容器快照文件中再导入为镜像,例如
###入容器快照
可以使用 `docker import` 容器快照文件中再導入為鏡像,例如
```
$ cat ubuntu.tar | sudo docker import - test/buntu:v1.0
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3 MB
```
此外,也可以通指定 URL 或者某个目录来导入,例如
此外,也可以通指定 URL 或者某個目錄來導入,例如
```
$sudo docker import http://example.com/exampleimage.tgz example/imagerepo
```
*:用既可以使用 `docker load` 来导入镜像存文件到本地镜像库,也可以使用 `docker import` 来导入一容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即保存容器当时的快照状态),而像存文件保存完整记录,体积也要大。此外,容器快照文件导入时可以重新指定标签等元数据信息。
*:用既可以使用 `docker load` 來導入鏡像存文件到本地鏡像庫,也可以使用 `docker import` 來導入一容器快照到本地鏡像庫。這兩者的區別在於容器快照文件將丟棄所有的歷史記錄和元數據信息(即保存容器當時的快照狀態),而像存文件保存完整記錄,體積也要大。此外,容器快照文件導入時可以重新指定標簽等元數據信息。

View File

@@ -1,9 +1,9 @@
##除容器
可以使用 `docker rm` 来删除一个处于终止状态的容器。
##除容器
可以使用 `docker rm` 來刪除一個處於終止狀態的容器。
例如
```
$sudo docker rm trusting_newton
trusting_newton
```
如果要除一个运行中的容器,可以添加 `-f` 参数。Docker 会发`SIGKILL`号给容器。
如果要除一個運行中的容器,可以添加 `-f` 參數。Docker 會發`SIGKILL`號給容器。

View File

@@ -1,26 +1,26 @@
##启动容器
启动容器有两种方式,一是基于镜像新建一容器并启动,另外一个是将在终止状态stopped的容器重新启动
##啟動容器
啟動容器有兩種方式,一是基於鏡像新建一容器並啟動,另外一個是將在終止狀態stopped的容器重新啟動
Docker 的容器在太轻量级了,很多候用都是随时删除和新建容器。
Docker 的容器在太輕量級了,很多候用都是隨時刪除和新建容器。
###新建并启动
所需要的命令主要 `docker run`
###新建並啟動
所需要的命令主要 `docker run`
例如,下面的命令出一 “Hello World”后终止容器。
例如,下面的命令出一 “Hello World”後終止容器。
```
$ sudo docker run ubuntu:14.04 /bin/echo 'Hello world'
Hello world
```
跟在本地直接`/bin/echo 'hello world'` 乎感不出任何区别
跟在本地直接`/bin/echo 'hello world'` 乎感不出任何區別
下面的命令则启动一个 bash 端,允许用户进行交互。
下面的命令則啟動一個 bash 端,允許用戶進行交互。
```
$ sudo docker run -t -i ubuntu:14.04 /bin/bash
root@af8bae53bdd3:/#
```
其中,`-t` 选项让Docker分配一个伪终pseudo-tty并绑定到容器的标准输入上, `-i` 则让容器的标准输入保持打
其中,`-t` 選項讓Docker分配一個偽終pseudo-tty並綁定到容器的標準輸入上, `-i` 則讓容器的標準輸入保持打
在交互模式下,用可以通过所创建的终端来输入命令,例如
在交互模式下,用可以通過所創建的終端來輸入命令,例如
```
root@af8bae53bdd3:/# pwd
/
@@ -28,24 +28,24 @@ root@af8bae53bdd3:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
```
利用 `docker run` 来创建容器Docker 在后台运行的标准操作包括:
利用 `docker run` 來創建容器Docker 在後臺運行的標準操作包括:
* 查本地是否存在指定的像,不存在就公有仓库下载
* 利用镜像创建并启动一个容器
* 分配一文件系统,并在只读的镜像层外面挂载一层可读写层
* 宿主主配置的网桥接口中接一个虚拟接口到容器中去
* 地址池配置一 ip 地址容器
* 行用指定的用程序
* 行完毕后容器被
* 查本地是否存在指定的像,不存在就公有倉庫下載
* 利用鏡像創建並啟動一個容器
* 分配一文件系統,並在只讀的鏡像層外面掛載一層可讀寫層
* 宿主主配置的網橋接口中接一個虛擬接口到容器中去
* 地址池配置一 ip 地址容器
* 行用指定的用程序
* 行完畢後容器被
###启动已终止容器
可以利用 `docker start` 命令,直接将一个已经终止的容器启动运行。
###啟動已終止容器
可以利用 `docker start` 命令,直接將一個已經終止的容器啟動運行。
容器的核心为所执行的用程序,所需要的源都是用程序行所必需的。除此之外,并没有其它的源。可以在伪终端中利用 `ps``top` 查看程信息。
容器的核心為所執行的用程序,所需要的源都是用程序行所必需的。除此之外,並沒有其它的源。可以在偽終端中利用 `ps``top` 查看程信息。
```
root@ba267838cc1b:/# ps
PID TTY TIME CMD
1 ? 00:00:00 bash
11 ? 00:00:00 ps
```
,容器中仅运行了指定的 bash 用。这种特点使得 Docker 对资源的利用率高,是货真价实的轻量级虚拟化。
,容器中僅運行了指定的 bash 用。這種特點使得 Docker 對資源的利用率高,是貨真價實的輕量級虛擬化。

View File

@@ -1,10 +1,10 @@
##止容器
可以使用 `docker stop` 来终止一个运行中的容器。
##止容器
可以使用 `docker stop` 來終止一個運行中的容器。
此外,Docker容器中指定的应用终结时,容器也自动终止。
例如对于上一章中只启动了一个终端的容器,用户通过 `exit` 命令或 `Ctrl+d` 退出终端时,所建的容器立刻止。
此外,Docker容器中指定的應用終結時,容器也自動終止。
例如對於上一章中只啟動了一個終端的容器,用戶通過 `exit` 命令或 `Ctrl+d` 退出終端時,所建的容器立刻止。
终止状态的容器可以用 `docker ps -a` 命令看到。例如
終止狀態的容器可以用 `docker ps -a` 命令看到。例如
```
sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
@@ -12,6 +12,6 @@ ba267838cc1b ubuntu:14.04 "/bin/bash" 30 minutes a
98e5efa7d997 training/webapp:latest "python app.py" About an hour ago Exited (0) 34 minutes ago backstabbing_pike
```
处于终止状态的容器,可以通 `docker start` 命令重新启动
處於終止狀態的容器,可以通 `docker start` 命令重新啟動
此外,`docker restart` 命令会将一个运行态的容器止,然再重新启动它。
此外,`docker restart` 命令會將一個運行態的容器止,然再重新啟動它。

View File

@@ -1,4 +1,4 @@
# Docker 数据管理
一章介如何在 Docker 部以及容器之管理数据,在容器中管理数据主要有两种方式:
* 数据Data volumes
* 数据卷容器Data volume containers
# Docker 數據管理
一章介如何在 Docker 部以及容器之管理數據,在容器中管理數據主要有兩種方式:
* 數據Data volumes
* 數據卷容器Data volume containers

View File

@@ -1,23 +1,23 @@
## 数据卷容器
如果你有一些持更新的数据需要在容器之共享,最好创建数据卷容器。
## 數據卷容器
如果你有一些持更新的數據需要在容器之共享,最好創建數據卷容器。
数据卷容器,其就是一正常的容器,专门用来提供数据卷供其它容器挂载的。
數據卷容器,其就是一正常的容器,專門用來提供數據卷供其它容器掛載的。
首先,建一命名的数据卷容器 dbdata
首先,建一命名的數據卷容器 dbdata
```
$ sudo docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres
```
,在其他容器中使用 `--volumes-from` 来挂载 dbdata 容器中的数据卷。
,在其他容器中使用 `--volumes-from` 來掛載 dbdata 容器中的數據卷。
```
$ sudo docker run -d --volumes-from dbdata --name db1 training/postgres
$ sudo docker run -d --volumes-from dbdata --name db2 training/postgres
```
可以使用多 `--volumes-from` 参数来从多个容器挂载多个数据卷。
也可以其他已经挂载了容器卷的容器来挂载数据卷。
可以使用多 `--volumes-from` 參數來從多個容器掛載多個數據卷。
也可以其他已經掛載了容器卷的容器來掛載數據卷。
```
$ sudo docker run -d --name db3 --volumes-from db1 training/postgres
```
*意:使用 `--volumes-from` 参数所挂载数据卷的容器自己不需要保持在运行状态
*意:使用 `--volumes-from` 參數所掛載數據卷的容器自己不需要保持在運行狀態
如果除了挂载的容器(包括 dbdata、db1 和 db2数据卷并不会被自动删除。如果要除一个数据卷,必须在删除最后一个还挂载着它的容器使用 `docker rm -v` 命令指定同时删除关联的容器。
可以让用户在容器之间升级和移动数据卷。具的操作在下一节中进行讲解。
如果除了掛載的容器(包括 dbdata、db1 和 db2數據卷並不會被自動刪除。如果要除一個數據卷,必須在刪除最後一個還掛載著它的容器使用 `docker rm -v` 命令指定同時刪除關聯的容器。
可以讓用戶在容器之間升級和移動數據卷。具的操作在下一節中進行講解。

View File

@@ -1,20 +1,20 @@
## 利用数据卷容器来备份、恢复、迁移数据
可以利用数据卷对其中的数据进行进行备份、恢复和迁移。
## 利用數據卷容器來備份、恢復、遷移數據
可以利用數據卷對其中的數據進行進行備份、恢復和遷移。
###
首先使用 `--volumes-from` 标记来创建一个加载 dbdata 容器卷的容器,并从本地主机挂载当前到容器的 /backup 目。命令如下:
###
首先使用 `--volumes-from` 標記來創建一個加載 dbdata 容器卷的容器,並從本地主機掛載當前到容器的 /backup 目。命令如下:
```
$ sudo docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
```
容器启动后,使用了 `tar` 命令来将 dbdata 卷备份为本地的 `/backup/backup.tar`
容器啟動後,使用了 `tar` 命令來將 dbdata 卷備份為本地的 `/backup/backup.tar`
### 恢
如果要恢复数据到一容器,首先建一个带有数据卷的容器 dbdata2。
### 恢
如果要恢復數據到一容器,首先建一個帶有數據卷的容器 dbdata2。
```
$ sudo docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
```
后创建另一容器,挂载 dbdata2 的容器,使用 `untar`压备份文件到挂载的容器卷中。
後創建另一容器,掛載 dbdata2 的容器,使用 `untar`壓備份文件到掛載的容器卷中。
```
$ sudo docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf
/backup/backup.tar

View File

@@ -1,45 +1,45 @@
## 数据
数据卷是一可供一或多容器使用的特殊目,它绕过 UFS可以提供很多有用的特性
* 数据卷可以在容器之共享和重用
* 对数据卷的修改会立马生效
* 对数据卷的更新,不会影响镜
*一直存在,直到有容器使用
## 數據
數據卷是一可供一或多容器使用的特殊目,它繞過 UFS可以提供很多有用的特性
* 數據卷可以在容器之共享和重用
* 對數據卷的修改會立馬生效
* 對數據卷的更新,不會影響鏡
*一直存在,直到有容器使用
*数据卷的使用,类似于 Linux 下对目录或文件行 mount。
*數據卷的使用,類似於 Linux 下對目錄或文件行 mount。
### 建一个数据
在用 `docker run` 命令的候,使用 `-v` 标记来创建一个数据卷并挂载到容器。在一次 run 中多次使用可以挂载多个数据卷。
### 建一個數據
在用 `docker run` 命令的候,使用 `-v` 標記來創建一個數據卷並掛載到容器。在一次 run 中多次使用可以掛載多個數據卷。
下面建一 web 容器,并加载一个数据卷到容器的 `/webapp`
下面建一 web 容器,並加載一個數據卷到容器的 `/webapp`
```
$ sudo docker run -d -P --name web -v /webapp training/webapp python app.py
```
*意:也可以在 Dockerfile 中使用 `VOLUME` 添加一或者多新的卷到由该镜像创建的任意容器。
*意:也可以在 Dockerfile 中使用 `VOLUME` 添加一或者多新的卷到由該鏡像創建的任意容器。
### 挂载一个主机目录作为数据
使用 `-v` 标记也可以指定挂载一个本地主的目到容器中去。
### 掛載一個主機目錄作為數據
使用 `-v` 標記也可以指定掛載一個本地主的目到容器中去。
```
$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
```
上面的命令加载主机`/src/webapp`到容器的 `/opt/webapp`
录。这个功能在进行测试的时候十分方便,比如用可以放置一些程序到本地目中,查看容器是否正常工作。本地目的路径必须是绝对路径,如果目不存在 Docker 会自动为你创建它。
上面的命令加載主機`/src/webapp`到容器的 `/opt/webapp`
錄。這個功能在進行測試的時候十分方便,比如用可以放置一些程序到本地目中,查看容器是否正常工作。本地目的路徑必須是絕對路徑,如果目不存在 Docker 會自動為你創建它。
*Dockerfile 中不支持这种用法,是因 Dockerfile 是了移植和分享用的。然而,不同操作系统的路格式不一,所以目前不能支持。
*Dockerfile 中不支持這種用法,是因 Dockerfile 是了移植和分享用的。然而,不同作業系統的路格式不一,所以目前不能支持。
Docker 挂载数据卷的默认权限是读写,用也可以通 `:ro` 指定为只读
Docker 掛載數據卷的默認權限是讀寫,用也可以通 `:ro` 指定為只讀
```
$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro
training/webapp python app.py
```
加了 `:ro`,就挂载为只读了。
加了 `:ro`,就掛載為只讀了。
### 挂载一个本地主文件作为数据
`-v` 标记也可以从主机挂载单个文件到容器中
### 掛載一個本地主文件作為數據
`-v` 標記也可以從主機掛載單個文件到容器中
```
$ sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
```
这样就可以记录在容器输入过的命令了。
這樣就可以記錄在容器輸入過的命令了。
*意:如果直接挂载一个文件,很多文件编辑工具,包括 `vi` 或者 `sed --in-place`,可能造成文件 inode 的改变,从 Docker 1.1
.0起,这会导致报错误信息。所以最简单的办法就直接挂载文件的父目
*意:如果直接掛載一個文件,很多文件編輯工具,包括 `vi` 或者 `sed --in-place`,可能造成文件 inode 的改變,從 Docker 1.1
.0起,這會導致報錯誤信息。所以最簡單的辦法就直接掛載文件的父目

View File

@@ -1,5 +1,5 @@
## 基本結構
Dockerfile 由一行行命令語句組成,並且支援以 `#` 開頭的釋行。
Dockerfile 由一行行命令語句組成,並且支援以 `#` 開頭的釋行。
一般而言Dockerfile 分為四部分:基礎鏡像資訊、維護者資訊、鏡像操作指令和容器啟動時執行指令。

View File

@@ -1,40 +1,40 @@
## 指令
指令的一般格式 `INSTRUCTION arguments`,指令包括 `FROM``MAINTAINER``RUN` 等。
指令的一般格式 `INSTRUCTION arguments`,指令包括 `FROM``MAINTAINER``RUN` 等。
### FROM
格式 `FROM <image>``FROM <image>:<tag>`
格式 `FROM <image>``FROM <image>:<tag>`
第一指令必须为 `FROM` 指令。且,如果在同一Dockerfile中建多个镜像时,可以使用多 `FROM` 指令(每个镜像一次)。
第一指令必須為 `FROM` 指令。且,如果在同一Dockerfile中建多個鏡像時,可以使用多 `FROM` 指令(每個鏡像一次)。
### MAINTAINER
格式 `MAINTAINER <name>`,指定维护者信息。
格式 `MAINTAINER <name>`,指定維護者信息。
### RUN
格式 `RUN <command>``RUN ["executable", "param1", "param2"]`
格式 `RUN <command>``RUN ["executable", "param1", "param2"]`
前者在 shell 端中行命令,即 `/bin/sh -c`后者则使用 `exec` 行。指定使用其它端可以通第二方式实现,例如 `RUN ["/bin/bash", "-c", "echo hello"]`
前者在 shell 端中行命令,即 `/bin/sh -c`後者則使用 `exec` 行。指定使用其它端可以通第二方式實現,例如 `RUN ["/bin/bash", "-c", "echo hello"]`
`RUN` 指令将在当前镜像基础上执行指定命令,提交新的像。命令较长时可以使用 `\` 来换行。
`RUN` 指令將在當前鏡像基礎上執行指定命令,提交新的像。命令較長時可以使用 `\` 來換行。
### CMD
支持三格式
* `CMD ["executable","param1","param2"]` 使用 `exec` 行,推方式;
* `CMD command param1 param2``/bin/sh`行,提供需要交互的用;
* `CMD ["param1","param2"]` 提供 `ENTRYPOINT` 的默认参数
支持三格式
* `CMD ["executable","param1","param2"]` 使用 `exec` 行,推方式;
* `CMD command param1 param2``/bin/sh`行,提供需要交互的用;
* `CMD ["param1","param2"]` 提供 `ENTRYPOINT` 的默認參數
指定启动容器时执行的命令,每 Dockerfile 只能有一 `CMD` 命令。如果指定了多命令,只有最后一条会被执行。
指定啟動容器時執行的命令,每 Dockerfile 只能有一 `CMD` 命令。如果指定了多命令,只有最後一條會被執行。
如果用户启动容器候指定了行的命令,则会覆盖`CMD` 指定的命令。
如果用戶啟動容器候指定了行的命令,則會覆蓋`CMD` 指定的命令。
### EXPOSE
格式 `EXPOSE <port> [<port>...]`
格式 `EXPOSE <port> [<port>...]`
Docker 服端容器暴露的端口,供互联系统使用。在启动容器需要通 -PDocker 主机会自动分配一端口转发到指定的端口。
Docker 服端容器暴露的端口,供互聯系統使用。在啟動容器需要通 -PDocker 主機會自動分配一端口轉發到指定的端口。
### ENV
格式 `ENV <key> <value>`
指定一个环境变量,会被后续 `RUN` 指令使用,在容器运行时保持。
格式 `ENV <key> <value>`
指定一個環境變量,會被後續 `RUN` 指令使用,在容器運行時保持。
例如
```
@@ -45,59 +45,59 @@ ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
```
### ADD
格式 `ADD <src> <dest>`
格式 `ADD <src> <dest>`
命令将复制指定的 `<src>` 到容器中的 `<dest>`
其中 `<src>` 可以是Dockerfile所在目的一个相对路径;也可以是一 URL可以是一 tar 文件(自动解压为目录)。
命令將復制指定的 `<src>` 到容器中的 `<dest>`
其中 `<src>` 可以是Dockerfile所在目的一個相對路徑;也可以是一 URL可以是一 tar 文件(自動解壓為目錄)。
### COPY
格式 `COPY <src> <dest>`
格式 `COPY <src> <dest>`
制本地主`<src>` Dockerfile 所在目的相对路径)到容器中的 `<dest>`
制本地主`<src>` Dockerfile 所在目的相對路徑)到容器中的 `<dest>`
使用本地目录为源目录时,推使用 `COPY`
使用本地目錄為源目錄時,推使用 `COPY`
### ENTRYPOINT
两种格式:
兩種格式:
* `ENTRYPOINT ["executable", "param1", "param2"]`
* `ENTRYPOINT command param1 param2`shell中行)。
* `ENTRYPOINT command param1 param2`shell中行)。
配置容器启动后执行的命令,且不可被 `docker run` 提供的参数覆盖
配置容器啟動後執行的命令,且不可被 `docker run` 提供的參數覆蓋
Dockerfile 中只能有一 `ENTRYPOINT`指定多个时,只有最后一个起效。
Dockerfile 中只能有一 `ENTRYPOINT`指定多個時,只有最後一個起效。
### VOLUME
格式 `VOLUME ["/data"]`
格式 `VOLUME ["/data"]`
建一可以本地主或其他容器挂载的挂载点,一般用存放数据库和需要保持的数据等。
建一可以本地主或其他容器掛載的掛載點,一般用存放數據庫和需要保持的數據等。
### USER
格式 `USER daemon`
格式 `USER daemon`
指定行容器的用名或 UID后续`RUN`使用指定用
指定行容器的用名或 UID後續`RUN`使用指定用
当服务不需要管理员权限时,可以通过该命令指定行用户。并且可以在之前建所需要的用,例如:`RUN groupadd -r postgres && useradd -r -g postgres postgres`。要临时获取管理员权限可以使用 `gosu`,而不推 `sudo`
當服務不需要管理員權限時,可以通過該命令指定行用戶。並且可以在之前建所需要的用,例如:`RUN groupadd -r postgres && useradd -r -g postgres postgres`。要臨時獲取管理員權限可以使用 `gosu`,而不推 `sudo`
### WORKDIR
格式 `WORKDIR /path/to/workdir`
格式 `WORKDIR /path/to/workdir`
为后续`RUN``CMD``ENTRYPOINT` 指令配置工作目
為後續`RUN``CMD``ENTRYPOINT` 指令配置工作目
可以使用多 `WORKDIR` 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路。例如
可以使用多 `WORKDIR` 指令,後續命令如果參數是相對路徑,則會基於之前命令指定的路。例如
```
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
```
则最终路径为 `/a/b/c`
則最終路徑為 `/a/b/c`
### ONBUILD
格式 `ONBUILD [INSTRUCTION]`
格式 `ONBUILD [INSTRUCTION]`
配置当所创建的像作其它新创建镜像的基础镜像时,所行的操作指令。
配置當所創建的像作其它新創建鏡像的基礎鏡像時,所行的操作指令。
例如Dockerfile 使用如下的内容创建了`image-A`
例如Dockerfile 使用如下的內容創建了`image-A`
```
[...]
ONBUILD ADD . /app/src
@@ -105,7 +105,7 @@ ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]
```
如果基 image-A 建新的镜像时新的Dockerfile中使用 `FROM image-A`指定基础镜像时,会自动执`ONBUILD` 指令容,等价于在后面添加了两条指令。
如果基 image-A 建新的鏡像時新的Dockerfile中使用 `FROM image-A`指定基礎鏡像時,會自動執`ONBUILD` 指令容,等價於在後面添加了兩條指令。
```
FROM image-A
@@ -114,5 +114,5 @@ ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src
```
使用 `ONBUILD` 指令的像,推荐在标签中注明,例如 `ruby:1.9-onbuild`
使用 `ONBUILD` 指令的像,推薦在標簽中註明,例如 `ruby:1.9-onbuild`

View File

@@ -1,28 +1,28 @@
##创建镜
##創建鏡
创建镜像有很多方法,用可以 Docker Hub 取已有镜像并更新,也可以利用本地文件系统创建一
創建鏡像有很多方法,用可以 Docker Hub 取已有鏡像並更新,也可以利用本地文件系統創建一
### 修改已有
先使用下载的镜像启动容器。
### 修改已有
先使用下載的鏡像啟動容器。
```
$ sudo docker run -t -i training/sinatra /bin/bash
root@0b2616b0e5a8:/#
```
意:住容器的 ID后还会用到。
意:住容器的 ID後還會用到。
在容器中添加 json 和 gem 两个应用。
在容器中添加 json 和 gem 兩個應用。
```
root@0b2616b0e5a8:/# gem install json
```
当结束后,我使用 exit 退出,在我的容器已被我们改变了,使用 `docker commit` 命令提交更新的副本。
當結束後,我使用 exit 退出,在我的容器已被我們改變了,使用 `docker commit` 命令提交更新的副本。
```
$ sudo docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2
4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c
```
其中,`-m` 指定提交的明信息,跟我使用的版本控制工具一`-a` 可以指定更新的用信息;之是用来创建镜像的容器的 ID指定目标镜像的仓库名和 tag 信息。建成功后会返回这个镜像的 ID 信息。
其中,`-m` 指定提交的明信息,跟我使用的版本控制工具一`-a` 可以指定更新的用信息;之是用來創建鏡像的容器的 ID指定目標鏡像的倉庫名和 tag 信息。建成功後會返回這個鏡像的 ID 信息。
使用 `docker images` 查看新建的像。
使用 `docker images` 查看新建的像。
```
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
@@ -30,22 +30,22 @@ training/sinatra latest 5bc342fa0b91 10 hours ago 446.7 MB
ouruser/sinatra v2 3c59e02ddd1a 10 hours ago 446.7 MB
ouruser/sinatra latest 5db5f8471261 10 hours ago 446.7 MB
```
,可以使用新的镜像来启动容器
,可以使用新的鏡像來啟動容器
```
$ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash
root@78e82f680994:/#
```
###利用 Dockerfile 来创建镜
使用 `docker commit` 来扩展一个镜像比较简单,但是不方便在一个团队中分享。我可以使用 `docker build` 来创建一新的像。此,首先需要建一 Dockerfile包含一些如何创建镜像的指令。
###利用 Dockerfile 來創建鏡
使用 `docker commit` 來擴展一個鏡像比較簡單,但是不方便在一個團隊中分享。我可以使用 `docker build` 來創建一新的像。此,首先需要建一 Dockerfile包含一些如何創建鏡像的指令。
新建一个目录和一 Dockerfile
新建一個目錄和一 Dockerfile
```
$ mkdir sinatra
$ cd sinatra
$ touch Dockerfile
```
Dockerfile 中每一指令都创建镜像的一,例如:
Dockerfile 中每一指令都創建鏡像的一,例如:
```
# This is a comment
FROM ubuntu:14.04
@@ -54,13 +54,13 @@ RUN apt-get -qq update
RUN apt-get -qqy install ruby ruby-dev
RUN gem install sinatra
```
Dockerfile 基本的法是
* 使用`#`来注释
* `FROM` 指令告 Docker 使用哪个镜像作为基础
*着是维护者的信息
* `RUN`开头的指令会在创建中行,比如安装一个软件包,在这里使用 apt-get 来安装了一些
Dockerfile 基本的法是
* 使用`#`來註釋
* `FROM` 指令告 Docker 使用哪個鏡像作為基礎
*著是維護者的信息
* `RUN`開頭的指令會在創建中行,比如安裝一個軟件包,在這裏使用 apt-get 來安裝了一些
编写完成 Dockerfile 可以使用 `docker build` 生成像。
編寫完成 Dockerfile 可以使用 `docker build` 生成像。
```
$ sudo docker build -t="ouruser/sinatra:v2" .
@@ -96,15 +96,15 @@ Successfully installed sinatra-1.4.5
Removing intermediate container 5e9d0065c1f7
Successfully built 324104cde6ad
```
其中 `-t` 标记来添加 tag指定新的像的用信息。
“.” 是 Dockerfile 所在的路径(当前目),也可以替换为一个具体的 Dockerfile 的路
其中 `-t` 標記來添加 tag指定新的像的用信息。
“.” 是 Dockerfile 所在的路徑(當前目),也可以替換為一個具體的 Dockerfile 的路
可以看到 build 程在行操作。它要做的第一件事情就是上传这个 Dockerfile 容,因所有的操作都要依 Dockerfile 来进行。
Dockfile 中的指令被一条一条的执行。每一步都建了一新的容器,在容器中行指令提交修改(就跟之前介绍过`docker commit`)。所有的指令都行完毕之后,返回了最终的镜像 id。所有的中间步骤所产生的容器都被除和清理了。
可以看到 build 程在行操作。它要做的第一件事情就是上傳這個 Dockerfile 容,因所有的操作都要依 Dockerfile 來進行。
Dockfile 中的指令被一條一條的執行。每一步都建了一新的容器,在容器中行指令提交修改(就跟之前介紹過`docker commit`)。所有的指令都行完畢之後,返回了最終的鏡像 id。所有的中間步驟所產生的容器都被除和清理了。
*意一个镜像不能超 127
*意一個鏡像不能超 127
此外,可以利用 `ADD` 命令制本地文件到像;用 `EXPOSE` 命令向外部放端口;用 `CMD` 命令描述容器启动后运行的程序等。例如
此外,可以利用 `ADD` 命令制本地文件到像;用 `EXPOSE` 命令向外部放端口;用 `CMD` 命令描述容器啟動後運行的程序等。例如
```
# put my local web site in myApp folder to /var/www
ADD myApp /var/www
@@ -114,12 +114,12 @@ EXPOSE 80
CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]
```
在可以利用新建的镜像来启动一个容器。
在可以利用新建的鏡像來啟動一個容器。
```
$ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash
root@8196968dac35:/#
```
可以用 `docker tag` 命令修改像的标签
可以用 `docker tag` 命令修改像的標簽
```
$ sudo docker tag 5db5f8471261 ouruser/sinatra:devel
$ sudo docker images ouruser/sinatra
@@ -129,25 +129,25 @@ ouruser/sinatra devel 5db5f8471261 11 hours ago 446.7 MB
ouruser/sinatra v2 5db5f8471261 11 hours ago 446.7 MB
```
*:更多用法,请参考 [Dockerfile](../dockerfile/README.md) 章
*:更多用法,請參考 [Dockerfile](../dockerfile/README.md) 章
### 本地文件系统导
本地文件系统导入一个镜像,可以使用 openvz容器虚拟化的先锋技术)的模板来创建:
openvz 的模板下地址 http://openvz.org/Download/templates/precreated。
### 本地文件系統導
本地文件系統導入一個鏡像,可以使用 openvz容器虛擬化的先鋒技術)的模板來創建:
openvz 的模板下地址 http://openvz.org/Download/templates/precreated。
比如,先下了一 ubuntu-14.04 的像,之使用以下命令入:
比如,先下了一 ubuntu-14.04 的像,之使用以下命令入:
```
sudo cat ubuntu-14.04-x86_64-minimal.tar.gz |docker import - ubuntu:14.04
```
查看新入的像。
查看新入的像。
```
docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 05ac7c0b9383 17 seconds ago 215.5 MB
```
###上传镜
可以通 `docker push` 命令,把自己建的像上传到仓库中来共享。例如,用在 Docker Hub 上完成注册后,可以推送自己的像到仓库中。
###上傳鏡
可以通 `docker push` 命令,把自己建的像上傳到倉庫中來共享。例如,用在 Docker Hub 上完成註冊後,可以推送自己的像到倉庫中。
```
$ sudo docker push ouruser/sinatra
The push refers to a repository [ouruser/sinatra] (len: 1)

View File

@@ -1,7 +1,7 @@
## 像的实现原理
## 像的實現原理
Docker 像是怎么实现增量的修改和维护的?
个镜像都由很多层次构Docker 使用 [Union FS](http://en.wikipedia.org/wiki/UnionFS) 将这些不同的层结合到一个镜像中去。
Docker 像是怎麽實現增量的修改和維護的?
個鏡像都由很多層次構Docker 使用 [Union FS](http://en.wikipedia.org/wiki/UnionFS) 將這些不同的層結合到一個鏡像中去。
通常 Union FS 有两个用途, 一方面可以实现不借助 LVM、RAID 将多个 disk 到同一个目录下,另一更常用的就是将一个只读的分支和一个可写的分支合在一起Live CD 正是基此方法可以允许在镜像不的基上允许用户在其上行一些操作。
Docker 在 AUFS 上建的容器也是利用了似的原理。
通常 Union FS 有兩個用途, 一方面可以實現不借助 LVM、RAID 將多個 disk 到同一個目錄下,另一更常用的就是將一個只讀的分支和一個可寫的分支合在一起Live CD 正是基此方法可以允許在鏡像不的基上允許用戶在其上行一些操作。
Docker 在 AUFS 上建的容器也是利用了似的原理。

View File

@@ -26,4 +26,4 @@ ubuntu trusty 99ec81b80c55 4 weeks ago 266 MB
$ sudo docker run -t -i ubuntu:14.04 /bin/bash
```
如果不指定具體的標記,則預設使用 `latest` 標記信息。
如果不指定具體的標記,則預設使用 `latest`

View File

@@ -2,7 +2,7 @@
可以使用 `docker pull` 命令來從倉庫獲取所需要的鏡像。
下面的例子將從 Docker Hub 倉庫下載一個 Ubuntu 12.04 作系統的鏡像。
下面的例子將從 Docker Hub 倉庫下載一個 Ubuntu 12.04 作系統的鏡像。
```
$ sudo docker pull ubuntu:12.04
Pulling repository ubuntu

View File

@@ -1,5 +1,5 @@
## 移除本地
如果要移除本地的像,可以使用 `docker rmi` 命令。`docker rm` 命令是移除容器。
## 移除本地
如果要移除本地的像,可以使用 `docker rmi` 命令。`docker rm` 命令是移除容器。
```
$ sudo docker rmi training/sinatra
Untagged: training/sinatra:latest
@@ -8,4 +8,4 @@ Deleted: ed0fffdcdae5eb2c3a55549857a8be7fc8bc4241fb19ad714364cbfd7a56b22f
Deleted: 5c58979d73ae448df5af1d8142436d81116187a7633082650549c52c3a2418f0
```
*意:在删除镜像之前要先用 `docker rm` 掉依赖于这个镜像的所有容器。
*意:在刪除鏡像之前要先用 `docker rm` 掉依賴於這個鏡像的所有容器。

View File

@@ -1,7 +1,7 @@
## 存出和载入镜
## 存出和載入鏡
### 存出
如果要导出镜像到本地文件,可以使用 `docker save` 命令。
### 存出
如果要導出鏡像到本地文件,可以使用 `docker save` 命令。
```
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
@@ -10,8 +10,8 @@ ubuntu 14.04 c4ff7513909d 5 weeks ago
$sudo docker save -o ubuntu_14.04.tar ubuntu:14.04
```
### 载入镜
可以使用 `docker load` 从导出的本地文件中再入到本地镜像库,例如
### 載入鏡
可以使用 `docker load` 從導出的本地文件中再入到本地鏡像庫,例如
```
$ sudo docker load --input ubuntu_14.04.tar
```
@@ -19,4 +19,4 @@ $ sudo docker load --input ubuntu_14.04.tar
```
$ sudo docker load < ubuntu_14.04.tar
```
这将导入镜像以及其相的元数据信息(包括标签等)。
這將導入鏡像以及其相的元數據信息(包括標簽等)。

View File

@@ -9,7 +9,7 @@ $ sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker
$ sudo sed -i '$acomplete -F _docker docker' /etc/bash_completion.d/docker.io
```
如果使用作系統自帶包安裝 Docker目前安裝的版本是比較舊的 0.9.1。 要安裝更新的版本,可以通過使用 Docker 源的方式。
如果使用作系統自帶包安裝 Docker目前安裝的版本是比較舊的 0.9.1。 要安裝更新的版本,可以通過使用 Docker 源的方式。
### 通過Docker源安裝最新版本
要安裝最新的 Docker 版本,首先需要安裝 apt-transport-https 支持,之後通過添加源來安裝。

View File

@@ -4,12 +4,12 @@ Docker 是一個開源項目,誕生於 2013 年初,最初是 dotCloud 公司
Docker 自開源後受到廣泛的關注和討論,以至於 dotCloud 公司後來都改名為 Docker Inc。Redhat 已經在其 RHEL6.5 中集中支持 DockerGoogle 也在其 PaaS 產品中廣泛應用。
Docker 項目的目標是實現輕量級的作系統虛擬化解決方案。
Docker 項目的目標是實現輕量級的作系統虛擬化解決方案。
Docker 的基礎是 Linux 容器LXC等技術。
在 LXC 的基礎上 Docker 進行了進一步的封裝,讓用戶不需要去關心容器的管理,使得操作更為簡便。用戶操作 Docker 的容器就像操作一個快速輕量級的虛擬機一樣簡單。
下面的圖片比較了 Docker 和傳統虛擬化方式的不同之處,可見容器是在作系統層面上實現虛擬化,直接使用本地主機的作系統,而傳統方式則是在硬體層面實現。
下面的圖片比較了 Docker 和傳統虛擬化方式的不同之處,可見容器是在作系統層面上實現虛擬化,直接使用本地主機的作系統,而傳統方式則是在硬體層面實現。
![傳統虛擬化](../_images/virtualization.png)

View File

@@ -1,2 +1,2 @@
# Docker 中的网络功能介
Docker 允许通过外部访问容器或容器互的方式提供网络服务
# Docker 中的網絡功能介
Docker 允許通過外部訪問容器或容器互的方式提供網絡服務

View File

@@ -1,70 +1,70 @@
## 容器互
容器的linking是除了端口映射外,另一跟容器中用交互的方式。
## 容器互
容器的linking是除了端口映射外,另一跟容器中用交互的方式。
该系统会在源和接收容器之间创建一隧道,接收容器可以看到源容器指定的信息。
該系統會在源和接收容器之間創建一隧道,接收容器可以看到源容器指定的信息。
### 自定容器命名
接系统依据容器的名称来执行。因此,首先需要自定义一个好记的容器命名。
### 自定容器命名
接系統依據容器的名稱來執行。因此,首先需要自定義一個好記的容器命名。
虽然当创建容器的候,系统默认会分配一名字。自定命名容器有2个好处
* 自定的命名,比较好记,比如一web用容器我可以它起名叫web
* 当要连接其他容器候,可以作为一个有用的参考点,比如接web容器到db容器
雖然當創建容器的候,系統默認會分配一名字。自定命名容器有2個好處
* 自定的命名,比較好記,比如一web用容器我可以它起名叫web
* 當要連接其他容器候,可以作為一個有用的參考點,比如接web容器到db容器
使用 `--name` 标记可以容器自定命名。
使用 `--name` 標記可以容器自定命名。
```
$ sudo docker run -d -P --name web training/webapp python app.py
```
使用 `docker ps` 来验证设定的命名。
使用 `docker ps` 來驗證設定的命名。
```
$ sudo docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aed84ee21bde training/webapp:latest python app.py 12 hours ago Up 2 seconds 0.0.0.0:49154->5000/tcp web
```
也可以使用 `docker inspect` 查看容器的名字
也可以使用 `docker inspect` 查看容器的名字
```
$ sudo docker inspect -f "{{ .Name }}" aed84ee21bde
/web
```
意:容器的名是唯一的。如果已命名了一叫 web 的容器,你要再次使用 web 这个名称的时候,需要先用`docker rm` 来删除之前建的同名容器。
意:容器的名是唯一的。如果已命名了一叫 web 的容器,你要再次使用 web 這個名稱的時候,需要先用`docker rm` 來刪除之前建的同名容器。
`docker run`候如果添加 `--rm` 标记,则容器在终止后会立刻除。意,`--rm``-d` 参数不能同使用。
`docker run`候如果添加 `--rm` 標記,則容器在終止後會立刻除。意,`--rm``-d` 參數不能同使用。
###容器互
使用 `--link` 参数可以容器之安全的行交互。
###容器互
使用 `--link` 參數可以容器之安全的行交互。
下面先建一新的数据库容器。
下面先建一新的數據庫容器。
```
$ sudo docker run -d --name db training/postgres
```
除之前建的 web 容器
除之前建的 web 容器
```
$ docker rm -f web
```
后创建一新的 web 容器,并将它连接到 db 容器
後創建一新的 web 容器,並將它連接到 db 容器
```
$ sudo docker run -d -P --name web --link db:db training/webapp python app.py
```
db 容器和 web 容器建立互联关系。
db 容器和 web 容器建立互聯關系。
`--link` 参数的格式 `--link name:alias`,其中 `name` 是要接的容器的名`alias`这个连接的名。
`--link` 參數的格式 `--link name:alias`,其中 `name` 是要接的容器的名`alias`這個連接的名。
使用 `docker ps` 查看容器的
使用 `docker ps` 查看容器的
```
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
349169744e49 training/postgres:latest su postgres -c '/usr About a minute ago Up About a minute 5432/tcp db, web/db
aed84ee21bde training/webapp:latest python app.py 16 hours ago Up 2 minutes 0.0.0.0:49154->5000/tcp web
```
可以看到自定命名的容器db 和 webdb 容器的 names 列有 db 也有 web/db。表示 web 容器接到 db 容器web 容器被允许访问 db 容器的信息。
可以看到自定命名的容器db 和 webdb 容器的 names 列有 db 也有 web/db。表示 web 容器接到 db 容器web 容器被允許訪問 db 容器的信息。
Docker 在两个互联的容器之间创建了一安全隧道,而且不用映射它的端口到宿主主上。在启动 db 容器的时候并没有使用 `-p``-P` 标记,从而避免了暴露数据库端口到外部网络上。
Docker 在兩個互聯的容器之間創建了一安全隧道,而且不用映射它的端口到宿主主上。在啟動 db 容器的時候並沒有使用 `-p``-P` 標記,從而避免了暴露數據庫端口到外部網絡上。
Docker 通 2 方式容器公开连接信息:
* 环境变
Docker 通 2 方式容器公開連接信息:
* 環境變
* 更新 `/etc/hosts` 文件
使用 `env` 命令查看 web 容器的环境变
使用 `env` 命令查看 web 容器的環境變
```
$ sudo docker run --rm --name web2 --link db:db training/webapp env
. . .
@@ -76,9 +76,9 @@ DB_PORT_5000_TCP_PORT=5432
DB_PORT_5000_TCP_ADDR=172.17.0.5
. . .
```
其中 DB_ 开头的环境变量是供 web 容器接 db 容器使用,前采用大写的连接别名。
其中 DB_ 開頭的環境變量是供 web 容器接 db 容器使用,前采用大寫的連接別名。
除了环境变Docker 添加 host 信息到父容器的 `/etc/hosts` 的文件。下面是父容器 web 的 hosts 文件
除了環境變Docker 添加 host 信息到父容器的 `/etc/hosts` 的文件。下面是父容器 web 的 hosts 文件
```
$ sudo docker run -t -i --rm --link db:db training/webapp /bin/bash
root@aed84ee21bde:/opt/webapp# cat /etc/hosts
@@ -86,8 +86,8 @@ root@aed84ee21bde:/opt/webapp# cat /etc/hosts
. . .
172.17.0.5 db
```
这里有 2 hosts第一是 web 容器web 容器用 id 作他的主名,第二是 db 容器的 ip 和主名。
可以在 web 容器中安 ping 命令来测试跟db容器的通。
這裏有 2 hosts第一是 web 容器web 容器用 id 作他的主名,第二是 db 容器的 ip 和主名。
可以在 web 容器中安 ping 命令來測試跟db容器的通。
```
root@aed84ee21bde:/opt/webapp# apt-get install -yqq inetutils-ping
root@aed84ee21bde:/opt/webapp# ping db
@@ -96,7 +96,7 @@ PING db (172.17.0.5): 48 data bytes
56 bytes from 172.17.0.5: icmp_seq=1 ttl=64 time=0.250 ms
56 bytes from 172.17.0.5: icmp_seq=2 ttl=64 time=0.256 ms
```
用 ping 来测试db容器解析成 `172.17.0.5`
*意:官方的 ubuntu 像默认没有安 ping需要自行安
用 ping 來測試db容器解析成 `172.17.0.5`
*意:官方的 ubuntu 像默認沒有安 ping需要自行安
可以接多子容器到父容器,比如可以接多 web 到 db 容器上。
可以接多子容器到父容器,比如可以接多 web 到 db 容器上。

View File

@@ -1,16 +1,16 @@
## 外部访问容器
容器中可以行一些网络应用,要外部也可以访问这些应用,可以通 `-P``-p` 参数来指定端口映射。
## 外部訪問容器
容器中可以行一些網絡應用,要外部也可以訪問這些應用,可以通 `-P``-p` 參數來指定端口映射。
使用 -P 标记时Docker 会随机映射一 `49000~49900` 的端口到部容器放的网络端口。
使用 -P 標記時Docker 會隨機映射一 `49000~49900` 的端口到部容器放的網絡端口。
使用 `docker ps` 可以看到,本地主的 49155 被映射到了容器的 5000 端口。此时访问本机的 49115 端口即可访问容器 web 用提供的界面。
使用 `docker ps` 可以看到,本地主的 49155 被映射到了容器的 5000 端口。此時訪問本機的 49115 端口即可訪問容器 web 用提供的界面。
```
$ sudo docker run -d -P training/webapp python app.py
$ sudo docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bc533791f3f5 training/webapp:latest python app.py 5 seconds ago Up 2 seconds 0.0.0.0:49155->5000/tcp nostalgic_morse
```
的,可以通 `docker logs` 命令查看用的信息。
的,可以通 `docker logs` 命令查看用的信息。
```
$ sudo docker logs -f nostalgic_morse
* Running on http://0.0.0.0:5000/
@@ -18,38 +18,38 @@ $ sudo docker logs -f nostalgic_morse
10.0.2.2 - - [23/May/2014 20:16:31] "GET /favicon.ico HTTP/1.1" 404 -
```
-p的)可以指定要映射的端口,且,在一指定端口上只可以定一容器。支持的格式有 `ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort`
-p的)可以指定要映射的端口,且,在一指定端口上只可以定一容器。支持的格式有 `ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort`
### 映射所有接口地址
使用 `hostPort:containerPort` 格式本地的 5000 端口映射到容器的 5000 端口,可以
使用 `hostPort:containerPort` 格式本地的 5000 端口映射到容器的 5000 端口,可以
```
$ sudo docker run -d -p 5000:5000 training/webapp python app.py
```
时默认会绑定本地所有接口上的所有地址。
時默認會綁定本地所有接口上的所有地址。
### 映射到指定地址的指定端口
可以使用 `ip:hostPort:containerPort` 格式指定映射使用一特定地址,比如 localhost 地址 127.0.0.1
可以使用 `ip:hostPort:containerPort` 格式指定映射使用一特定地址,比如 localhost 地址 127.0.0.1
```
$ sudo docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
```
### 映射到指定地址的任意端口
使用 `ip::containerPort` 定 localhost 的任意端口到容器的 5000 端口,本地主机会自动分配一端口。
使用 `ip::containerPort` 定 localhost 的任意端口到容器的 5000 端口,本地主機會自動分配一端口。
```
$ sudo docker run -d -p 127.0.0.1::5000 training/webapp python app.py
```
可以使用 udp 标记来指定 udp 端口
可以使用 udp 標記來指定 udp 端口
```
$ sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
```
### 查看映射端口配置
使用 `docker port` 查看前映射的端口配置,也可以查看到定的地址
使用 `docker port` 查看前映射的端口配置,也可以查看到定的地址
```
$ docker port nostalgic_morse 5000
127.0.0.1:49155.
```
意:
* 容器有自己的内部网络和 ip 地址(使用 `docker inspect` 可以取所有的Docker 可以有一个可变的网络配置。)
* -p 标记可以多次使用来绑定多端口
意:
* 容器有自己的內部網絡和 ip 地址(使用 `docker inspect` 可以取所有的Docker 可以有一個可變的網絡配置。)
* -p 標記可以多次使用來綁定多端口
例如
```

View File

@@ -1,10 +1,10 @@
# 仓库
# 倉庫
仓库Repository是集中存放像的地方。
倉庫Repository是集中存放像的地方。
容易混淆的概念是注册服务Registry实际上注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像。从这方面来说,仓库可以被认为是一个具体的项目或目。例如对于仓库地址 `dl.dockerpool.com/ubuntu` 来说`dl.dockerpool.com`注册服务器地址,`ubuntu`仓库名。
容易混淆的概念是註冊服務Registry實際上註冊服務器是管理倉庫的具體服務器,每個服務器上可以有多個倉庫,而每個倉庫下面有多個鏡像。從這方面來說,倉庫可以被認為是一個具體的項目或目。例如對於倉庫地址 `dl.dockerpool.com/ubuntu` 來說`dl.dockerpool.com`註冊服務器地址,`ubuntu`倉庫名。
大部分候,不需要严格区分这两者的概念。
大部分候,不需要嚴格區分這兩者的概念。

View File

@@ -1,28 +1,28 @@
## 仓库配置文件
Docker 的 Registry 利用配置文件提供了一些仓库的模板flavor可以直接使用它们来进行开发或生部署。
## 倉庫配置文件
Docker 的 Registry 利用配置文件提供了一些倉庫的模板flavor可以直接使用它們來進行開發或生部署。
### 模板
`config_sample.yml` 文件中,可以看到一些成的模板段:
* `common`:基配置
* `local`:存储数据到本地文件系
* `s3`:存储数据到 AWS S3 中
`config_sample.yml` 文件中,可以看到一些成的模板段:
* `common`:基配置
* `local`:存儲數據到本地文件系
* `s3`:存儲數據到 AWS S3 中
* `dev`:使用 `local` 模板的基本配置
* `test`单元测试使用
* `prod`:生产环境配置基本上跟s3配置似)
* `gcs`:存储数据到 Google 的云存储
* `swift`:存储数据到 OpenStack Swift 服
* `glance`:存储数据到 OpenStack Glance 服,本地文件系统为后备
* `glance-swift`:存储数据到 OpenStack Glance 服Swift 为后备
* `elliptics`:存储数据到 Elliptics key/value 存
* `test`單元測試使用
* `prod`:生產環境配置基本上跟s3配置似)
* `gcs`:存儲數據到 Google 的雲存儲
* `swift`:存儲數據到 OpenStack Swift 服
* `glance`:存儲數據到 OpenStack Glance 服,本地文件系統為後備
* `glance-swift`:存儲數據到 OpenStack Glance 服Swift 為後備
* `elliptics`:存儲數據到 Elliptics key/value 存
也可以添加自定的模版段。
也可以添加自定的模版段。
认情况下使用的模板是 `dev`,要使用某模板作为默认值,可以添加 `SETTINGS_FLAVOR`环境变量中,例如
認情況下使用的模板是 `dev`,要使用某模板作為默認值,可以添加 `SETTINGS_FLAVOR`環境變量中,例如
```
export SETTINGS_FLAVOR=dev
```
另外,配置文件中支持从环境变量中加值,法格式 `_env:VARIABLENAME[:DEFAULT]`
另外,配置文件中支持從環境變量中加值,法格式 `_env:VARIABLENAME[:DEFAULT]`
### 示例配置
```
@@ -54,4 +54,4 @@ test:
storage_path: /tmp/tmpdockertmp
```
### 选项
### 選項

View File

@@ -1,14 +1,14 @@
## Docker Hub
目前 Docker 官方维护了一公共仓库 [Docker Hub](https://hub.docker.com/),其中已包括了超 15,000 的像。大部分需求,都可以通在 Docker Hub 中直接下载镜像来实现
目前 Docker 官方維護了一公共倉庫 [Docker Hub](https://hub.docker.com/),其中已包括了超 15,000 的像。大部分需求,都可以通在 Docker Hub 中直接下載鏡像來實現
### 登
可以通过执`docker login` 命令来输入用名、密码和邮箱来完成注册和登
注册成功,本地用户目录`.dockercfg`保存用户的认证信息。
### 登
可以通過執`docker login` 命令來輸入用名、密碼和郵箱來完成註冊和登
註冊成功,本地用戶目錄`.dockercfg`保存用戶的認證信息。
### 基本操作
户无需登即可通 `docker search` 命令查找官方仓库中的像,利用 `docker pull` 命令来将它下到本地。
戶無需登即可通 `docker search` 命令查找官方倉庫中的像,利用 `docker pull` 命令來將它下到本地。
例如以 centos 为关键词进行搜索:
例如以 centos 為關鍵詞進行搜索:
```
$ sudo docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
@@ -19,16 +19,16 @@ saltstack/centos-6-minimal
tutum/centos-6.4 DEPRECATED. Use tutum/centos:6.4 instead. ... 5 [OK]
...
```
可以看到返回了很多包含关键字的像,其中包括像名字、描述、星(表示该镜像的受迎程度)、是否官方建、是否自动创建。
官方的镜像说明是官方项目组创建和维护automated 源允许用户验证镜像的源和容。
可以看到返回了很多包含關鍵字的像,其中包括像名字、描述、星(表示該鏡像的受迎程度)、是否官方建、是否自動創建。
官方的鏡像說明是官方項目組創建和維護automated 源允許用戶驗證鏡像的源和容。
是否是官方提供,可将镜像资源分为两类
种是类似 centos 这样的基础镜像,被称为基础或根像。些基础镜像是由 Docker 公司建、验证、支持、提供。这样的镜像往往使用单个单词作为名字。
有一种类型,比如 `tianon/centos` 像,它是由 Docker 的用户创建并维护的,往往有用户名称前缀。可以通过前缀 `user_name/` 指定使用某个用户提供的像,比如 tianon 用
是否是官方提供,可將鏡像資源分為兩類
種是類似 centos 這樣的基礎鏡像,被稱為基礎或根像。些基礎鏡像是由 Docker 公司建、驗證、支持、提供。這樣的鏡像往往使用單個單詞作為名字。
有一種類型,比如 `tianon/centos` 像,它是由 Docker 的用戶創建並維護的,往往有用戶名稱前綴。可以通過前綴 `user_name/` 指定使用某個用戶提供的像,比如 tianon 用
另外,在查找的候通 `-s N` 参数可以指定仅显示评价为 `N` 星以上的像。
另外,在查找的候通 `-s N` 參數可以指定僅顯示評價為 `N` 星以上的像。
官方 centos 像到本地。
官方 centos 像到本地。
```
$ sudo docker pull centos
Pulling repository centos
@@ -37,19 +37,19 @@ Pulling repository centos
511136ea3c5a: Download complete
7064731afe90: Download complete
```
也可以在登录后通过 `docker push` 命令来将镜像推送到 Docker Hub。
也可以在登錄後通過 `docker push` 命令來將鏡像推送到 Docker Hub。
### 自动创
动创Automated Builds功能对于需要常升级镜像内程序来说,十分方便。
候,用户创建了像,安了某个软件,如果软件发布新版本需要手更新像。。
### 自動創
動創Automated Builds功能對於需要常升級鏡像內程序來說,十分方便。
候,用戶創建了像,安了某個軟件,如果軟件發布新版本需要手更新像。。
而自动创建允许用户通过 Docker Hub 指定跟踪一个目标网站(目前支持 [GitHub](github.org) 或 [BitBucket](bitbucket.org))上的目,一旦项目发生新的提交,则自动执行创建。
而自動創建允許用戶通過 Docker Hub 指定跟蹤一個目標網站(目前支持 [GitHub](github.org) 或 [BitBucket](bitbucket.org))上的目,一旦項目發生新的提交,則自動執行創建。
要配置自动创建,包括如下的步
* 创建并登陆 Docker Hub以及目标网站;
* 在目标网站中连接帐户到 Docker Hub
* 在 Docker Hub 中 [配置一个自动创](https://registry.hub.docker.com/builds/add/)
* 取一个目标网站中的目(需要含 Dockerfile和分支
* 指定 Dockerfile 的位置,提交建。
要配置自動創建,包括如下的步
* 創建並登陸 Docker Hub以及目標網站;
* 在目標網站中連接帳戶到 Docker Hub
* 在 Docker Hub 中 [配置一個自動創](https://registry.hub.docker.com/builds/add/)
* 取一個目標網站中的目(需要含 Dockerfile和分支
* 指定 Dockerfile 的位置,提交建。
,可以 在Docker Hub 的 [动创建页](https://registry.hub.docker.com/builds/) 中跟每次建的状态
,可以 在Docker Hub 的 [動創建頁](https://registry.hub.docker.com/builds/) 中跟每次建的狀態

View File

@@ -1,18 +1,18 @@
## 私有仓库
## 私有倉庫
候使用 Docker Hub 这样的公共仓库可能不方便,用可以建一本地仓库供私人使用。
候使用 Docker Hub 這樣的公共倉庫可能不方便,用可以建一本地倉庫供私人使用。
节介绍如何使用本地仓库
節介紹如何使用本地倉庫
`docker-registry` 是官方提供的工具,可以用于构建私有的镜像仓库
### 安装运行 docker-registry
#### 容器
在安了 Docker ,可以通过获取官方 registry 镜像来运行。
`docker-registry` 是官方提供的工具,可以用於構建私有的鏡像倉庫
### 安裝運行 docker-registry
#### 容器
在安了 Docker ,可以通過獲取官方 registry 鏡像來運行。
```
$ sudo docker run -d -p 5000:5000 registry
```
这将使用官方的 registry 镜像来启动本地的私有仓库
可以通指定参数来配置私有仓库位置,例如配置像存到 Amazon S3 服
這將使用官方的 registry 鏡像來啟動本地的私有倉庫
可以通指定參數來配置私有倉庫位置,例如配置像存到 Amazon S3 服
```
$ sudo docker run \
-e SETTINGS_FLAVOR=s3 \
@@ -24,18 +24,18 @@ $ sudo docker run \
-p 5000:5000 \
registry
````
此外,可以指定本地路(如 `/home/user/registry-conf` )下的配置文件。
此外,可以指定本地路(如 `/home/user/registry-conf` )下的配置文件。
```
$ sudo docker run -d -p 5000:5000 -v /home/user/registry-conf:/registry-conf -e DOCKER_REGISTRY_CONFIG=/registry-conf/config.yml registry
```
认情况下,仓库会被创建在容器的 `/tmp/registry` 下。可以通 `-v` 参数来将镜像文件存放在本地的指定路
例如下面的例子将上传的镜像放到 `/opt/data/registry` 目
認情況下,倉庫會被創建在容器的 `/tmp/registry` 下。可以通 `-v` 參數來將鏡像文件存放在本地的指定路
例如下面的例子將上傳的鏡像放到 `/opt/data/registry` 目
```
$ sudo docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
```
#### 本地安
对于 Ubuntu 或 CentOS 等行版,可以直接通源安
#### 本地安
對於 Ubuntu 或 CentOS 等行版,可以直接通源安
* Ubuntu
```
$ sudo apt-get install -y build-essential python-dev libevent-dev python-pip liblzma-dev
@@ -47,18 +47,18 @@ $ sudo yum install -y python-devel libevent-devel python-pip gcc xz-devel
$ sudo python-pip install docker-registry
```
也可以 [docker-registry](https://github.com/docker/docker-registry) 目下载源码进行安
也可以 [docker-registry](https://github.com/docker/docker-registry) 目下載源碼進行安
```
$ sudo apt-get install build-essential python-dev libevent-dev python-pip libssl-dev liblzma-dev libffi-dev
$ git clone https://github.com/docker/docker-registry.git
$ cd docker-registry
$ sudo python setup.py install
```
修改配置文件,主要修改 dev 模板段的 `storage_path` 到本地的存储仓库的路
修改配置文件,主要修改 dev 模板段的 `storage_path` 到本地的存儲倉庫的路
```
$ cp config/config_sample.yml config/config.yml
```
后启动 Web 服
後啟動 Web 服
```
$ sudo gunicorn -c contrib/gunicorn.py docker_registry.wsgi:application
```
@@ -66,14 +66,14 @@ $ sudo gunicorn -c contrib/gunicorn.py docker_registry.wsgi:application
```
$ sudo gunicorn --access-logfile - --error-logfile - -k gevent -b 0.0.0.0:5000 -w 4 --max-requests 100 docker_registry.wsgi:application
```
使用访问本地的 5000 端口,看到出 docker-registry 的版本信息说明运行成功。
使用訪問本地的 5000 端口,看到出 docker-registry 的版本信息說明運行成功。
*`config/config_sample.yml` 文件是示例配置文件。
*`config/config_sample.yml` 文件是示例配置文件。
###在私有仓库上传、下、搜索
建好私有仓库之后,就可以使用 `docker tag` 来标记一个镜像,然推送它到仓库,别的机器上就可以下载下来了。例如私有仓库地址 `192.168.7.26:5000`。
###在私有倉庫上傳、下、搜索
建好私有倉庫之後,就可以使用 `docker tag` 來標記一個鏡像,然推送它到倉庫,別的機器上就可以下載下來了。例如私有倉庫地址 `192.168.7.26:5000`。
先在本查看已有的像。
先在本查看已有的像。
```
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
@@ -81,7 +81,7 @@ ubuntu latest ba5877dc9bec 6 week
ubuntu 14.04 ba5877dc9bec 6 weeks ago 192.7 MB
```
使用`docker tag` `ba58` 这个镜像标记为 `192.168.7.26:5000/test`(格式 `docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]`)。
使用`docker tag` `ba58` 這個鏡像標記為 `192.168.7.26:5000/test`(格式 `docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]`)。
```
$ sudo docker tag ba58 192.168.7.26:5000/test
root ~ # docker images
@@ -90,7 +90,7 @@ ubuntu 14.04 ba5877dc9bec 6 week
ubuntu latest ba5877dc9bec 6 weeks ago 192.7 MB
192.168.7.26:5000/test latest ba5877dc9bec 6 weeks ago 192.7 MB
```
使用 `docker push` 上传标记的镜像。
使用 `docker push` 上傳標記的鏡像。
```
$ sudo docker push 192.168.7.26:5000/test
The push refers to a repository [192.168.7.26:5000/test] (len: 1)
@@ -104,14 +104,14 @@ Image 2318d26665ef already pushed, skipping
Image ba5877dc9bec already pushed, skipping
Pushing tag for rev [ba5877dc9bec] on {http://192.168.7.26:5000/v1/repositories/test/tags/latest}
```
用 curl 查看仓库中的像。
用 curl 查看倉庫中的像。
```
$ curl http://192.168.7.26:5000/v1/search
{"num_results": 7, "query": "", "results": [{"description": "", "name": "library/miaxis_j2ee"}, {"description": "", "name": "library/tomcat"}, {"description": "", "name": "library/ubuntu"}, {"description": "", "name": "library/ubuntu_office"}, {"description": "", "name": "library/desktop_ubu"}, {"description": "", "name": "dockerfile/ubuntu"}, {"description": "", "name": "library/test"}]}
```
这里可以看到 `{"description": "", "name": "library/test"}`,表明像已被成功上了。
這裏可以看到 `{"description": "", "name": "library/test"}`,表明像已被成功上了。
在可以到另外一台机器去下载这个镜像。
在可以到另外一臺機器去下載這個鏡像。
```
$ sudo docker pull 192.168.7.26:5000/test
Pulling repository 192.168.7.26:5000/test
@@ -126,7 +126,7 @@ REPOSITORY TAG IMAGE ID CREAT
192.168.7.26:5000/test latest ba5877dc9bec 6 weeks ago 192.7 MB
```
可以使用 [这个脚本](https://github.com/yeasy/docker_practice/raw/master/_local/push_images.sh) 批量上本地的像到注册服务器中,默是本地注册服务器 `127.0.0.1:5000`。例如:
可以使用 [這個腳本](https://github.com/yeasy/docker_practice/raw/master/_local/push_images.sh) 批量上本地的像到註冊服務器中,默是本地註冊服務器 `127.0.0.1:5000`。例如:
```
$ wget https://github.com/yeasy/docker_practice/raw/master/_local/push_images.sh; sudo chmod a+x push_images.sh
$ ./push_images.sh ubuntu:latest centos:centos7

View File

@@ -1,5 +1,5 @@
# 安全
估 Docker 的安全性,主要考虑三个方面:
*核的名字空和控制组机制提供的容器在安全
* Docker程序是服端)本身的抗攻
* 核安全性的加强机制对容器安全性的影
估 Docker 的安全性,主要考慮三個方面:
*核的名字空和控制組機制提供的容器在安全
* Docker程序是服端)本身的抗攻
* 核安全性的加強機制對容器安全性的影

View File

@@ -1,8 +1,8 @@
## 控制
控制是 Linux 容器制的另外一个关键组件,负责实现资源的审计和限制。
## 控制
控制是 Linux 容器制的另外一個關鍵組件,負責實現資源的審計和限制。
它提供了很多有用的特性;以及保各容器可以公平地分享主机的内存、CPU、磁 IO 等源;然,更重要的是,控制组确保了容器内的资源使用产生压力时不会连累主机系统
它提供了很多有用的特性;以及保各容器可以公平地分享主機的內存、CPU、磁 IO 等源;然,更重要的是,控制組確保了容器內的資源使用產生壓力時不會連累主機系統
管控制组不负责隔离容器之相互访问、处理数据和进程,它在防止拒绝服务DDOS方面是必不可少的。尤其是在多用的平(比如公有或私有的 PaaS控制十分重要。例如,某些用程序表现异常的候,可以保一致地正常行和性能。
管控制組不負責隔離容器之相互訪問、處理數據和進程,它在防止拒絕服務DDOS方面是必不可少的。尤其是在多用的平(比如公有或私有的 PaaS控制十分重要。例如,某些用程序表現異常的候,可以保一致地正常行和性能。
控制组机制始 2006 年,内核从 2.6.24 版本始被引入。
控制組機制始 2006 年,內核從 2.6.24 版本始被引入。

View File

@@ -1,18 +1,18 @@
## Docker服端的防
行一容器或用程序的核心是通 Docker 服端。Docker 服务的运行目前需要 root 限,因此其安全性十分关键
## Docker服端的防
行一容器或用程序的核心是通 Docker 服端。Docker 服務的運行目前需要 root 限,因此其安全性十分關鍵
首先,保只有可信的用才可以访问 Docker 服。Docker 允许用户在主和容器共享文件,同不需要限制容器的访问权限,就容易容器突破源限制。例如,意用户启动容器的时候将主机的根目`/`映射到容器的 `/host`中,那容器理上就可以对主机的文件系统进行任意修改了。这听起来很疯狂?但是事实上几乎所有虚拟化系都允许类似的源共享,而法禁止用共享主根文件系统到虚拟机系统
首先,保只有可信的用才可以訪問 Docker 服。Docker 允許用戶在主和容器共享文件,同不需要限制容器的訪問權限,就容易容器突破源限制。例如,意用戶啟動容器的時候將主機的根目`/`映射到容器的 `/host`中,那容器理上就可以對主機的文件系統進行任意修改了。這聽起來很瘋狂?但是事實上幾乎所有虛擬化系都允許類似的源共享,而法禁止用共享主根文件系統到虛擬機系統
这将会造成很重的安全果。因此,提供容器建服务时(例如通过一个 web 服器),要更加注意进行参数的安全查,防止意的用用特定参数来创建一些破性的容器
這將會造成很重的安全果。因此,提供容器建服務時(例如通過一個 web 服器),要更加註意進行參數的安全查,防止意的用用特定參數來創建一些破性的容器
了加强对服务端的保Docker 的 REST API端用跟服端通信)在 0.5.2 之使用本地的 Unix 套接字制替代了原先定在 127.0.0.1 上的 TCP 套接字,因为后者容易遭受跨站本攻击。现在用使用 Unix 权限检查来加强套接字的访问安全。
了加強對服務端的保Docker 的 REST API端用跟服端通信)在 0.5.2 之使用本地的 Unix 套接字制替代了原先定在 127.0.0.1 上的 TCP 套接字,因為後者容易遭受跨站本攻擊。現在用使用 Unix 權限檢查來加強套接字的訪問安全。
仍可以利用 HTTP 提供 REST API 访问。建使用安全制,保只有可信的网络或 VPN证书保护机制(例如受保的 stunnel 和 ssl 认证)下的访问可以行。此外,可以使用 HTTPS 和证书来加强保护
仍可以利用 HTTP 提供 REST API 訪問。建使用安全制,保只有可信的網絡或 VPN證書保護機制(例如受保的 stunnel 和 ssl 認證)下的訪問可以行。此外,可以使用 HTTPS 和證書來加強保護
最近改的 Linux 名字空间机制将可以实现使用非 root 用户来运行全功能的容器。这将从根本上解了容器和主机之间共享文件系而引起的安全问题
最近改的 Linux 名字空間機制將可以實現使用非 root 用戶來運行全功能的容器。這將從根本上解了容器和主機之間共享文件系而引起的安全問題
终极目标是改 2 重要的安全特性:
* 容器的 root 用映射到本地主上的非 root 用户,减轻容器和主机之间因权限提升而引起的安全问题
* Docker 服端在非 root 限下行,利用安全可靠的子进程来代理行需要特权权限的操作。些子进程将只允在限定范围内进行操作,例如仅仅负责虚拟网络设定或文件系管理、配置操作等。
終極目標是改 2 重要的安全特性:
* 容器的 root 用映射到本地主上的非 root 用戶,減輕容器和主機之間因權限提升而引起的安全問題
* Docker 服端在非 root 限下行,利用安全可靠的子進程來代理行需要特權權限的操作。些子進程將只允在限定範圍內進行操作,例如僅僅負責虛擬網絡設定或文件系管理、配置操作等。
,建采用用的服务器来运行 Docker 和相的管理服(例如管理服比如 ssh 控和进程监控、管理工具 nrpe、collectd 等)。其它的业务服务都放到容器中去行。
,建采用用的服務器來運行 Docker 和相的管理服(例如管理服比如 ssh 控和進程監控、管理工具 nrpe、collectd 等)。其它的業務服務都放到容器中去行。

View File

@@ -1,26 +1,26 @@
## 核能力
## 核能力
能力Capability是 Linux 核一个强大的特性,可以提供粒度的权限访问控制。
Linux 核自 2.2 版本起就支持能力制,它将权限划分为更加粒度的操作能力,既可以作用在程上,也可以作用在文件上。
能力Capability是 Linux 核一個強大的特性,可以提供粒度的權限訪問控制。
Linux 核自 2.2 版本起就支持能力制,它將權限劃分為更加粒度的操作能力,既可以作用在程上,也可以作用在文件上。
例如,一 Web 服务进程只需要定一个低于 1024 的端口的限,不需要 root 限。那它只需要被授 `net_bind_service` 能力即可。此外,有很多其他的似能力避免进程获取 root 限。
例如,一 Web 服務進程只需要定一個低於 1024 的端口的限,不需要 root 限。那它只需要被授 `net_bind_service` 能力即可。此外,有很多其他的似能力避免進程獲取 root 限。
认情况Docker 启动的容器被格限制只允使用核的一部分能力。
認情況Docker 啟動的容器被格限制只允使用核的一部分能力。
使用能力机制对加强 Docker 容器的安全有很多好。通常,在服器上会运行一堆需要特权权限的程,包括有 ssh、cron、syslogd、硬件管理工具模(例如负载模块)、网络配置工具等等。容器跟这些进程是不同的,因为几乎所有的特权进程都由容器以外的支持系统来进行管理。
* ssh 访问被主上ssh服务来管理;
* cron 通常应该作为用户进程执行,限交使用它服务的应用来处理;
*志系统可由 Docker 或第三方服管理;
* 硬件管理无关紧要,容器中也就无需执行 udevd 以及似服
* 网络管理也都在主机上设置,除非特殊需求,容器不需要对网络进行配置。
使用能力機制對加強 Docker 容器的安全有很多好。通常,在服器上會運行一堆需要特權權限的程,包括有 ssh、cron、syslogd、硬件管理工具模(例如負載模塊)、網絡配置工具等等。容器跟這些進程是不同的,因為幾乎所有的特權進程都由容器以外的支持系統來進行管理。
* ssh 訪問被主上ssh服務來管理;
* cron 通常應該作為用戶進程執行,限交使用它服務的應用來處理;
*誌系統可由 Docker 或第三方服管理;
* 硬件管理無關緊要,容器中也就無需執行 udevd 以及似服
* 網絡管理也都在主機上設置,除非特殊需求,容器不需要對網絡進行配置。
上面的例子可以看出,大部分情下,容器不需要“真正的” root 限,容器只需要少的能力即可。了加安全,容器可以禁用一些必要的限。
上面的例子可以看出,大部分情下,容器不需要“真正的” root 限,容器只需要少的能力即可。了加安全,容器可以禁用一些必要的限。
* 完全禁止任何 mount 操作;
* 禁止直接访问本地主的套接字;
* 禁止访问一些文件系的操作,比如建新的设备、修改文件性等;
* 禁止模块加载
* 禁止直接訪問本地主的套接字;
* 禁止訪問一些文件系的操作,比如建新的設備、修改文件性等;
* 禁止模塊加載
这样,就算攻者在容器中取得了 root 限,也不能得本地主机的较高权限,能行的破也有限。
這樣,就算攻者在容器中取得了 root 限,也不能得本地主機的較高權限,能行的破也有限。
认情况Docker采用 [白名](https://github.com/docker/docker/blob/master/daemon/execdriver/native/template/default_template.go) 制,禁用 [必需功能](https://github.com/docker/docker/blob/master/daemon/execdriver/native/template/default_template.go) 之外的其它限。
然,用也可以根自身需求来为 Docker 容器启用额外的限。
認情況Docker采用 [白名](https://github.com/docker/docker/blob/master/daemon/execdriver/native/template/default_template.go) 制,禁用 [必需功能](https://github.com/docker/docker/blob/master/daemon/execdriver/native/template/default_template.go) 之外的其它限。
然,用也可以根自身需求來為 Docker 容器啟用額外的限。

View File

@@ -1,15 +1,15 @@
## 核名字空
Docker 容器和 LXC 容器很相似,所提供的安全特性也差不多。`docker run` 启动一个容器,在后台 Docker 容器建了一个独立的名字空和控制集合。
## 核名字空
Docker 容器和 LXC 容器很相似,所提供的安全特性也差不多。`docker run` 啟動一個容器,在後臺 Docker 容器建了一個獨立的名字空和控制集合。
名字空提供了最基也是最直接的隔,在容器中行的程不会被运行在主上的程和其它容器发现和作用。
名字空提供了最基也是最直接的隔,在容器中行的程不會被運行在主上的程和其它容器發現和作用。
容器都有自己有的网络栈,意味着它们不能访问其他容器的 sockets 或接口。不,如果主机系统上做了相应的设置,容器可以像跟主交互一的和其他容器交互。指定公共端口或使用 links 来连接 2 容器,容器就可以相互通信了(可以根配置限制通信的策略)。
容器都有自己有的網絡棧,意味著它們不能訪問其他容器的 sockets 或接口。不,如果主機系統上做了相應的設置,容器可以像跟主交互一的和其他容器交互。指定公共端口或使用 links 來連接 2 容器,容器就可以相互通信了(可以根配置限制通信的策略)。
从网络架构的角度看,所有的容器通本地主机的网桥接口相互通信,就像物理器通物理交换机通信一
從網絡架構的角度看,所有的容器通本地主機的網橋接口相互通信,就像物理器通物理交換機通信一
么,内核中实现名字空和私有网络的代是否足成熟?
麽,內核中實現名字空和私有網絡的代是否足成熟?
核名字空间从 2.6.15 版本2008 年 7 月布)之被引入,数年间,这些机制的可靠性在多大型生产系统中被实践验证
核名字空間從 2.6.15 版本2008 年 7 月布)之被引入,數年間,這些機制的可靠性在多大型生產系統中被實踐驗證
实际上,名字空的想法和设计提出的时间要更早,最初是了在核中引入一种机制来实现 [OpenVZ](http://en.wikipedia.org/wiki/OpenVZ) 的特性。
而 OpenVZ 目早在 2005 年就布了,其设计和实现都已十分成熟。
實際上,名字空的想法和設計提出的時間要更早,最初是了在核中引入一種機制來實現 [OpenVZ](http://en.wikipedia.org/wiki/OpenVZ) 的特性。
而 OpenVZ 目早在 2005 年就布了,其設計和實現都已十分成熟。

View File

@@ -1,9 +1,9 @@
## 其它安全特性
除了能力制之外,可以利用一些有的安全机制来增强使用 Docker 的安全性,例如 TOMOYO, AppArmor, SELinux, GRSEC 等。
除了能力制之外,可以利用一些有的安全機制來增強使用 Docker 的安全性,例如 TOMOYO, AppArmor, SELinux, GRSEC 等。
Docker 前默认只启用了能力制。用可以采用多方案来加强 Docker 主的安全,例如:
*核中用 GRSEC 和 PAX这将增加很多编译和运行时的安全查;通地址随机化避免意探等。且,启用该特性不需要 Docker 行任何配置。
* 使用一些有增安全特性的容器模板,比如 AppArmor 的模板和 Redhat SELinux 策略的模板。些模板提供了外的安全特性。
*可以自定义访问控制机制来定制安全策略。
Docker 前默認只啟用了能力制。用可以采用多方案來加強 Docker 主的安全,例如:
*核中用 GRSEC 和 PAX這將增加很多編譯和運行時的安全查;通地址隨機化避免意探等。且,啟用該特性不需要 Docker 行任何配置。
* 使用一些有增安全特性的容器模板,比如 AppArmor 的模板和 Redhat SELinux 策略的模板。些模板提供了外的安全特性。
*可以自定義訪問控制機制來定制安全策略。
跟其它添加到 Docker 容器的第三方工具一(比如网络拓扑和文件系共享),有很多似的制,在不改 Docker 核情下就可以加固有的容器。
跟其它添加到 Docker 容器的第三方工具一(比如網絡拓撲和文件系共享),有很多似的制,在不改 Docker 核情下就可以加固有的容器。

View File

@@ -1,4 +1,4 @@
## 总结
总体来Docker 容器是十分安全的,特是在容器不使用 root 权限来运行进程的
## 總結
總體來Docker 容器是十分安全的,特是在容器不使用 root 權限來運行進程的
另外,用可以使用有工具,比如 Apparmor, SELinux, GRSEC 来增强安全性;甚至自己在核中实现更复杂的安全制。
另外,用可以使用有工具,比如 Apparmor, SELinux, GRSEC 來增強安全性;甚至自己在核中實現更復雜的安全制。

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。