web-dev-qa-db-ja.com

docker-compose:各ネットワークに接続するインターフェースを指定します(複数のネットワークがある場合)

docker-compose.yaml 4つの異なるネットワークを定義します。

networks:
  vpp-nw:
  vpp-client:
  vpp-server:
  vpp-db:

それぞれ次のネットワークアドレスを使用します。

172.20.0.x
172.21.0.x
172.22.0.x
172.23.0.x

私が使用するコンテナの1つは、4つのネットワークすべてに(同じ順序で)接続します。

# part of docker-compose.yaml

services:
  my_tool:
    build: ./my_tool
    image: tgogos/my_tool
    container_name: my_tool_docker_comp
    hostname: my_tool
    privileged: true
    links:
      - my_db
    networks:
      - vpp-nw
      - vpp-client
      - vpp-server
      - vpp-db
    ports:
      - "8888:8888"

各ネットワークに接続するインターフェイスを定義する方法はありますか?たとえば、次のようにします。

  • eth0最初に接続する(vpp-nw)
  • eth1は2番目(vpp-client)に接続します
  • eth2 3番目のサーバー(vpp-server)に接続します
  • eth3は4番目に接続します(vpp-db)

以下に、このコンテナのifconfig出力を示します。 NICは、毎回、任意の方法で各ネットワークに接続しているようですdocker-compose down | docker-compose up...

eth0  Link encap:Ethernet  HWaddr 02:42:ac:15:00:03  
      inet addr:172.21.0.3  Bcast:0.0.0.0  Mask:255.255.0.0

eth1  Link encap:Ethernet  HWaddr 02:42:ac:17:00:03  
      inet addr:172.23.0.3  Bcast:0.0.0.0  Mask:255.255.0.0

eth2  Link encap:Ethernet  HWaddr 02:42:ac:14:00:02  
      inet addr:172.20.0.2  Bcast:0.0.0.0  Mask:255.255.0.0

eth3  Link encap:Ethernet  HWaddr 02:42:ac:16:00:03  
      inet addr:172.22.0.3  Bcast:0.0.0.0  Mask:255.255.0.0

編集:

さらに読むと、githubの問題:

14
tgogos

これは答えではありませんが、バグレポートを提出するために使用できる完全な再現装置とともに報告した動作の確認です。

私はあなたの行動を再現することができます。サービスのnetworksキーは順序付きリストであるため、docker-composeのバグだと思います。ファイルにリストされている順序でネットワークがインターフェースに割り当てられることを期待します。

これを使用してdocker-compose.ymlnwtestという名前のディレクトリ):

version: "2"

services:
  server:
    image: Alpine
    command: sleep 999
    networks:
      - nw0
      - nw1
      - nw2
      - nw3

networks:
  nw0:
  nw1:
  nw2:
  nw3:

そして、このシェルスクリプト:

#!/bin/sh

docker-compose up -d

for nw in 0 1 2 3; do
    nw_cidr=$(docker network inspect -f '{{ (index .IPAM.Config 0).Subnet }}' \
        nwtest_nw${nw})
    if_cidr=$(docker exec -it nwtest_server_1 ip addr show eth${nw} |
        awk '$1 == "inet" {print $2}')

    nw_net=$(ipcalc -n $nw_cidr | cut -f2 -d=)
    if_net=$(ipcalc -n $if_cidr | cut -f2 -d=)

    echo "nw${nw} $nw_net eth${nw} ${if_net}"

    if [ "$if_net" != "$nw_net" ]; then
        echo "MISMATCH: nw${nw} = $nw_net, eth${nw} = $if_net" >&2
    fi
done

docker-compose stop

問題をすばやく確認できます。

$ sh runtest.sh 
Starting nwtest_server_1
nw0 192.168.32.0 eth0 192.168.32.0
nw1 192.168.48.0 eth1 192.168.48.0
nw2 192.168.64.0 eth2 192.168.80.0
MISMATCH: nw2 = 192.168.64.0, eth2 = 192.168.80.0
nw3 192.168.80.0 eth3 192.168.64.0
MISMATCH: nw3 = 192.168.80.0, eth3 = 192.168.64.0
Stopping nwtest_server_1 ... 

さらに、この問題はdocker-composeに固有のようです。 docker runを使用してDockerコンテナーを作成し、複数のネットワークを接続する場合、それらは常に期待どおりに順次インターフェースに割り当てられます。そのためのテストスクリプトは次のとおりです。

#!/bin/sh

docker rm -f nwtest_server_1
docker run -d --name nwtest_server_1 --network nwtest_nw0 \
    Alpine sleep 999

for nw in 1 2 3; do
    docker network connect nwtest_nw${nw} nwtest_server_1
done

for nw in 0 1 2 3; do
    nw_cidr=$(docker network inspect -f '{{ (index .IPAM.Config 0).Subnet }}' \
        nwtest_nw${nw})
    if_cidr=$(docker exec -it nwtest_server_1 ip addr show eth${nw} |
        awk '$1 == "inet" {print $2}')

    nw_net=$(ipcalc -n $nw_cidr | cut -f2 -d=)
    if_net=$(ipcalc -n $if_cidr | cut -f2 -d=)

    echo "nw${nw} $nw_net eth${nw} ${if_net}"

    if [ "$if_net" != "$nw_net" ]; then
        echo "MISMATCH: nw${nw} = $nw_net, eth${nw} = $if_net" >&2
    fi
done

docker rm -f nwtest_server_1
3
larsks

Docker構成参照で優先度属性を使用して、ネットワークをコンテナーに接続する構成の順序を指定できます。

https://docs.docker.com/compose/compose-file/compose-file-v2/#priority

...

services:
  foo:
    image: foo:latest
    restart: always
    networks:
      network1:
        priority: 1000 # eth0
      network2:
        priority: 900 # eth1
      network3: # Default priority is 0, eth2

...
2
rocketspacer

あなたは設定ファイルをマウントしようとすることができます

つまり、RHベースのイメージの場合:

/etc/sysconfig/network-scripts/ifcfg-eth0

したがって、ymlファイルは次のようになります。

# part of docker-compose.yaml

services:
  my_tool:
    build: ./my_tool
    image: tgogos/my_tool
    container_name: my_tool_docker_comp
    hostname: my_tool
    privileged: true
    links:
      - my_db
    networks:
      - vpp-nw
      - vpp-client
      - vpp-server
      - vpp-db
    volumes:
     - ./conf/eth0:/etc/sysconfig/network-scripts/ifcfg-eth0
     - ./conf/eth1:/etc/sysconfig/network-scripts/ifcfg-eth1
     - ./conf/eth2:/etc/sysconfig/network-scripts/ifcfg-eth2
     - ./conf/eth3:/etc/sysconfig/network-scripts/ifcfg-eth3
    ports:
      - "8888:8888"
1
itiic