網路概覽
容器網路是指容器連接並與彼此溝通,或與非 Docker 工作負載溝通的能力。
容器預設啟用網路功能,並且可以進行對外連線。容器對於它所連接的網路類型、或是其對等節點是否為 Docker 工作負載並無所知。容器只會看到帶有 IP 位址、閘道、路由表、DNS 服務以及其他網路細節的網路介面。除非該容器使用 none 網路驅動程式。
本頁從容器的角度描述網路功能,以及有關容器網路的概念。本頁不描述 Docker 網路如何運作的作業系統特定細節。有關 Docker 如何在 Linux 上操作 iptables 規則的資訊,請參閱 封包過濾與防火牆。
使用者定義的網路
您可以建立自訂、使用者定義的網路,並將多個容器連接到同一個網路。一旦連接到使用者定義的網路,容器即可使用容器 IP 位址或容器名稱互相通訊。
以下範例使用 bridge 網路驅動程式建立一個網路,並在所建立的網路中執行一個容器。
$ docker network create -d bridge my-net
$ docker run --network=my-net -itd --name=container3 busybox
驅動程式
預設提供以下網路驅動程式,並提供核心網路功能:
| 驅動程式 | 描述 |
|---|---|
bridge | 預設的網路驅動程式。 |
host | 移除容器與 Docker 主機之間的網路隔離。 |
無 | 將容器與主機及其他容器完全隔離。 |
overlay | Overlay 網路將多個 Docker 常駐程式連接在一起。 |
ipvlan | IPvlan 網路提供對 IPv4 與 IPv6 定址的完全控制。 |
macvlan | 為容器分配 MAC 位址。 |
有關不同驅動程式的更多資訊,請參閱 網路驅動程式概覽。
連接至多個網路
一個容器可以連接到多個網路。
例如,前端容器可以連接到具有外部存取權的橋接網路,以及連接到 --internal 網路,以與執行不需要外部網路存取之後端服務的容器進行通訊。
容器也可以連接到不同類型的網路。例如,一個 ipvlan 網路提供網際網路存取,而一個 bridge 網路用於存取本機服務。
發送封包時,如果目的地是直連網路中的位址,封包會發送到該網路。否則,封包會發送到預設閘道以進行路由至其目的地。在上述範例中,ipvlan 網路的閘道必須是預設閘道。
預設閘道由 Docker 選擇,並且可能會在容器的網路連線變更時隨之改變。若要讓 Docker 在建立容器或連接新網路時選擇特定的預設閘道,請設定閘道優先權。請參閱 docker run 與 docker network connect 指令的 gw-priority 選項。
預設的 gw-priority 為 0,而具有最高優先權網路中的閘道即為預設閘道。因此,當某個網路應始終作為預設閘道時,只需將其 gw-priority 設定為 1 即可。
$ docker run --network name=gwnet,gw-priority=1 --network anet1 --name myctr myimage
$ docker network connect anet2 myctr
容器網路
除了使用者定義的網路之外,您還可以使用 --network container:<name|id> 旗標格式,直接將容器連接到另一個容器的網路堆疊。
使用 container: 網路模式的容器不支援以下旗標:
--add-host--hostname--dns--dns-search--dns-option--mac-address--publish--publish-all--expose
以下範例執行一個 Redis 容器,並將 Redis 綁定到 localhost,然後執行 redis-cli 指令並透過 localhost 介面連接到 Redis 伺服器。
$ docker run -d --name redis example/redis --bind 127.0.0.1
$ docker run --rm -it --network container:redis example/redis-cli -h 127.0.0.1
發佈連接埠
預設情況下,當您使用 docker create 或 docker run 建立或執行容器時,橋接網路上的容器不會向外部公開任何連接埠。使用 --publish 或 -p 旗標使連接埠對橋接網路以外的服務可用。這會在主機中建立防火牆規則,將容器連接埠對映到 Docker 主機上的連接埠以供外部存取。以下是一些範例:
| 旗標值 | 描述 |
|---|---|
-p 8080:80 | 將 Docker 主機上的 8080 連接埠對映到容器內的 TCP 80 連接埠。 |
-p 192.168.1.100:8080:80 | 將 Docker 主機 IP 192.168.1.100 上的 8080 連接埠對映到容器內的 TCP 80 連接埠。 |
-p 8080:80/udp | 將 Docker 主機上的 8080 連接埠對映到容器內的 UDP 80 連接埠。 |
-p 8080:80/tcp -p 8080:80/udp | 將 Docker 主機上的 TCP 8080 連接埠對映到容器內的 TCP 80 連接埠,並將 Docker 主機上的 UDP 8080 連接埠對映到容器內的 UDP 80 連接埠。 |
重要發佈容器連接埠預設是不安全的。這意味著,當您發佈容器的連接埠時,它不僅對 Docker 主機可用,對外部世界也可用。
如果您在發佈旗標中包含本機位址 (
127.0.0.1或::1),則只有 Docker 主機及其容器可以存取該發佈的容器連接埠。$ docker run -p 127.0.0.1:8080:80 -p '[::1]:8080:80' nginx警告在 28.0.0 之前的版本中,同一 L2 區段內的主機(例如連接到同一個網路交換器的主機)可以存取發佈到 localhost 的連接埠。如需更多資訊,請參閱 moby/moby#45610
如果您想讓容器對其他容器可存取,則無需發佈容器的連接埠。您可以透過將容器連接到同一個網路(通常是 橋接網路)來啟用容器間通訊。
如果連接埠對映中未指定主機 IP,且橋接網路僅為 IPv4,並且 --userland-proxy=true(預設),則主機 IPv6 位址上的連接埠將對映到容器的 IPv4 位址。
有關連接埠對映的更多資訊,包括如何停用它並使用直接路由到容器,請參閱 封包過濾與防火牆。
IP 位址與主機名稱
建立網路時,預設啟用 IPv4 位址分配,可使用 --ipv4=false 停用。可使用 --ipv6 啟用 IPv6 位址分配。
$ docker network create --ipv6 --ipv4=false v6net
預設情況下,容器會為其連接的每個 Docker 網路取得一個 IP 位址。容器會從該網路的 IP 子網路接收一個 IP 位址。Docker 常駐程式會為容器執行動態子網路劃分與 IP 位址分配。每個網路也都有預設的子網路遮罩與閘道。
您可以將執行中的容器連接到多個網路,方法是在建立容器時多次傳入 --network 旗標,或是對已在執行中的容器使用 docker network connect 指令。在這兩種情況下,您都可以使用 --ip 或 --ip6 旗標來指定容器在該特定網路上的 IP 位址。
同樣地,容器的主機名稱預設為 Docker 中的容器 ID。您可以使用 --hostname 覆寫主機名稱。使用 docker network connect 連接到現有網路時,您可以使用 --alias 旗標為容器在該網路上指定額外的網路別名。
DNS 服務
容器預設使用與主機相同的 DNS 伺服器,但您可以使用 --dns 覆寫此設定。
預設情況下,容器會繼承 /etc/resolv.conf 設定檔中定義的 DNS 設定。連接到預設 bridge 網路的容器會收到此檔案的複本。連接到 自訂網路 的容器會使用 Docker 的內建 DNS 伺服器。內建 DNS 伺服器會將外部 DNS 查詢轉發到主機上設定的 DNS 伺服器。
您可以使用用於啟動容器的 docker run 或 docker create 指令的旗標,以每個容器為基礎設定 DNS 解析。下表描述與 DNS 設定相關的可使用 docker run 旗標。
| 旗標 | 描述 |
|---|---|
--dns | DNS 伺服器的 IP 位址。若要指定多個 DNS 伺服器,請使用多個 --dns 旗標。DNS 請求將從容器的網路命名空間轉發,例如,--dns=127.0.0.1 指的是容器本身的迴路 (loopback) 位址。 |
--dns-search | 用於搜尋非完全限定主機名稱的 DNS 搜尋網域。若要指定多個 DNS 搜尋前綴,請使用多個 --dns-search 旗標。 |
--dns-opt | 表示 DNS 選項及其值的鍵值對。有關有效選項,請參閱作業系統的 resolv.conf 文件。 |
--hostname | 容器為自己使用的主機名稱。若未指定,則預設為容器的 ID。 |
自訂主機
您的容器將在 /etc/hosts 中包含定義容器本身主機名稱的行,以及 localhost 和其他一些常見項目。主機機器上 /etc/hosts 中定義的自訂主機不會被容器繼承。若要將額外的主機傳入容器,請參閱 docker run 參考文件中的 新增項目到容器 hosts 檔案。
代理伺服器
如果您的容器需要使用代理伺服器,請參閱 使用代理伺服器。