mirror of
https://github.com/yeasy/docker_practice.git
synced 2025-08-06 15:32:17 +00:00
replace '網絡' as '網路'
This commit is contained in:
@@ -1,12 +1,12 @@
|
||||
# 高級網絡配置
|
||||
本章將介紹 Docker 的一些高級網絡配置和選項。
|
||||
# 高級網路配置
|
||||
本章將介紹 Docker 的一些高級網路配置和選項。
|
||||
|
||||
當 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 容器的時候,同時會創建了一對 `veth pair` 接口(當數據包發送到一個接口時,另外一個接口也可以收到相同的數據包)。這對接口一端在容器內,即 `eth0`;另一端在本地並被掛載到 `docker0` 網橋,名稱以 `veth` 開頭(例如 `vethAQI2QT`)。通過這種方式,主機可以跟容器通信,容器之間也可以相互通信。Docker 就創建了在主機和所有容器之間一個虛擬共享網絡。
|
||||
當創建一個 Docker 容器的時候,同時會創建了一對 `veth pair` 接口(當數據包發送到一個接口時,另外一個接口也可以收到相同的數據包)。這對接口一端在容器內,即 `eth0`;另一端在本地並被掛載到 `docker0` 網橋,名稱以 `veth` 開頭(例如 `vethAQI2QT`)。通過這種方式,主機可以跟容器通信,容器之間也可以相互通信。Docker 就創建了在主機和所有容器之間一個虛擬共享網路。
|
||||
|
||||

|
||||

|
||||
|
||||
接下來的部分將介紹在一些場景中,Docker 所有的網絡定制配置。以及通過 Linux 命令來調整、補充、甚至替換 Docker 默認的網絡配置。
|
||||
接下來的部分將介紹在一些場景中,Docker 所有的網路定制配置。以及通過 Linux 命令來調整、補充、甚至替換 Docker 默認的網路配置。
|
||||
|
@@ -1,8 +1,8 @@
|
||||
## 容器訪問控制
|
||||
容器的訪問控制,主要通過 Linux 上的 `iptables` 防火墻來進行管理和實現。`iptables` 是 Linux 上默認的防火墻軟件,在大部分發行版中都自帶。
|
||||
|
||||
### 容器訪問外部網絡
|
||||
容器要想訪問外部網絡,需要本地系統的轉發支持。在Linux 系統中,檢查轉發是否打開。
|
||||
### 容器訪問外部網路
|
||||
容器要想訪問外部網路,需要本地系統的轉發支持。在Linux 系統中,檢查轉發是否打開。
|
||||
|
||||
```
|
||||
$sysctl net.ipv4.ip_forward
|
||||
@@ -16,18 +16,18 @@ $sysctl -w net.ipv4.ip_forward=1
|
||||
|
||||
### 容器之間訪問
|
||||
容器之間相互訪問,需要兩方面的支持。
|
||||
* 容器的網絡拓撲是否已經互聯。默認情況下,所有容器都會被連接到 `docker0` 網橋上。
|
||||
* 容器的網路拓撲是否已經互聯。默認情況下,所有容器都會被連接到 `docker0` 網橋上。
|
||||
* 本地系統的防火墻軟件 -- `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` 規則可能是類似
|
||||
```
|
||||
|
@@ -1,4 +1,4 @@
|
||||
## 編輯網絡配置文件
|
||||
## 編輯網路配置文件
|
||||
|
||||
Docker 1.2.0 開始支持在執行中的容器裏編輯 `/etc/hosts`, `/etc/hostname` 和 `/etc/resolve.conf` 文件。
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
## 配置 docker0 網橋
|
||||
Docker 服務默認會創建一個 `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 配置
|
||||
|
||||
|
@@ -1,8 +1,8 @@
|
||||
## 工具和示例
|
||||
在介紹自定義網絡拓撲之前,你可能會對一些外部工具和例子感興趣:
|
||||
在介紹自定義網路拓撲之前,你可能會對一些外部工具和例子感興趣:
|
||||
|
||||
### pipework
|
||||
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 的服務器。
|
||||
|
@@ -1,8 +1,8 @@
|
||||
## 映射容器端口到宿主主機的實現
|
||||
|
||||
默認情況下,容器可以主動訪問到外部網絡的連接,但是外部網絡無法訪問到容器。
|
||||
默認情況下,容器可以主動訪問到外部網路的連接,但是外部網路無法訪問到容器。
|
||||
### 容器訪問外部實現
|
||||
容器所有到外部網絡的連接,源地址都會被NAT成本地系統的IP地址。這是使用 `iptables` 的源地址偽裝操作實現的。
|
||||
容器所有到外部網路的連接,源地址都會被NAT成本地系統的IP地址。這是使用 `iptables` 的源地址偽裝操作實現的。
|
||||
|
||||
查看主機的 NAT 規則。
|
||||
```
|
||||
@@ -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 的好處是它能動態從網卡獲取地址。
|
||||
|
||||
### 外部訪問容器實現
|
||||
|
||||
|
@@ -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
|
||||
@@ -40,6 +40,6 @@ $ sudo ip netns exec 3004 ip route add 10.1.1.1/32 dev B
|
||||
```
|
||||
現在這 2 個容器就可以相互 ping 通,並成功建立連接。點到點鏈路不需要子網和子網掩碼。
|
||||
|
||||
此外,也可以不指定 `--net=none` 來創建點到點鏈路。這樣容器還可以通過原先的網絡來通信。
|
||||
此外,也可以不指定 `--net=none` 來創建點到點鏈路。這樣容器還可以通過原先的網路來通信。
|
||||
|
||||
利用類似的辦法,可以創建一個只跟主機通信的容器。但是一般情況下,更推薦使用 `--icc=false` 來關閉容器之間的通信。
|
||||
|
@@ -1,6 +1,6 @@
|
||||
## 快速配置指南
|
||||
|
||||
下面是一個跟 Docker 網絡相關的命令列表。
|
||||
下面是一個跟 Docker 網路相關的命令列表。
|
||||
|
||||
其中有些命令選項只有在 Docker 服務啟動的時候才能配置,而且不能馬上生效。
|
||||
* `-b BRIDGE or --bridge=BRIDGE` --指定容器掛載的網橋
|
||||
@@ -9,7 +9,7 @@
|
||||
* `--icc=true|false` --是否支持容器之間進行通信
|
||||
* `--ip-forward=true|false` --請看下文容器之間的通信
|
||||
* `--iptables=true|false` --禁止 Docker 添加 iptables 規則
|
||||
* `--mtu=BYTES` --容器網絡中的 MTU
|
||||
* `--mtu=BYTES` --容器網路中的 MTU
|
||||
|
||||
下面2個命令選項既可以在啟動服務時指定,也可以 Docker 容器啟動(`docker run`)時候指定。在 Docker 服務啟動的時候指定則會成為默認值,後面執行 `docker run` 時可以覆蓋設置的默認值。
|
||||
* `--dns=IP_ADDRESS...` --使用指定的DNS服務器
|
||||
|
Reference in New Issue
Block a user