2017-06-16 188 views
0

最后,我希望通过组合或群集模式部署纯IPv6网络。目前,我只想使用IPv6(仅)部署一个容器。我目前不感兴趣路由(只是容器到容器的连接)。如何使用Docker Swarm模式或Docker Compose部署IPv6容器

我的设置:

  • OS:Centos的7
  • dockerd --ipv6 --fixed-CIDR-V6 = 2001:DB8:1 ::/64 --iptables =真--ip- masq = true --mtu = 1600 --experimental = true
  • docker-engine-17.05.0.ce-1.el7.centos.x86_64.rpm
  • 主机有IPv4和IPv6地址。转发是为两个(不是对我来说很重要)。

我试了一下,似乎是每一个组合(我只列出一对夫妇)

自包含泊坞堆集装箱和网络:

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

搬运工网络创建--driver覆盖--ipv6 --subnet = 2001:3984:3989 ::/64 --attachable 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容器?

注:我能跑手动配置一些专用的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" 

回答

0

我能够通过严厉的丑陋与泊坞窗,撰写破解它。如果你绝望,就在这里。 (由于权限提升,这种方法永远不能用于Swarm模式)。

该计划

  1. 格兰特集装箱权从启动每个容器内管理IP的
  2. 删除IPv4的IP地址。
  3. 使用卷即兴主机文件来代替DNS(DNS在docker中仅用于IPv4)。

步骤

  1. Enable IPv6 in Docker daemon
  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"] 

server/files/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 
相关问题