繁体   English   中英

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

[英]How to deploy an IPv6 container with Docker Swarm Mode or Docker Compose

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

我的设置:

  • 操作系统:Centos 7
  • dockerd --ipv6 --fixed-cidr-v6 = 2001:db8:1 :: / 64 --iptables = true --ip-masq = true --mtu = 1600 --experimental = true
  • 泊坞窗,发动机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被忽略。


外部预先创建的网络 (根据https://stackoverflow.com/a/39818953/1735931

docker network create --driver overlay --ipv6 --subnet = 2001:3984:3989 :: / 64 - 可连接的ext_net

version: '3'

networks:
  ext_net:
    external:
      name: ext_net

services:
  app:
    image: alpine
    command: ifconfig eth0 0.0.0.0 ; sleep 600
    cap_add:
     - NET_ADMIN
    networks:
      ext_net:
        ipv4_address: 0.0.0.0
        ipv6_address: 2001:3984:3989::10

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

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

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

$ docker run --cap-add=NET_ADMIN --rm -it alpine
$$ ifconfig eth0 0.0.0.0
$$ ping6 other-container-ipv6-address # WORKS!

或速记:

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

我能够通过严重丑陋的码头组合来破解它。 如果你绝望,这就是。 (由于权限提升,此方法永远不能用于Swarm模式)。

计划

  1. 授予容器管理IP的权限
  2. 在启动时从每个容器中删除IPv4 IP地址。
  3. 使用卷即兴创建主机文件来代替DNS(DNS在docker中仅限IPv4)。

脚步

  1. 在Docker守护程序中启用IPv6
  2. 创建一个docker-compose.yml文件,用于创建ipv6网络,共享文件的卷和两个容器
  3. 在执行上述步骤的每个容器中运行入口点脚本。

泊坞窗,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"]

服务器/文件/ ipv6.sh

#!/bin/bash
# Optionally conditional logic based on parameters here...
# (for example, conditionally leave ipv4 address alone in some containers)
#
# Remove ipv4
ifconfig eth0 0.0.0.0

IP6=$(ip addr show eth0 | grep inet6 | grep global | awk '{print $2}' | cut -d / -f 1)

echo "Host $HOSTNAME has ipv6 ip $IP6" 

# Store our entry in the shared volume
echo "$IP6   $HOSTNAME" > /ipv6stuff/hosts.$HOSTNAME

# Remove existing ipv4 line from /etc/hosts just to be thorough
# Docker does not allow removal of this file and thus simple sed -i isn't going to work.
cp /etc/hosts /tmp/1 ; sed -i "s/^.*\s$HOSTNAME//" /tmp/1 ; cat /tmp/1 > /etc/hosts

# Wait for all containers to start
sleep 2

# Put everyone's entries in our hosts file.
cat /ipv6stuff/hosts.* >> /etc/hosts

echo "My hosts file:"
cat /etc/hosts

# test connectivity (hardcoded)
ping6 -c 3 server1
ping6 -c 3 server2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM