现在家庭宽带基本都有公网的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
我没有配置,经测试也是可以的