使用 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 回路位址 (loopback address) 的 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: */*
為預設橋接網路 (bridge network) 使用 IPv6
以下步驟說明如何在預設橋接網路上使用 IPv6。
編輯位於
/etc/docker/daemon.json的 Docker 背景程式設定檔。設定以下參數{ "ipv6": true, "fixed-cidr-v6": "2001:db8:1::/64" }ipv6:在預設網路上啟用 IPv6 網路功能。fixed-cidr-v6:為預設橋接網路分配子網路,啟用動態 IPv6 位址分配。ip6tables:啟用額外的 IPv6 封包過濾規則,提供網路隔離和埠映射。預設為啟用,但可以停用。
儲存設定檔。
重新啟動 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 選項,則在啟用 IPv6 時將使用 唯一本地位址 (Unique Local Addresses, ULA)。這些 /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 子網路,該 IPv6 池的前綴長度為 /56。
{
"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 }
]
}注意
Docker in Docker
在使用 xtables(舊版 iptables)而非 nftables 的主機上,必須在建立 IPv6 Docker 網路之前載入核心模組 ip6_tables。通常在 Docker 啟動時會自動載入。
然而,如果您執行的 Docker in Docker 並非基於 官方 docker 映像檔 的最新版本,您可能需要在主機上執行 modprobe ip6_tables。或者,使用背景程式選項 --ip6tables=false 來停用容器化 Docker Engine 的 ip6tables。