mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-10 20:04:36 +00:00
修正多個用詞
"s/程序/程式/g" "s/性能/效能/g" "s/如下/以下/g" "s/加載/載入/g" "s/獲取/取得/g" "s/服務器/伺服器/g" "s/信息/訊息/g" "s/註釋/註解/g" "s/裏/裡/g" "s/構建/建立/g" "s/配置/設定/g"
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
# 進階網路配置
|
||||
本章將介紹 Docker 的一些進階網路配置和選項。
|
||||
# 進階網路設定
|
||||
本章將介紹 Docker 的一些進階網路設定和選項。
|
||||
|
||||
當 Docker 啟動時,會自動在主機上建立一個 `docker0` 虛擬橋接器,實際上是 Linux 的一個 bridge,可以理解為一個軟體交換機。它會在掛載到它的網卡之間進行轉發。
|
||||
|
||||
@@ -9,4 +9,4 @@
|
||||
|
||||

|
||||
|
||||
接下來的部分將介紹在一些場景中,Docker 所有的網路自訂配置。以及透過 Linux 命令來調整、補充、甚至替換 Docker 預設的網路配置。
|
||||
接下來的部分將介紹在一些場景中,Docker 所有的網路自訂設定。以及透過 Linux 命令來調整、補充、甚至替換 Docker 預設的網路設定。
|
||||
|
||||
@@ -20,9 +20,9 @@ $sysctl -w net.ipv4.ip_forward=1
|
||||
* 本地系統的防火墻軟件 -- `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` 選項來訪問容器的開放端口。
|
||||
|
||||
@@ -23,7 +23,7 @@ $ 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
|
||||
@@ -31,4 +31,4 @@ $ sudo service docker start
|
||||
啟動 Docker 服務。
|
||||
新建一個容器,可以看到它已經橋接到了 `bridge0` 上。
|
||||
|
||||
可以繼續用 `brctl show` 命令查看橋接的信息。另外,在容器中可以使用 `ip addr` 和 `ip route` 命令來查看 IP 地址配置和路由信息。
|
||||
可以繼續用 `brctl show` 命令查看橋接的訊息。另外,在容器中可以使用 `ip addr` 和 `ip route` 命令來查看 IP 地址設定和路由訊息。
|
||||
|
||||
@@ -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` 提交。
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
## 配置 DNS
|
||||
Docker 沒有為每個容器專門定制鏡像,那麽怎麽自定義配置容器的主機名和 DNS 配置呢?
|
||||
秘訣就是它利用虛擬文件來掛載到來容器的 3 個相關配置文件。
|
||||
## 設定 DNS
|
||||
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` 看到。
|
||||
|
||||
`--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` 來配置容器。
|
||||
註意:如果沒有上述最後 2 個選項,Docker 會默認用主機上的 `/etc/resolv.conf` 來設定容器。
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
## 配置 docker0 網橋
|
||||
## 設定 docker0 網橋
|
||||
Docker 服務默認會建立一個 `docker0` 網橋(其上有一個 `docker0` 內部接口),它在內核層連通了其他的物理或虛擬網卡,這就將所有容器和本地主機都放到同一個物理網路。
|
||||
|
||||
Docker 默認指定了 `docker0` 接口 的 IP 地址和子網掩碼,讓主機和容器之間可以透過網橋相互通信,它還給出了 MTU(接口允許接收的最大傳輸單元),通常是 1500 Bytes,或宿主主機網路路由上支持的默認值。這些值都可以在服務啟動的時候進行配置。
|
||||
Docker 默認指定了 `docker0` 接口 的 IP 地址和子網掩碼,讓主機和容器之間可以透過網橋相互通信,它還給出了 MTU(接口允許接收的最大傳輸單元),通常是 1500 Bytes,或宿主主機網路路由上支持的默認值。這些值都可以在服務啟動的時候進行設定。
|
||||
* `--bip=CIDR` -- IP 地址加掩碼格式,例如 192.168.1.5/24
|
||||
* `--mtu=BYTES` -- 覆蓋默認的 Docker mtu 配置
|
||||
* `--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
|
||||
|
||||
@@ -5,4 +5,4 @@
|
||||
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 的伺服器。
|
||||
|
||||
@@ -13,7 +13,7 @@ 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 的好處是它能動態從網卡取得地址。
|
||||
|
||||
### 外部訪問容器實做
|
||||
|
||||
@@ -38,6 +38,6 @@ 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
|
||||
* 這裡的規則映射了 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 服務即可生效。
|
||||
* 如果希望永久綁定到某個固定的 IP 地址,可以在 Docker 設定文件 `/etc/default/docker` 中指定 `DOCKER_OPTS="--ip=IP_ADDRESS"`,之後重啟 Docker 服務即可生效。
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
使用者有時候需要兩個容器之間可以直連通信,而不用透過主機網橋進行橋接。
|
||||
|
||||
解決辦法很簡單:建立一對 `peer` 接口,分別放到兩個容器中,配置成點到點鏈路類型即可。
|
||||
解決辦法很簡單:建立一對 `peer` 接口,分別放到兩個容器中,設定成點到點鏈路類型即可。
|
||||
|
||||
首先啟動 2 個容器:
|
||||
```
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
## 快速配置指南
|
||||
## 快速設定指南
|
||||
|
||||
下面是一個跟 Docker 網路相關的命令列表。
|
||||
|
||||
其中有些命令選項只有在 Docker 服務啟動的時候才能配置,而且不能馬上生效。
|
||||
其中有些命令選項只有在 Docker 服務啟動的時候才能設定,而且不能馬上生效。
|
||||
* `-b BRIDGE or --bridge=BRIDGE` --指定容器掛載的網橋
|
||||
* `--bip=CIDR` --定制 docker0 的掩碼
|
||||
* `-H SOCKET... or --host=SOCKET...` --Docker 服務端接收命令的通道
|
||||
@@ -12,12 +12,12 @@
|
||||
* `--mtu=BYTES` --容器網路中的 MTU
|
||||
|
||||
下面2個命令選項既可以在啟動服務時指定,也可以 Docker 容器啟動(`docker run`)時候指定。在 Docker 服務啟動的時候指定則會成為默認值,後面執行 `docker run` 時可以覆蓋設置的默認值。
|
||||
* `--dns=IP_ADDRESS...` --使用指定的DNS服務器
|
||||
* `--dns=IP_ADDRESS...` --使用指定的DNS伺服器
|
||||
* `--dns-search=DOMAIN...` --指定DNS搜索域
|
||||
|
||||
最後這些選項只有在 `docker run` 執行時使用,因為它是針對容器的特性內容。
|
||||
* `-h HOSTNAME or --hostname=HOSTNAME` --配置容器主機名
|
||||
* `-h HOSTNAME or --hostname=HOSTNAME` --設定容器主機名
|
||||
* `--link=CONTAINER_NAME:ALIAS` --新增到另一個容器的連接
|
||||
* `--net=bridge|none|container:NAME_or_ID|host` --配置容器的橋接模式
|
||||
* `--net=bridge|none|container:NAME_or_ID|host` --設定容器的橋接模式
|
||||
* `-p SPEC or --publish=SPEC` --映射容器端口到宿主主機
|
||||
* `-P or --publish-all=true|false` --映射容器所有端口到宿主主機
|
||||
|
||||
Reference in New Issue
Block a user