啟用 IPv6 支援

IPv6 僅在執行在 Linux 主機上的 Docker 守護程序上受支援。

建立 IPv6 網路

  • 使用 docker network create

    $ docker network create --ipv6 ip6net
    
  • 使用 docker network create,指定 IPv6 子網

    $ docker network create --ipv6 --subnet 2001:db8::/64 ip6net
    
  • 使用 Docker Compose 檔案

     networks:
       ip6net:
         enable_ipv6: true
         ipam:
           config:
             - subnet: 2001:db8::/64

您現在可以執行連線到 ip6net 網路的容器。

$ docker run --rm --network ip6net -p 80:80 traefik/whoami

這在 IPv6 和 IPv4 上都發布了埠 80。您可以透過執行 curl,連線到 IPv6 環回地址上的埠 80 來驗證 IPv6 連線

$ curl http://[::1]:80
Hostname: ea1cfde18196
IP: 127.0.0.1
IP: ::1
IP: 172.17.0.2
IP: 2001:db8::2
IP: fe80::42:acff:fe11:2
RemoteAddr: [2001:db8::1]:37574
GET / HTTP/1.1
Host: [::1]
User-Agent: curl/8.1.2
Accept: */*

對預設橋接網路使用 IPv6

以下步驟展示瞭如何在預設橋接網路上使用 IPv6。

  1. 編輯 Docker 守護程序配置檔案,位於 /etc/docker/daemon.json。配置以下引數

    {
      "ipv6": true,
      "fixed-cidr-v6": "2001:db8:1::/64"
    }
    • ipv6 在預設網路上啟用 IPv6 網路。
    • fixed-cidr-v6 為預設橋接網路分配一個子網,從而啟用動態 IPv6 地址分配。
    • ip6tables 啟用額外的 IPv6 資料包篩選器規則,提供網路隔離和埠對映。它預設啟用,但可以停用。
  2. 儲存配置檔案。

  3. 重新啟動 Docker 守護程序以使更改生效。

    $ sudo systemctl restart docker
    

您現在可以在預設橋接網路上執行容器。

$ docker run --rm -p 80:80 traefik/whoami

這在 IPv6 和 IPv4 上都發布了埠 80。您可以透過向 IPv6 環回地址上的埠 80 發出請求來驗證 IPv6 連線

$ curl http://[::1]:80
Hostname: ea1cfde18196
IP: 127.0.0.1
IP: ::1
IP: 172.17.0.2
IP: 2001:db8:1::242:ac12:2
IP: fe80::42:acff:fe12:2
RemoteAddr: [2001:db8:1::1]:35558
GET / HTTP/1.1
Host: [::1]
User-Agent: curl/8.1.2
Accept: */*

動態 IPv6 子網分配

如果您沒有使用 docker network create --subnet=<your-subnet> 為使用者定義的網路顯式配置子網,這些網路將使用守護程序的預設地址池作為回退。這也適用於從 Docker Compose 檔案建立的網路,其 enable_ipv6 設定為 true

如果 Docker Engine 的 default-address-pools 中沒有包含 IPv6 池,並且沒有給出 --subnet 選項,唯一本地地址 (ULA) 將在啟用 IPv6 時使用。這些 /64 子網包含一個基於 Docker Engine 的隨機生成的 ID 的 40 位全域性 ID,以確保高度的唯一性。

要使用不同的 IPv6 子網池進行動態地址分配,您必須手動配置守護程序的地址池以包含

  • 預設的 IPv4 地址池
  • 一個或多個您自己的 IPv6 池

預設地址池配置為

{
  "default-address-pools": [
    { "base": "172.17.0.0/16", "size": 16 },
    { "base": "172.18.0.0/16", "size": 16 },
    { "base": "172.19.0.0/16", "size": 16 },
    { "base": "172.20.0.0/14", "size": 16 },
    { "base": "172.24.0.0/14", "size": 16 },
    { "base": "172.28.0.0/14", "size": 16 },
    { "base": "192.168.0.0/16", "size": 20 }
  ]
}

以下示例展示了一個具有預設值和 IPv6 池的有效配置。示例中的 IPv6 池提供了最多 256 個大小為 /64 的 IPv6 子網,來自字首長度為 /56 的 IPv6 池。

{
  "default-address-pools": [
    { "base": "172.17.0.0/16", "size": 16 },
    { "base": "172.18.0.0/16", "size": 16 },
    { "base": "172.19.0.0/16", "size": 16 },
    { "base": "172.20.0.0/14", "size": 16 },
    { "base": "172.24.0.0/14", "size": 16 },
    { "base": "172.28.0.0/14", "size": 16 },
    { "base": "192.168.0.0/16", "size": 20 },
    { "base": "2001:db8::/56", "size": 64 }
  ]
}

注意

此示例中的地址 2001:db8::為文件保留的。請用有效的 IPv6 網路替換它。

預設的 IPv4 池來自私有地址範圍,類似於預設的 IPv6 ULA 網路。

Docker in Docker

在使用 xtables(舊版 iptables)而不是 nftables 的主機上,核心模組 ip6_tables 必須在建立 IPv6 Docker 網路之前載入。它通常在 Docker 啟動時自動載入。

但是,如果您在 Docker in Docker 中執行 Docker,而 Docker in Docker 不是基於最新版本的 官方 docker 映象,您可能需要在主機上執行 modprobe ip6_tables。或者,使用守護程序選項 --ip6tables=false 為容器化的 Docker Engine 停用 ip6tables

後續步驟