#Docker #ipv6

前言
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"
正文完