橋接網路驅動程式

就網路而言,橋接網路是一種鏈路層裝置,可在網路區段之間轉發流量。橋接器可以是硬體裝置,也可以是在主機核心內執行的軟體裝置。

就 Docker 而言,橋接網路使用軟體橋接器,讓連線到同一個橋接網路的容器可以互相通訊,同時與未連線到該橋接網路的容器隔離。Docker 橋接驅動程式會自動在主機中安裝規則,讓不同橋接網路上的容器無法直接互相通訊。

橋接網路適用於在同一個 Docker Daemon 主機上執行的容器。為了讓在不同 Docker Daemon 主機上執行的容器之間進行通訊,您可以管理作業系統層級的路由,也可以使用覆蓋網路

當您啟動 Docker 時,會自動建立預設橋接網路(也稱為 `bridge`),而且除非另有指定,否則新啟動的容器會連線到它。您也可以建立使用者定義的自訂橋接網路。**使用者定義的橋接網路優於預設的 `bridge` 網路。**

使用者定義的橋接器與預設橋接器之間的差異

  • 使用者定義的橋接器可在容器之間提供自動 DNS 解析.

    預設橋接網路上的容器只能透過 IP 位址互相存取,除非您使用`--link` 選項,這被視為舊版方法。在使用者定義的橋接網路中,容器可以透過名稱或別名來解析彼此。

    想像一個應用程式具有 Web 前端和資料庫後端。如果您將容器命名為 `web` 和 `db`,則 Web 容器可以連線到 `db` 的 db 容器,無論應用程式堆疊在哪個 Docker 主機上執行。

    如果您在預設橋接網路中執行相同的應用程式堆疊,則需要手動在容器之間建立連結(使用舊版 `--link` 旗標)。這些連結需要雙向建立,因此您可以看到,如果需要通訊的容器超過兩個,這會變得複雜。或者,您可以操作容器內的 `/etc/hosts` 檔案,但这會產生難以偵錯的問題。

  • 使用者定義的橋接器提供更好的隔離.

    所有未指定 `--network` 的容器都會附加到預設橋接網路。這可能是一種風險,因為不相關的堆疊/服務/容器就可以通訊。

    使用使用者自訂網路,可提供一個範圍限定的網路,其中只有連接到該網路的容器才能通訊。

  • 容器可以動態地連接到使用者自訂網路或從中斷開連接。.

    在容器的生命週期中,您可以動態地將其連接到使用者自訂網路或從中斷開連接。要將容器從預設橋接網路中移除,您需要停止容器並使用不同的網路選項重新建立它。

  • 每個使用者自訂網路都會建立一個可設定的橋接器。.

    如果您的容器使用預設橋接網路,您可以設定它,但所有容器都會使用相同的設定,例如 MTU 和 iptables 規則。此外,設定預設橋接網路是在 Docker 本身之外進行的,並且需要重新啟動 Docker。

    使用者自訂橋接網路是使用 docker network create 建立和設定的。如果不同的應用程式群組具有不同的網路需求,您可以在建立每個使用者自訂橋接器時分別設定它。

  • 預設橋接網路上的連結容器會共享環境變數。.

    最初,在兩個容器之間共享環境變數的唯一方法是使用 --link 旗標 將它們連結起來。這種變數共享方式在使用者自訂網路中無法使用。但是,有更好的方法可以共享環境變數。以下是一些想法:

    • 多個容器可以使用 Docker 磁碟區掛載包含共享資訊的檔案或目錄。

    • 可以使用 docker-compose 將多個容器一起啟動,並且 compose 檔案可以定義共享變數。

    • 您可以使用 swarm 服務而不是獨立容器,並利用共享的 密鑰設定

連接到同一個使用者自訂橋接網路的容器實際上會將所有埠相互公開。要讓不同網路上的容器或非 Docker 主機可以存取埠,必須使用 -p--publish 旗標 _發佈_ 該埠。

選項

下表描述了使用 bridge 驅動程式建立自訂網路時,可以傳遞給 --option 的驅動程式特定選項。

選項預設值說明
com.docker.network.bridge.name建立 Linux 橋接器時要使用的介面名稱。
com.docker.network.bridge.enable_ip_masqueradetrue啟用 IP 偽裝。
com.docker.network.bridge.gateway_mode_ipv4
com.docker.network.bridge.gateway_mode_ipv6
nat啟用 NAT 和偽裝 (nat),或僅允許直接路由到容器 (routed)。
com.docker.network.bridge.enable_icctrue啟用或停用容器間連線。
com.docker.network.bridge.host_binding_ipv4所有 IPv4 和 IPv6 位址綁定容器埠時的預設 IP。
com.docker.network.driver.mtu0(無限制)設定容器網路的最大傳輸單元 (MTU)。
com.docker.network.container_iface_prefixeth設定容器介面的自訂前綴。
com.docker.network.bridge.inhibit_ipv4false防止 Docker 為網路指派 IP 位址

其中一些選項也可以作為 dockerd CLI 的旗標使用,您可以使用它們在啟動 Docker 守護程式時設定預設的 docker0 橋接器。下表顯示哪些選項在 dockerd CLI 中具有等效的旗標。

選項旗標
com.docker.network.bridge.name-
com.docker.network.bridge.enable_ip_masquerade--ip-masq
com.docker.network.bridge.enable_icc--icc
com.docker.network.bridge.host_binding_ipv4--ip
com.docker.network.driver.mtu--mtu
com.docker.network.container_iface_prefix-

Docker 守護程式支援 --bridge 旗標,您可以使用它來定義您自己的 docker0 橋接器。如果您想在同一個主機上執行多個守護程式執行個體,請使用此選項。詳情請參閱 執行多個守護程式

預設主機繫結位址

當埠發佈選項(例如 -p 80-p 8080:80)中未指定主機位址時,預設會在所有主機位址(IPv4 和 IPv6)上提供容器的埠 80。

橋接網路驅動程式選項 com.docker.network.bridge.host_binding_ipv4 可用於修改已發佈埠的預設位址。

儘管選項名稱如此,但可以指定 IPv6 位址。

當預設綁定位址是指派給特定介面的位址時,容器的埠將只能透過該位址存取。

將預設綁定位址設定為 :: 表示已發佈的埠將僅在主機的 IPv6 位址上可用。但是,將其設定為 0.0.0.0 表示它將在主機的 IPv4 和 IPv6 位址上可用。

要將已發佈的埠限制為僅 IPv4,必須在容器的發佈選項中包含該位址。例如,-p 0.0.0.0:8080:80

管理使用者定義的橋接器

使用 docker network create 命令建立使用者自訂橋接網路。

$ docker network create my-net

您可以指定子網路、IP 位址範圍、閘道器和其他選項。詳情請參閱 docker network create 參考或 docker network create --help 的輸出。

使用 docker network rm 命令移除使用者自訂橋接網路。如果容器目前連接到網路,請先 將它們斷開連接

$ docker network rm my-net

實際上發生了什麼事?

當您建立或移除使用者自訂橋接器,或將容器連接到使用者自訂橋接器或從中斷開連接時,Docker 會使用特定於作業系統的工具來管理底層網路基礎結構(例如在 Linux 上新增或移除橋接裝置或設定 iptables 規則)。這些細節應視為實作細節。讓 Docker 為您管理您的使用者自訂網路。

將容器連線到使用者定義的橋接器

建立新容器時,您可以指定一個或多個 --network 旗標。此範例將 Nginx 容器連接到 my-net 網路。它還會將容器中的埠 80 發佈到 Docker 主機上的埠 8080,以便外部用戶端可以存取該埠。任何其他連接到 my-net 網路的容器都可以存取 my-nginx 容器上的所有埠,反之亦然。

$ docker create --name my-nginx \
  --network my-net \
  --publish 8080:80 \
  nginx:latest

要將 _正在執行的_ 容器連接到現有的使用者自訂橋接器,請使用 docker network connect 命令。以下命令將已在執行的 my-nginx 容器連接到已存在的 my-net 網路。

$ docker network connect my-net my-nginx

將容器與使用者定義的橋接器斷開連線

要將正在執行的容器從使用者自訂橋接器斷開連接,請使用 docker network disconnect 命令。以下命令將 my-nginx 容器從 my-net 網路斷開連接。

$ docker network disconnect my-net my-nginx

在使用者定義的橋接網路中使用 IPv6

建立網路時,您可以指定 --ipv6 旗標來啟用 IPv6。

$ docker network create --ipv6 --subnet 2001:db8:1234::/64 my-net

使用預設橋接網路

預設的 bridge 網路被視為 Docker 的 legacy 細節,不建議用於生產環境。設定它是手動操作,並且具有 技術上的缺點

將容器連線到預設橋接網路

如果您沒有使用 --network 旗標指定網路,並且您指定了網路驅動程式,則您的容器預設會連接到預設的 bridge 網路。連接到預設 bridge 網路的容器可以通訊,但只能透過 IP 位址進行通訊,除非它們使用 legacy --link 旗標 連結。

設定預設橋接網路

要設定預設的 bridge 網路,您可以在 daemon.json 中指定選項。以下是一個指定了多個選項的 daemon.json 範例。只需指定您需要自訂的設定即可。

{
  "bip": "192.168.1.1/24",
  "fixed-cidr": "192.168.1.0/25",
  "mtu": 1500,
  "default-gateway": "192.168.1.254",
  "dns": ["10.20.1.2","10.20.1.3"]
}

重新啟動 Docker 以使變更生效。

將 IPv6 與預設橋接網路搭配使用

可以使用 daemon.json 中的以下選項或其對應的命令列選項,為預設橋接器啟用 IPv6。

這三個選項僅影響預設橋接器,使用者自訂網路不會使用它們。以下的位址是 IPv6 文件範圍中的範例。

  • 選項 ipv6 是必需的。
  • 選項 fixed-cidr-v6 是必需的,它指定要使用的網路前綴。
    • 前綴通常應為 /64 或更短。
    • 對於在本地網路上的實驗,最好使用唯一本地前綴(符合 fd00::/8)而不是鏈路本地前綴(符合 fe80::/10)。
  • 選項 default-gateway-v6 是選用的。如果未指定,則預設值為 fixed-cidr-v6 子網路中的第一個位址。
{
  "ipv6": true,
  "fixed-cidr-v6": "2001:db8::/64",
  "default-gateway-v6": "2001:db8:abcd::89"
}

橋接網路的連線限制

由於 Linux 核心設定的限制,當 1000 個或更多容器連接到單一網路時,橋接網路會變得不穩定,並且容器間通訊可能會中斷。

有關此限制的詳細資訊,請參閱 moby/moby#44973略過 IP 位址設定

com.docker.network.bridge.inhibit_ipv4 選項可讓您建立使用現有橋接器的網路,並讓 Docker 跳過在橋接器上設定 IPv4 位址。如果您想手動設定橋接器的 IP 位址,這會很有用。例如,如果您將實體介面新增到橋接器,並且需要將其 IP 位址移至橋接器介面。

要使用此選項,您應該先將 Docker 守護程式設定為使用自行管理的橋接器,方法是使用 daemon.json 中的 bridge 選項或 dockerd --bridge 旗標。

使用此設定,除非您已手動設定橋接器的 IP 位址,否則南北向流量將無法運作。

後續步驟