網路概觀

容器網路是指容器彼此連線和通訊,或與非 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 主機之間的網路隔離。
none將容器與主機和其他容器完全隔離。
overlayOverlay 網路將多個 Docker 精靈連線在一起。
ipvlanIPvlan 網路提供對 IPv4 和 IPv6 位址的完整控制。
macvlan將 MAC 位址指派給容器。

有關不同驅動程式的詳細資訊,請參閱 網路驅動程式概觀

容器網路

除了使用者定義網路之外,您也可以使用 --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 主機使用,也可供外界使用。

如果您在發佈旗標中包含 localhost IP 位址 (127.0.0.1::1),則只有 Docker 主機及其容器可以存取已發佈的容器連接埠。

$ docker run -p 127.0.0.1:8080:80 -p '[::1]:8080:80' nginx

警告

位於同一個 L2 區段中的主機(例如,連接到同一個網路交換器的那些主機)可以訪問發佈到 localhost 的端口。更多資訊,請參閱 moby/moby#45610

如果您想讓一個容器可以被其他容器訪問,則不需要發佈該容器的端口。您可以通過將容器連接到同一個網路(通常是橋接網路)來啟用容器間的通訊。

如果在端口映射中沒有指定主機 IP,橋接網路僅限 IPv4,並且 `--userland-proxy=true`(預設值),則主機的 IPv6 地址上的端口將映射到容器的 IPv4 地址。

有關端口映射的更多資訊,包括如何停用它以及使用直接路由到容器,請參閱封包過濾和防火牆

IP 位址和主機名稱

預設情況下,容器會為其連接的每個 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` 旗標。

旗標說明
--dnsDNS 伺服器的 IP 地址。要指定多個 DNS 伺服器,請使用多個 `--dns` 旗標。DNS 請求將從容器的網路命名空間轉發,因此,例如,`--dns=127.0.0.1` 指的是容器自身的迴路地址。
--dns-search用於搜尋非完整限定主機名稱的 DNS 搜尋網域。要指定多個 DNS 搜尋前綴,請使用多個 `--dns-search` 旗標。
--dns-opt代表 DNS 選項及其值的鍵值對。有關有效的選項,請參閱您的作業系統的 `resolv.conf` 文件。
--hostname容器自身使用的主機名稱。如果未指定,則預設為容器的 ID。

自訂主機

您的容器在 `/etc/hosts` 中會有定義容器自身主機名稱的行,以及 `localhost` 和其他一些常見項目。主機電腦上 `/etc/hosts` 中定義的自定義主機不會被容器繼承。要將其他主機傳遞到容器中,請參閱 `docker run` 參考文件中將項目新增到容器主機檔案

Proxy 伺服器

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