2017-06-16 9 views
0

最終的には、純粋なIPv6ネットワークをcomposeまたはswarmモードで配備したいと考えています。今のところ、私はちょうど1つのコンテナにIPv6(唯一の)を配備したいと思っています。私は現在ルーティングに興味がありません(コンテナからコンテナへの接続のみ)。Docker Swarm ModeまたはDockerでIPv6コンテナを配備する方法

マイセットアップ:

  • OS:CentOSに7
  • dockerd --ipv6 --fixed-CIDR-V6 = 2001:DB8:1 ::/64 --iptables =真--ip- masq = true --mtu = 1600 --experimental = true
  • ドッカー - エンジン - 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のみが無視されます。


外部で事前作成されたネットワーク

ドッカーネットワークは--ipv6 --subnet = 2001 --driverオーバーレイを作成(https://stackoverflow.com/a/39818953/1735931の通り):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アドレスの両方が無視されます(Swarmモードではサポートされていません)。したがって、上記のifconfig disable ipv4の試みは機能しません。

私は現在、ドッキング・コンパウンドをインストールしていないので、次にそれを試してみますが、は、ドッカー・スターン・モードで純粋な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モードでは動作しません)。起動時に各コンテナ内からIPv4のIPアドレスを削除するIPの

  • を管理するための

    計画

    1. グラントコンテナの権利を保有。
    2. ボリュームを使用して、DNSの代わりにホストファイルを即興で作成します(DNSはドッカーのIPv4のみ)。

    ステップ

    1. Enable IPv6 in Docker daemon
    2. ipv6ネットワーク、共有ファイルのボリューム、および2つのコンテナを作成するdocker-compose.ymlファイルを作成します。
    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 
    
  • 関連する問題