使用 IPv6 網路
僅在 Linux 主機上執行的 Docker 守護程序支援 IPv6。
建立一個 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。
編輯 Docker 守護程序配置檔案,位於 `/etc/docker/daemon.json`。配置以下引數:
{ "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 時將使用唯一本地地址 (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 池從一個字首長度為 `/56` 的 IPv6 池中提供了多達 256 個大小為 `/64` 的 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 }
]
}
注意
Docker in Docker
在使用 `xtables` (舊版 `iptables`) 而非 `nftables` 的主機上,必須先載入核心模組 `ip6_tables`,然後才能建立 IPv6 Docker 網路。它通常在 Docker 啟動時自動載入。
但是,如果你在 Docker in Docker 中執行,並且它不是基於官方 `docker` 映象的最新版本,你可能需要在主機上執行 `modprobe ip6_tables`。或者,使用守護程序選項 `--ip6tables=false` 來為容器化的 Docker Engine 停用 `ip6tables`。