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

问题描述 投票:5回答:2

我在Ubuntu 16.04上使用docker 1.12.1,在docker-compose 1.8.1上使用docker 1.12.1。我想从https://docs.docker.com/compose/compose-file/#ipv4-address-ipv6-address获取Compose文件来运行。作为参考,我创建了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启动docker守护进程
  2. --ipv6 --fixed-cidr-v6="2001:3984:3989::/64"启动docker守护进程 请注意,docker run -it busybox ifconfig实际上给了我一个IPv6地址(来自--fixed-cidr子网,分配给默认的bridge网络)
  3. 使用我的实际IPv6子网而不是代码示例中的子网,并使用此子网重复2.

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

docker docker-compose ipv6
2个回答
6
投票

事实证明这确实是一个码头组合的bug,它将在1.9.0中修复。

同时,通过使用docker network命令创建自定义网络,可以解决此问题:

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

0
投票

是。 Docker compose支持IPv6协议,并且它被引入docker engine 1.5以后。仍然有issue with latest compose file format 3.3所以你可以使用2.1格式。仍然没有成熟的docker swarm具有先进的网络配置,并且它不支持IPv6,因此它不包含在3.3 fil格式中。这是File的示例,

泊坞窗,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 compose文件将基于子网2001:3200:3200 :: / 64下的IPv6网络创建一个名为testping_app_net的新网络,容器应自动分配IPv6地址。

让我们使用docker-compose来启动服务,看看服务是否通过IPv6协议进行通信:

docker-compose up -d

并且您可以使用以下方式验证每个容器的IPv6地址:

docker exec -it 905 ip addr

您将看到一个新容器获取IPv6地址 - 2001:3200:3200 :: 20,因此它们能够相互通信。

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

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

并通过命令重新启动docker守护程序:

$ sudo systemctl restart docker
© www.soinside.com 2019 - 2024. All rights reserved.