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の問題:
これは答えではありませんが、バグレポートを提出するために使用できる完全な再現装置とともに報告した動作の確認です。
私はあなたの行動を再現することができます。サービスのnetworks
キーは順序付きリストであるため、docker-compose
のバグだと思います。ファイルにリストされている順序でネットワークがインターフェースに割り当てられることを期待します。
これを使用してdocker-compose.yml
(nwtest
という名前のディレクトリ):
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
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
...
あなたは設定ファイルをマウントしようとすることができます
つまり、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"