網路概覽

容器網路是指容器連接並與彼此溝通,或與非 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 主機之間的網路隔離。
將容器與主機及其他容器完全隔離。
overlayOverlay 網路將多個 Docker 常駐程式連接在一起。
ipvlanIPvlan 網路提供對 IPv4 與 IPv6 定址的完全控制。
macvlan為容器分配 MAC 位址。

有關不同驅動程式的更多資訊,請參閱 網路驅動程式概覽

連接至多個網路

一個容器可以連接到多個網路。

例如,前端容器可以連接到具有外部存取權的橋接網路,以及連接到 --internal 網路,以與執行不需要外部網路存取之後端服務的容器進行通訊。

容器也可以連接到不同類型的網路。例如,一個 ipvlan 網路提供網際網路存取,而一個 bridge 網路用於存取本機服務。

發送封包時,如果目的地是直連網路中的位址,封包會發送到該網路。否則,封包會發送到預設閘道以進行路由至其目的地。在上述範例中,ipvlan 網路的閘道必須是預設閘道。

預設閘道由 Docker 選擇,並且可能會在容器的網路連線變更時隨之改變。若要讓 Docker 在建立容器或連接新網路時選擇特定的預設閘道,請設定閘道優先權。請參閱 docker rundocker network connect 指令的 gw-priority 選項。

預設的 gw-priority0,而具有最高優先權網路中的閘道即為預設閘道。因此,當某個網路應始終作為預設閘道時,只需將其 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 createdocker 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 rundocker create 指令的旗標,以每個容器為基礎設定 DNS 解析。下表描述與 DNS 設定相關的可使用 docker run 旗標。

旗標描述
--dnsDNS 伺服器的 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 檔案

代理伺服器

如果您的容器需要使用代理伺服器,請參閱 使用代理伺服器

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.