如何使用docker-compose分配IPv6地址

我在Ubuntu 16.04上使用docker 1.12.1,docker-compose 1.8.1。 我正在试图从https://docs.docker.com/compose/compose-file/#ipv4-address-ipv6-address获得撰写文件运行。 作为参考,我创build了具有以下内容docker-compose.yml

 version: '2' services: app: image: busybox command: ifconfig networks: app_net: ipv4_address: 172.16.238.10 ipv6_address: 2001:3984:3989::10 networks: app_net: driver: bridge driver_opts: com.docker.network.enable_ipv6: "true" ipam: driver: default config: - subnet: 172.16.238.0/24 gateway: 172.16.238.1 - subnet: 2001:3984:3989::/64 gateway: 2001:3984:3989::1 

现在,运行docker-compose up产生

 Creating network "tmp_app_net" with driver "bridge" Creating tmp_app_1 Attaching to tmp_app_1 app_1 | eth0 Link encap:Ethernet HWaddr 02:42:AC:10:EE:0A app_1 | inet addr:172.16.238.10 Bcast:0.0.0.0 Mask:255.255.255.0 app_1 | inet6 addr: fe80::42:acff:fe10:ee0a/64 Scope:Link app_1 | UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 app_1 | RX packets:4 errors:0 dropped:0 overruns:0 frame:0 app_1 | TX packets:1 errors:0 dropped:0 overruns:0 carrier:0 app_1 | collisions:0 txqueuelen:0 app_1 | RX bytes:520 (520.0 B) TX bytes:90 (90.0 B) app_1 | app_1 | lo Link encap:Local Loopback app_1 | inet addr:127.0.0.1 Mask:255.0.0.0 app_1 | inet6 addr: ::1/128 Scope:Host app_1 | UP LOOPBACK RUNNING MTU:65536 Metric:1 app_1 | RX packets:0 errors:0 dropped:0 overruns:0 frame:0 app_1 | TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 app_1 | collisions:0 txqueuelen:1 app_1 | RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) app_1 | tmp_app_1 exited with code 0 

IPv6地址未分配。

我已经尝试过了:

  1. --ipv6启动--ipv6守护进程
  2. 使用--ipv6 --fixed-cidr-v6="2001:3984:3989::/64"启动--ipv6 --fixed-cidr-v6="2001:3984:3989::/64"守护程序--ipv6 --fixed-cidr-v6="2001:3984:3989::/64"
    • 请注意--fixed-cidr docker run -it busybox ifconfig实际上给了我一个IPv6地址(从分配给默认bridgenetworking的 – --fixed-cidr子网)
  3. 使用我的实际IPv6子网而不是代码示例中的子网,并使用此子网重复2.

没有成功。 有任何想法吗?

事实certificate,这确实是一个将在1.9.0中修复的docker-compose 错误 。

与此同时,通过使用docker network命令创build自定义networking还有一个解决方法:

 docker network create --subnet=172.16.2.0/24 --gateway=172.16.2.1 --ipv6 --subnet=<myV6Network/subnet> dockerbridge 

…然后可以通过写入在docker-composed.yml提供

 networks: dockerbridge: external: name: dockerbridge 

是。 Docker组合支持IPv6协议,并引入了Docker引擎1.5以后的版本。 最新的组合文件格式3.3仍然存在问题,所以你可以使用2.1格式。 docker swarm还不够成熟,但是不支持IPv6,因此它不包含在3.3fil格式下。 这是示例文件,

泊坞窗,compose.yml

 version: '2.1' services: app: image: busybox command: ping www.google.com networks: app_net: ipv6_address: 2001:3200:3200::20 networks: app_net: enable_ipv6: true driver: bridge ipam: driver: default config: -- subnet: 2001:3200:3200::/64 gateway: 2001:3200:3200::1 

这个docker撰写文件将在子网2001:3200:3200 :: / 64下创build一个基于IPv6networking的名为testping_app_net的新networking,容器应该自动分配IPv6地址。

让我们使用docker构build服务 – 查看服务是否通过IPv6协议进行通信:

 docker-compose up -d 

您可以使用validation每个容器的IPv6地址,

 docker exec -it 905 ip addr 

你会看到一个新的容器获得IPv6地址 – 2001:3200:3200 :: 20,因此他们能够相互通信。

注意:如果要在主机上启用IPv6(默认情况下使用IPv4地址),则需要将这两行添加到/ etc / docker目录下的deamon.json中

 { “ipv6”: true, “fixed-cidr-v6”: “2001:db8:1::/64” } 

并通过命令重启docker deamon,

 $sudo systemctl restart docker