【IPv6】Docker 容器启用 ipv6 支持

288次阅读
没有评论

#Docker #ipv6

image.png

前言

IPv6 作为新一代的 IP 协议,正在以缓慢的速度进行推广。目前一些站点只允许 IPv6 访问,这就导致如果 docker 容器中没有 ipv6 支持,就无法连接。
有个最偷懒的方法,就是直接在宿主机支持 ipv6 时,使用 host 模式从而直接使用宿主机的 IPv6。但这种方式有下面几个弊端:

  • 安全性:举个例子,如果正在使用 PT 或 BT,那么其他用户完全可以扫描当前连接的 IPv6 地址端口,进而导致安全隐患。
  • 隔离性:如果开启 docker 的 IPv6,就使得 docker 有和宿主机不同的 IPv6 地址,从而隔离不同的服务,这在 host 模式下无法实现。
  • 其他:比如不希望 docker 服务的端口直接暴露在公网,而只是希望可以访问 IPv6 网址,这时将 docker 的 IPv6 地址设置为内网 IP。或者是希望建立一个多容器共用的内部网络,同时需要 IPv6 访问性时,也需要开启 docker 的 IPv6 支持。

前置工作

  • 应该确认主机是否支持 ipv6 访问,运行下面的命令,如果输出为 0 则表示主机 IPv6 正常,输出为 1 则需要先将主机的 ipv6 打开
cat /proc/sys/net/ipv6/conf/all/disable_ipv6

请自行搜索如何打开宿主机的 IPv6

编辑 Docker 守护进程配置文件

编辑 docker 的 daemon,如果没有则直接新建一个

sudo vim /etc/docker/daemon.json

在原文件中添加下面的部分

{
  "ipv6": true,
  "fixed-cidr-v6": "fd00:dead:beef::/48"
}

其中,"fixed-cidr-v6" 可以是内网地址,也可以是公网地址,公网地址可以根据服务器公网范围确定,可以使用在线 ipv6 子网划分工具 进行子网划分。

重启 Docker

将上面的文件编辑完之后,重启一下 docker 进程即可。

sudo systemctl restart docker

注意上面的网络针对的是容器中网络设置为 bridge 的,如果是默认网络(比如 qbittorent-network 这种自动生成的网络)是无法使用到的,此时需要将所有需要 ipv6 的容器对应的 docker-compose.yaml 文件中加入下面一行

network_mode: "bridge"

参考 IYUU 的 docker:

services:
IYUUPlus:
  image: iyuucn/iyuuplus-dev:latest
  container_name: IYUUPlus
  ports:
    - "8780:8780"
  volumes:
    - "/opt/data/appdata/iyuu/iyuu:/iyuu"
    - "/opt/data/appdata/iyuu/data:/data"
  restart: always
  tty: true
  network_mode: "bridge" #加上这一行

或者指定网络名称的地址,如下。
但此时指定的子网地址不可以与前面的 bridge 的子网地址冲突

networks:
  example: # 该内部网络名称为 example, 可以自定义
    enable_ipv6: true
    driver: bridge
    driver_opts:
      com.docker.network.enable_ipv6: "true"
    ipam:
      config:
       - subnet: 172.23.0.0/16
       - subnet: "2b89:640:109:51:4000::/66"
       - gateway: "2b89:640:109:51:4000::1"
正文完
 0
95pter
版权声明:本站原创文章,由 95pter 于2024-12-24发表,共计1430字。
转载说明:本文章版权归属于 95pter 以及实际控制人,非授权禁止一切形式的转载。CSDN、gitcode以及所有与之相关联的实体禁止转载。
评论(没有评论)
验证码