我的环境:

  • OS: CentOS 7.9
  • Docker:20.10.7

1. 启用Docker守护进程对ipv6的支持

要想在Docker容器或者Swarm服务中使用ipv6,首先需要在Docker守护进程中启用对ipv6的支持,具体做法如下:

  1. 编辑docker守护进程的配置文件/etc/docker/daemon.json (若不存在需要手动创建该文件)

     {"experimental": true,"ip6tables": true,"ipv6": true,"fixed-cidr-v6": "2001:db8:1::/64"}
    

    ipv6设置为true,启用对ipv6的支持。
    fixed-cidr-v6,配置ipv6子网。
    ip6tables,启用ip6tables,docker会在ip6tables中配置docker网络相关的规则链。
    experimental,启用实验特性,ip6tables是docker的一个实验功能,所以需要设为true。

  2. 重载配置文件

     sudo systemctl reload docker && sudo systemctl restart docker
    

    现在你可以使用docker network create --ipv6 ... 创建一个支持ipv6的网络了。另外你也可以在启动容器时使用--ip6参数来使容器支持ipv6。

  3. 审查默认bridge网络

     sudo docker network inspect bridge
    


    可以看到已经配置成功!

接下来就可以在容器中使用ipv6了!

2. 在Docker容器中使用ipv6

注意:以下演示依赖于上一步的配置

2.1 创建一个容器

使用nginx做演示:
启动一个容器,此处并没有指定网络所以默认使用名为bridge的网络,该网络在上一步已经支持ipv6了!

docker run --name test -p 81:80 -d nginx:1.21.6

进入容器内部查看网阔配置:

$ docker exec -it test ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 10.156.10.2  netmask 255.255.255.0  broadcast 10.156.10.255inet6 fe80::42:aff:fe9c:a02  prefixlen 64  scopeid 0x20<link>inet6 2001:db8:1::242:a9c:a02  prefixlen 64  scopeid 0x0<global>ether 02:42:0a:9c:0a:02  txqueuelen 0  (Ethernet)RX packets 3923  bytes 9184337 (8.7 MiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 2836  bytes 192127 (187.6 KiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

容器内部已经分配了一个ipv6地址!

2.2 容器与宿主机通信

在上一步容器已经有一个ipv6地址了,但是如果宿主机没有一个合适的ipv6地址还是不能通过ipv6与宿主机通信。比如下面我用的宿主机网络配置:

$ ifconfig ens192
ens192: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 192.168.30.72  netmask 255.255.0.0  broadcast 192.168.255.255inet6 fe80::54f2:a4e2:f5cc:711a  prefixlen 64  scopeid 0x20<link>ether 00:0c:29:c7:26:f5  txqueuelen 1000  (Ethernet)RX packets 38098236  bytes 6981689290 (6.5 GiB)RX errors 0  dropped 3567426  overruns 0  frame 0TX packets 953026  bytes 578286181 (551.4 MiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

尽管该接口有一个ipv6地址fe80::54f2:a4e2:f5cc:711a但是它是本地链路上的私有地址(fe80开头的地址属于私有地址)。私有地址是允许在本地链路上使用,且数据包不会跨链路转发。

所以,容器要想和宿主机通信,宿主机必须有一个非私有ipv6地址,如果默认没有就需要手动配置一个:
编辑网络接口配置文件/etc/sysconfig/network-scripts/ifcfg-ifName,例如我的测试宿主机网卡名称为ens192,那就编辑/etc/sysconfig/network-scripts/ifcfg-ens192:

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=no
IPV6_DEFROUTE=yes
IPV6_PRIVACY=no
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
IPV6ADDR=2018::27
NAME=ens192
UUID=08b8bead-340c-4708-8656-2af2394a7c1c
DEVICE=ens192
ONBOOT=yes
IPADDR=192.168.30.72
PREFIX=16
GATEWAY=192.168.30.1
DNS1=223.5.5.5

保存,执行网络服务重启:

sudo systemctl restart network

查看网卡配置:

$ ifconfig ens192
ens192: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 192.168.30.72  netmask 255.255.0.0  broadcast 192.168.255.255inet6 2018::27  prefixlen 64  scopeid 0x0<global>inet6 fe80::54f2:a4e2:f5cc:711a  prefixlen 64  scopeid 0x20<link>ether 00:0c:29:c7:26:f5  txqueuelen 1000  (Ethernet)RX packets 38106119  bytes 6982319769 (6.5 GiB)RX errors 0  dropped 3568059  overruns 0  frame 0TX packets 953451  bytes 578328655 (551.5 MiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

再次进行容器内ping宿主机:

$ sudo docker exec -it test ping6 2018::27
PING 2018::27(2018::27) 56 data bytes
64 bytes from 2018::27: icmp_seq=1 ttl=64 time=0.135 ms
64 bytes from 2018::27: icmp_seq=2 ttl=64 time=0.137 ms
64 bytes from 2018::27: icmp_seq=3 ttl=64 time=0.145 ms
64 bytes from 2018::27: icmp_seq=4 ttl=64 time=0.137 ms
64 bytes from 2018::27: icmp_seq=5 ttl=64 time=0.152 ms
^C
--- 2018::27 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4000ms
rtt min/avg/max/mdev = 0.135/0.141/0.152/0.006 ms

已经通了!

3. 使docker-compose 编排文件启动的服务支持ipv6

以下操作也须在docker引擎开启ipv6下进行。

3.1 对于版本2的编排文件

对于版本2的编排文件,可以直接在networks配置节点下启用ipv6,下面是个例子:

version: '2'#  其他services定义省略。。。
networks:example:enable_ipv6: truedriver: bridgedriver_opts:com.docker.network.enable_ipv6: "true"ipam:config:- subnet: 172.23.0.0/16- subnet: "2607:f0d0:1002:51:4000::/66"

3.2 对于版本3的编排文件

对于版本3的编排文件,无法像上边那样直接在编排文件中配置网络并开启ipv6,需要按照下面的方式进行:
首先需要通过命令行创建一个网络并启用ipv6:

$ sudo docker network create -d bridge \--ipv6 --subnet 2001:db8:1::1/64 \--subnet 10.156.11.0/24 extnetwork

通过上面的命令创建了一个子网为2001:db8:1::1/64的名字为extnetwork的ipv6网络且支持ipv4。

编排文件:

version: '3'
services:app:image: app:7.16.1container_name: apprestart: alwaysprivileged: truenetworks:- extnetwork #省略其他服务。。。networks:extnetwork:external: true

启用Docker对ipv6的支持相关推荐

  1. 手把手教你如何给 Docker 开启 IPv6 网络支持

    关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ Docker默认是不开启IPv6支持的,但是我们某些业务往往又需要IPv6的支持,特别是IPv ...

  2. 在Docker里使用(支持镜像继承的)supervisor管理进程(转)

    这篇文章是受 dockboard 之托帮忙翻译的与 docker 有关的技术文章.译自 Using Supervisor with Docker to manage processes (suppor ...

  3. docker脚本安装 阿里云_让运行在 Docker 中的 Ghost 支持阿里云 OSS

    本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载.或重新修改使用,但需要注明来源. 署名 4.0 国际 (CC BY 4.0) 本文作者: 苏洋 创建时间: 2020年03月1 ...

  4. 软件驱动安装在docker_别为Docker本地实现不支持GPU发愁,解决方案在此!

    原标题:别为Docker本地实现不支持GPU发愁,解决方案在此! 导读 通过提供独立的执行环境而不需要整个虚拟机的开销,容器已经成为大规模部署应用程序的很有吸引力的选择. Docker让容器变得易于使 ...

  5. java ipv6校验_Java对IPv6的支持详解:支持情况、相关API、演示代码等

    本文由朱益盛.杨晖.傅啸分享,来自IBM Developer社区,原题"使用 Java 开发兼容 IPv6 的网络应用程序",本次收录时有改动. 1.引言 前几天,有个群友跟我讨论 ...

  6. Mesalink v1.0.0 发布,正式支持 TLS 1.3 和 IPv6,支持CMake编译,支持Windows,实现生产环境可用...

    百度智能云 云生态狂欢季 热门云产品1折起>>>   MesaLink TLS是百度安全实验室研发的下一代传输层安全(Transport Layer Security, TLS)库. ...

  7. Docker容器已正式支持苹果M1Mac电脑

    Docker今日发布了新版本Docker Desktop,正式支持了苹果M1芯片的Mac电脑. Docker官方表示,M1 Mac版本的Docker Desktop更加高效,运行起来更加安静,开发者能 ...

  8. Jira-使用docker安装jira(支持最新版本)

    Jira-使用docker安装jira(支持最新版本) 最新版本已支持到9.5.0 本文仅提供交流学习 本文针对具有docker.Linux使用基础的兄弟姐妹们 请提前安装docker软件 需要原生安 ...

  9. ios服务器需要开启ipv6的支持,针对iOS审核要求为应用兼容IPv6

    开发中使用IPv6的好处 1.IPv6:避免了网络地址转换(NAT) 2.通过网络通过使用简化的头提供了更快的路由 3.防止网络分段 4.避免广播邻居地址解析 不建议使用底层的网络API 下图展示的蓝 ...

最新文章

  1. 突发!Spring Cloud 爆高危漏洞。。赶紧修复!!
  2. 自定义HTTP标头:命名约定
  3. 不同年龄段给狗狗起名字,我命中了,你呢?
  4. (转)海量数据面试题集锦
  5. python属性访问权限_python 面向对象-访问权限修饰符
  6. php四种基础算法:冒泡,选择,插入和快速排序法
  7. 软件构造学习笔记-实验3
  8. oracle线程阻塞_Oracle Service Bus –线程阻塞案例研究
  9. 前端学习(1806):前端调试之列表伪类练习二
  10. winform + INotifyPropertyChanged + IDataErrorInfo + ErrorProvider实现自动验证功能
  11. JS日期比较 2013-01-31大于2013-02-01
  12. 论文绘图与合成图片过程中常见问题
  13. iOS学习之路-简单汤姆猫
  14. 详解在VMware Workstation Pro 15 安装 CentOS 7后配置网络
  15. 微型计算机基础答案,第1章 微型计算机基础知识 题库和答案
  16. 数据仓库工程师的职业规划
  17. C语言基础——预处理命令
  18. 华为2015年实习招聘机试
  19. EMC AUTOSTART双机热备
  20. 文旅夜游项目如何做好景区内容建设

热门文章

  1. 智慧大棚Web3D可视化系统 构建高效农业场景
  2. NND今天终于把KD树弄懂了,花了劳资两个小时的有效时间
  3. 公有链七大超级难题:建立点对点的分享社区(二)
  4. 小米新一代大数据统计平台大公开
  5. 面向对象设计实现过程中,建立对象模型的基本方法有哪些?建立对象模型—确定类与对象, 对象是人们对问题域中有意义的事物的抽象,它们既可能是物理实体,也可能是( 抽象概念 )。
  6. 大一暑假实习day4
  7. 33岁转行python,如果不是5岁儿子给我的鼓励,可能幸福也不会来敲门了
  8. 我在妈妈眼里就是一丑小鸭
  9. Nginx rewrite 301 永久重定向跳转
  10. 酒店vr全景展示拍摄提供更多合作和洽谈的机会