简介
距离上一次折腾docker ipv6已经过了2年多了,docker版本也升级到27.5.1了。
docker内部对IPV6的支持也有了长足的进步。
结合近期使用docker compose,ipv6折腾的经验,记录笔记如下:
内部有了IPV6支持
推荐/etc/docker/daemon.json增加配置4项:
{"ipv6": true,"fixed-cidr-v6": "fc00::/7","experimental": true,"ip6tables": true }
"ipv6": true
- 启用Docker的IPv6支持
- 允许容器使用IPv6网络
- 如果不开启此选项,容器将只能使用IPv4
"fixed-cidr-v6": "fc00::/7"
- 设置Docker IPv6地址的固定CIDR范围
- fc00::/7是一个私有IPv6地址段
- Docker会从这个地址段中为容器分配IPv6地址
- 类似于IPv4中的172.17.0.0/16默认网段
- 格式为<IPv6前缀>/<子网掩码长度>
"experimental": true
- 启用Docker的实验性功能
- 允许使用一些尚在开发或测试阶段的特性
- 某些新的网络功能可能需要开启此选项
- 实验性功能可能在未来版本中变化或移除
"ip6tables": true
- 启用Docker的IPv6防火墙规则管理
- 允许Docker自动管理IPv6的iptables规则
- 控制容器间的IPv6通信和端口映射
- 确保IPv6网络安全性和正确路由
重启docker
systemctl daemon-reload
systemctl restart docker
yaml使用
简单使用
services: #服务apache: #服务名image: httpd:alpine #镜像名称ports: #开放端口映射,家庭宽带封禁80端口- 18080:80 #冒号左边是宿主机开放端口,冒号右边是容器开放端口 # 定义网络配置 networks:#未设置网络时,使用默认网络default:#启用ipv6enable_ipv6: true
这是就可以直接从互联网访问18080了
定制使用-限定默认网络
services: #服务apache: #服务名image: httpd:alpine #镜像名称ports: #开放端口映射,家庭宽带封禁80端口- 18443:80 #冒号左边是宿主机开放端口,冒号右边是容器开放端口 # 定义网络配置 networks:#未设置网络时,使用默认网络default:#自定义默认网络名name: mynet#启用ipv6enable_ipv6: true
定制使用-限定指定网络
services: #服务apache: #服务名image: httpd:alpine #镜像名称ports: #开放端口映射,家庭宽带封禁80端口- 18443:80 #冒号左边是宿主机开放端口,冒号右边是容器开放端口networks: #网络- frontnet #属于网络frontnet # 定义网络配置 networks:#设置网络时,使用frontnet网络frontnet:#定义网络名name: front_net#启用ipv6enable_ipv6: true
互联互通示例(AI生成)
services:apache:image: httpd:alpinenetworks:- frontend # 连接到前端网络- backend # 连接到后端网络mysql:image: mysql:8networks:- backend # 连接到后端网络nginx:image: nginx:alpinenetworks:- frontend # 只连接到前端网络# 定义多个网络 networks:frontend: # 前端网络name: front_netenable_ipv6: trueipam:driver: defaultconfig:- subnet: fc00:0:0:1::/64 # 前端网络的IPv6子网backend: # 后端网络name: back_netenable_ipv6: trueipam:driver: defaultconfig:- subnet: fc00:0:0:2::/64 # 后端网络的IPv6子网management: # 管理网络name: mgmt_netdriver: bridgeenable_ipv6: trueipam:driver: defaultconfig:- subnet: fc00:0:0:3::/64 # 管理网络的IPv6子网
测试
两个容器默认互通
两个容器均不定义网络,使用默认网络。
services: #服务apache: #服务名image: httpd:alpine #镜像名称container_name: apache #自定义容器名ports: #开放端口映射,家庭宽带封禁80端口- 18443:80 #冒号左边是宿主机开放端口,冒号右边是容器开放端口tomcat: #服务名image: tomcat #镜像名称container_name: tomcat #自定义容器名ports: #开放端口映射3306-->3306- 18080:8080 #冒号左边是宿主机开放端口,冒号右边是容器开放端口# tomcat 启动时,执行的命令,默认不显示首页,需要执行命令显示首页entrypoint: |bash -c 'cp -a webapps.dist/* webapps; exec catalina.sh run' # 定义网络配置 networks:default:name: testnetenable_ipv6: true
测试结果:
root@localhost:/storage/build/test# docker compose up -d [+] Running 3/3✔ Network testnet Created 0.3s ✔ Container tomcat Started 0.5s ✔ Container apache Started 0.5s root@localhost:/storage/build/test# docker exec -it apache sh /usr/local/apache2 # ping6 -c 1 taobao.com PING taobao.com (2401:b180:7003::6b): 56 data bytes 64 bytes from 2401:b180:7003::6b: seq=0 ttl=88 time=38.508 ms--- taobao.com ping statistics --- 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max = 38.508/38.508/38.508 ms /usr/local/apache2 # ping6 -c 1 tomcat PING tomcat (fdf7:f9e1:685c::3): 56 data bytes 64 bytes from fdf7:f9e1:685c::3: seq=0 ttl=64 time=0.069 ms--- tomcat ping statistics --- 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max = 0.069/0.069/0.069 ms /usr/local/apache2 #
证明是通的了。
两个容器互相不通
两个容器,一个使用默认网络,一个使用自定义网络
services: #服务apache: #服务名image: httpd:alpine #镜像名称container_name: apache #自定义容器名ports: #开放端口映射,家庭宽带封禁80端口- 18443:80 #冒号左边是宿主机开放端口,冒号右边是容器开放端口tomcat: #服务名image: tomcat #镜像名称container_name: tomcat #自定义容器名ports: #开放端口映射3306-->3306- 18080:8080 #冒号左边是宿主机开放端口,冒号右边是容器开放端口# tomcat 启动时,执行的命令,默认不显示首页,需要执行命令显示首页entrypoint: |bash -c 'cp -a webapps.dist/* webapps; exec catalina.sh run'networks: #网络- frontnet #属于网络frontnet # 定义网络配置 networks:default:name: testnetenable_ipv6: true#设置网络时,使用frontnet网络frontnet:#定义网络名name: front_net#启用ipv6enable_ipv6: true
测试结果:
root@localhost:/storage/build/test# docker exec -it apache sh /usr/local/apache2 # ping6 -c 1 taobao.com PING taobao.com (2401:b180:7003::ed): 56 data bytes 64 bytes from 2401:b180:7003::ed: seq=0 ttl=90 time=37.850 ms--- taobao.com ping statistics --- 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max = 37.850/37.850/37.850 ms /usr/local/apache2 # ping6 -c 1 tomcat ping6: bad address 'tomcat' /usr/local/apache2 #
证明不通了。
验证
# docker network ls NETWORK ID NAME DRIVER SCOPE 1896facfbb40 bridge bridge local 3db074c68f14 front_net bridge local 8292fc7cde4d host host local 9ec95caed86f none null local f647fa6c47ac testnet bridge local
可以看到网络已经有了两个定义的网络。
总结
更新之后,简化了一些预配置网络的工作,根据AI生成的示例,还可以自定义v6子网。
跨yaml文件,则可以使用自定义网络。