docker配置使用ipv6

   现在家庭宽带基本都有公网的ipv6地址了,本篇介绍如何让容器内获取到ip6地址,这里说的ip6地址不是从路由器获取的公网地址而是由docker分配的内网地址。
当容器内的程序向外部发送消息时docker会进行转换,因此这个地址虽然不能被外部访问,但是可以访问外部也是有价值的。

1.检查本地的ipv6是否正确

使用下面命令尝试ping和curl试试能否成功,不成功代表本地的ipv6没配置好。如果宿主机都不能使用ipv6那容器获取ipv6也没用了。

1
2
ping6 ipv6.baidu.com
curl https://speed.neu6.edu.cn/getIP.php

下面是我的/etc/network/interfaces配置文件,指明了enp2s0网卡的ipv6为auto。 这样配置我可以获取到ipv6地址了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto enp2s0
allow-hotplug enp2s0
iface enp2s0 inet dhcp
iface enp2s0 inet6 auto

2.配置docker使用ipv6

下面是我的docker配置文件, ipv6表示启用ipv6, ip6tables,experimental 设为 true。fixed-cidr-v6是容器内的内网地址,和上面的172.31是一种用途。
修改后记得重启docker sudo systemctl restart docker

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 hcy@debian:/$ cat /etc/docker/daemon.json 
{
"bip": "172.31.0.1/24",
"ipv6": true,
"fixed-cidr-v6": "2001:db8:1::/64",
"experimental": true,
"ip6tables": true,
"data-root": "/var/lib/docker/",
"log-level": "warn",
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "5"
},
"registry-mirrors": [
"https://hub.docker.com"
]
}

3.配置docker-compose文件

在原先的compose文件中,指明启用ipv6,注意networks是根元素

1
2
3
4
5
6
7
8
9
10
11
12
13
services:
app:
image: xxx
volumes:
- config.json:/config.json
ports:
- '30011:30011'
restart: always

# 这里是需要增加的
networks:
default:
enable_ipv6: true

4. 下线并重新上线服务

服务重新上线后,使用下面手段判断ipv6能否使用。

1
2
3
4
5
6
docker exec -it xxx /bin/sh  #进入容器内部
ifconfig #查看容器内已经可以获取到ipv6了

# ping或者curl ipv6的网站能够成功
ping6 ipv6.baidu.com
curl https://speed.neu6.edu.cn/getIP.php

参考

https://docs.docker.com/engine/daemon/ipv6/
https://fariszr.com/docker-ipv6-setup-with-propagation/

文章中说到的添加default-address-pools我没有配置,经测试也是可以的


docker配置使用ipv6
https://www.huangchaoyu.com/750222647.html/
作者
hcy
发布于
2024年9月11日
更新于
2024年9月10日
许可协议