如何使用Docker Swarm模式或Docker Compose部署IPv6容器

如何使用Docker Swarm模式或Docker Compose部署IPv6容器,docker,docker-compose,ipv6,docker-swarm-mode,Docker,Docker Compose,Ipv6,Docker Swarm Mode,最后,我希望通过compose或swarm模式部署一个纯IPv6网络。目前,我只希望使用IPv6部署一个容器(仅限)。我目前对路由(只是容器到容器的连接)不感兴趣 我的设置: 操作系统:Centos 7 dockerd--ipv6--fixed-cidr-v6=2001:db8:1::/64--iptables=true--ipmasq=true--mtu=1600--experimental=true docker-engine-17.05.0.ce-1.el7.centos.x86_64.

最后,我希望通过compose或swarm模式部署一个纯IPv6网络。目前,我只希望使用IPv6部署一个容器(仅限)。我目前对路由(只是容器到容器的连接)不感兴趣

我的设置:

  • 操作系统:Centos 7
  • dockerd--ipv6--fixed-cidr-v6=2001:db8:1::/64--iptables=true--ipmasq=true--mtu=1600--experimental=true
  • docker-engine-17.05.0.ce-1.el7.centos.x86_64.rpm
  • 主机具有IPv4和IPv6地址。转发对双方都是开启的(这对我来说并不重要)
我尝试了似乎每种组合(我只列出了几个)

带有容器和网络的独立Docker堆栈:

version: '3'

networks:
  app_net:
    driver: overlay
    driver_opts:
      com.docker.network.enable_ipv6: "true"
    ipam:
      driver: default
      config:
      -
        subnet: 172.16.238.0/24
      -
        subnet: 2001:3984:3989::/64        

services:
  app:
    image: alpine
    command: sleep 600
    networks:
      app_net:
        ipv4_address: 0.0.0.0
        ipv6_address: 2001:3984:3989::10
结果:只忽略容器中的IPv4地址0.0.0.0


外部预先创建的网络 (根据)

docker网络创建--驱动程序覆盖--ipv6 --子网=2001:3984:3989::/64--可连接的外部网络

结果:容器中的IPv4和IPv6地址都被忽略(在Swarm模式下不受支持),因此上面的ifconfig disable IPv4尝试不起作用

我目前没有安装docker compose,下一步可能会尝试,但是有没有办法在docker Swarm模式下运行纯IPv6容器?

注意:我能够在不使用swarm/compose的情况下手动运行和配置一些仅限IPv6的容器: (如上所述创建网络,甚至只使用默认网桥)

或速记:

$ docker run --cap-add=NET_ADMIN --rm -it alpine sh -c "/sbin/ifconfig eth0 0.0.0.0 ; sh"

我能用《docker compose》(docker compose)通过严重的丑陋来破解它。如果你绝望了,就在这里。(由于权限提升,此方法无法在Swarm模式下工作)

计划

  • 授予容器管理IP的权限
  • 启动时从每个容器中删除IPv4 IP地址
  • 使用卷临时创建主机文件来代替DNS(DNS仅在docker中是IPv4)
  • 步骤

  • 创建docker-compose.yml文件,该文件创建ipv6网络、共享文件卷和两个容器
  • 在执行上述步骤的每个容器中运行入口点脚本
  • 文件

    docker compose.yml

    # Note: enable_ipv6 does not work in version 3!
    version: '2.1'
    
    networks:
      app_net:
        enable_ipv6: true
        driver: overlay
        ipam:
          driver: default
          config:
          -
            subnet: 172.16.238.0/24
          -
            subnet: 2001:3984:3989::/64
    
    services:
      app1:
        build: ./server 
        hostname: server1
        command: blablabla # example of arg passing to ipv6.sh
        cap_add:
         - NET_ADMIN
        volumes:
         - ipv6stuff:/ipv6stuff
        networks:
          - app_net
    
      app2:
        build: ./server 
        hostname: server2
        command: SOMETHING # example of arg passing to ipv6.sh
        cap_add:
         - NET_ADMIN
        volumes:
         - ipv6stuff:/ipv6stuff
        networks:
          - app_net
    
    volumes:
      ipv6stuff:
    
    服务器/Dockerfile

    FROM alpine:latest
    ADD files /
    RUN apk --update add bash  #simpler scripts
    # Has to be an array for parameters to work via command: x in compose file, if needed
    ENTRYPOINT ["/ipv6.sh"]
    
    server/files/ipv6.sh

    #/bin/bash
    #基于此处参数的可选条件逻辑。。。
    #(例如,在某些容器中有条件地保留ipv4地址)
    #
    #删除ipv4
    ifconfig eth0.0.0.0
    IP6=$(ip地址显示eth0 | grep inet6 | grep global | awk'{print$2}'| cut-d/-f 1)
    echo“主机$HOSTNAME具有ipv6 ip$IP6”
    #将条目存储在共享卷中
    echo“$IP6$HOSTNAME”>/ipv6stuff/hosts.$HOSTNAME
    #从/etc/hosts中删除现有的ipv4线路只是为了彻底解决这个问题
    #Docker不允许删除此文件,因此简单的sed-i不起作用。
    cp/etc/hosts/tmp/1;sed-i“s/^.*\s$HOSTNAME/”/tmp/1;cat/tmp/1>/etc/hosts
    #等待所有容器启动
    睡眠2
    #将每个人的条目放入我们的主机文件中。
    cat/ipv6stuff/hosts.*>>/etc/hosts
    回显“我的主机文件:”
    cat/etc/hosts
    #测试连接性(硬编码)
    ping6-c3服务器1
    ping6-c3服务器2
    
    # Note: enable_ipv6 does not work in version 3!
    version: '2.1'
    
    networks:
      app_net:
        enable_ipv6: true
        driver: overlay
        ipam:
          driver: default
          config:
          -
            subnet: 172.16.238.0/24
          -
            subnet: 2001:3984:3989::/64
    
    services:
      app1:
        build: ./server 
        hostname: server1
        command: blablabla # example of arg passing to ipv6.sh
        cap_add:
         - NET_ADMIN
        volumes:
         - ipv6stuff:/ipv6stuff
        networks:
          - app_net
    
      app2:
        build: ./server 
        hostname: server2
        command: SOMETHING # example of arg passing to ipv6.sh
        cap_add:
         - NET_ADMIN
        volumes:
         - ipv6stuff:/ipv6stuff
        networks:
          - app_net
    
    volumes:
      ipv6stuff:
    
    FROM alpine:latest
    ADD files /
    RUN apk --update add bash  #simpler scripts
    # Has to be an array for parameters to work via command: x in compose file, if needed
    ENTRYPOINT ["/ipv6.sh"]