docker compose ipv6的处理 容器互联的方法 docker CE 27.5.1

简介#

距离上一次折腾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#

  1. 启用Docker的IPv6支持
  2. 允许容器使用IPv6网络
  3. 如果不开启此选项,容器将只能使用IPv4

"fixed-cidr-v6": "fc00::/7"#

  1. 设置Docker IPv6地址的固定CIDR范围
  2. fc00::/7是一个私有IPv6地址段
  3. Docker会从这个地址段中为容器分配IPv6地址
  4. 类似于IPv4中的172.17.0.0/16默认网段
  5. 格式为<IPv6前缀>/<子网掩码长度>

"experimental": true#

  1. 启用Docker的实验性功能
  2. 允许使用一些尚在开发或测试阶段的特性
  3. 某些新的网络功能可能需要开启此选项
  4. 实验性功能可能在未来版本中变化或移除

"ip6tables": true#

  1. 启用Docker的IPv6防火墙规则管理
  2. 允许Docker自动管理IPv6的iptables规则
  3. 控制容器间的IPv6通信和端口映射
  4. 确保IPv6网络安全性和正确路由

重启docker#

systemctl daemon-reload
systemctl restart docker

yaml使用#

简单使用#

复制代码
services: #服务
  apache:   #服务名
    image: httpd:alpine  #镜像名称
    ports:          #开放端口映射,家庭宽带封禁80端口
    - 18080:80     #冒号左边是宿主机开放端口,冒号右边是容器开放端口
# 定义网络配置
networks:
  #未设置网络时,使用默认网络
  default:
    #启用ipv6
    enable_ipv6: true
复制代码

这是就可以直接从互联网访问18080了

定制使用-限定默认网络#

复制代码
services: #服务
  apache:   #服务名
    image: httpd:alpine  #镜像名称
    ports:          #开放端口映射,家庭宽带封禁80端口
    - 18443:80     #冒号左边是宿主机开放端口,冒号右边是容器开放端口
# 定义网络配置
networks:
  #未设置网络时,使用默认网络
  default:
    #自定义默认网络名
    name: mynet
    #启用ipv6
    enable_ipv6: true
复制代码

定制使用-限定指定网络#

复制代码
services: #服务
  apache:   #服务名
    image: httpd:alpine  #镜像名称
    ports:          #开放端口映射,家庭宽带封禁80端口
    - 18443:80     #冒号左边是宿主机开放端口,冒号右边是容器开放端口
    networks:       #网络
    - frontnet         #属于网络frontnet
# 定义网络配置
networks:
  #设置网络时,使用frontnet网络
  frontnet:
    #定义网络名
    name: front_net
    #启用ipv6
    enable_ipv6: true
复制代码

互联互通示例(AI生成)#

复制代码
services:
  apache:
    image: httpd:alpine
    networks:
      - frontend    # 连接到前端网络
      - backend     # 连接到后端网络
  
  mysql:
    image: mysql:8
    networks:
      - backend         # 连接到后端网络
  nginx:
    image: nginx:alpine
    networks:
      - frontend    # 只连接到前端网络

# 定义多个网络
networks:
  frontend:    # 前端网络
    name: front_net
    enable_ipv6: true
    ipam:
      driver: default
      config:
        - subnet: fc00:0:0:1::/64    # 前端网络的IPv6子网

  backend:     # 后端网络
    name: back_net
    enable_ipv6: true
    ipam:
      driver: default
      config:
        - subnet: fc00:0:0:2::/64    # 后端网络的IPv6子网
        
  management:  # 管理网络
    name: mgmt_net
    driver: bridge
    enable_ipv6: true
    ipam:
      driver: default
      config:
        - 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: testnet
    enable_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: testnet
    enable_ipv6: true
  #设置网络时,使用frontnet网络
  frontnet:
    #定义网络名
    name: front_net
    #启用ipv6
    enable_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文件,则可以使用自定义网络。

作者:上官飞鸿

出处:https://www.cnblogs.com/jackadam/p/18691576

版权:本作品采用「知识共享-署名-非商业性-禁止演绎(CC-BY-NC-ND)」许可协议进行许可。

posted @   上官飞鸿  阅读(103)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2022-01-26 WDS,注意事项,双向验证等
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示