![如何使用 docker-compose 设置 IPv6](https://linux22.com/image/736939/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20docker-compose%20%E8%AE%BE%E7%BD%AE%20IPv6.png)
我在 DigitalOcean 上使用 Ubuntu 18.04,并启用了 IPv6:
PUBLIC IPV6 ADDRESS:
xxxx:xxxx:2:d0::216f:3001
PUBLIC IPV6 GATEWAY:
xxxx:xxxx:2:d0::1
CONFIGURABLE ADDRESS RANGE:
xxxx:xxxx:2:d0::216f:3000 - xxxx:xxxx:2:d0::216f:300f
根据此页面:https://docs.docker.com/v17.09/engine/userguide/networking/default_network/ipv6/#docker-ipv6-cluster
把 16 个 IPv6 地址这样放正确吗?
{
"ipv6": true,
"fixed-cidr-v6": "xxxx:xxxx:2:d0::216f:3000/124"
}
或者,使用这些就可以了(就像 192.168.0.x 之类的)?
{
"ipv6": true,
"fixed-cidr-v6": "2001:db8::c008/125"
}
无论如何我已经尝试了第一个。
docker run -d --name ipv6test alpine ash -c "ping6 2606:4700:4700::1111"
我使用“docker inspect”来获取 IPv6 地址。我制作了 NDP 记录:
ip -6 neigh add proxy xxxx:xxxx:2:d0::216f:3004 dev eth0
这样的话,容器就可以与外界进行通信了。
测试完成。我想将 IPv6 应用于我的项目。从 docker-compose 开始。
根据此页面:https://docs.docker.com/compose/compose-file/#ipv4_address-ipv6_address
version: "3.7"
services:
app:
image: nginx:alpine
networks:
app_net:
ipv6_address: xxxx:xxxx:2:d0::216f:3010
networks:
app_net:
ipam:
driver: default
config:
- subnet: "xxxx:xxxx:2:d0::216f:3000/124"
在容器内部,无法建立连接:
# ping6 2606:4700:4700::1111
PING 2606:4700:4700::1111 (2606:4700:4700::1111): 56 data bytes
ping6: sendto: Address not available
我是否遗漏了什么?
谢谢。
答案1
可能有点晚了,但这是在 DigitalOcean 上对我有用的设置:
- 创造
/etc/docker/daemon.json
:
{
"ipv6": true,
"fixed-cidr-v6": "<Your IPv6 address range start in DO console>/124"
}
sudo systemctl restart docker
添加到您的
docker-compose.yml
:
sysctls:
- "net.ipv6.conf.all.disable_ipv6=0"
基本上,默认设置是禁用 IPv6,我们需要在 sysctl 中启用它。
编辑:实际上,这允许 docker 容器获取 IPv6 地址并执行 IPv6 名称解析,但不知何故它无法发送数据(网络不可达)。
虽然直接启动的 docker 容器docker
在默认bridge
网络上运行,能够访问外部 IPv6 主机,但由启动的 docker 容器docker-compose
在其专用网络中运行,因此可能需要更多的路由工作。我的用例实际上受到限制(socat
作为 IPv4 到 IPv6 代理),所以我只是直接使用主机网络,方法是:
network_mode: host
答案2
我的个人设置是有效的。它使用 docker 的内部默认网桥,而不是用户提供的网络。
- /etc/docker/daemon.json
{
"ipv6": true,
"fixed-cidr-v6": "2a02:168:7a0e:11::/64"
}
- docker-compose.yml
version: '3.3'
services:
shell:
networks:
- bridge
image: centos:8
networks:
bridge:
external: true
- 测试
docker-compose run --rm shell
- 容器内
[root@dfeb2fe7917d /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
218917: eth0@if218918: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 2a02:168:7a0e:11:0:242:ac11:2/64 scope global nodad
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:2/64 scope link
valid_lft forever preferred_lft forever
[root@dfeb2fe7917d /]# ping6 -c 3 google.ch
PING google.ch(zrh04s15-in-x03.1e100.net (2a00:1450:400a:803::2003)) 56 data bytes
64 bytes from zrh04s15-in-x03.1e100.net (2a00:1450:400a:803::2003): icmp_seq=1 ttl=114 time=0.774 ms
64 bytes from zrh04s15-in-x03.1e100.net (2a00:1450:400a:803::2003): icmp_seq=2 ttl=114 time=1.12 ms
64 bytes from zrh04s15-in-x03.1e100.net (2a00:1450:400a:803::2003): icmp_seq=3 ttl=114 time=1.13 ms
--- google.ch ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 4ms
rtt min/avg/max/mdev = 0.774/1.008/1.128/0.165 ms
答案3
ipv6_address:xxxx:xxxx:2:d0::216f:3010 看起来不像在同一个子网中:xxxx:xxxx:2:d0::216f:3000/124
尝试使用类似 xxxx:xxxx:2:d0::216f:300[0-f] 的内容。