Dentro de docker-compose.yaml defino 4 redes diferentes:
networks: vpp-nw: vpp-client: vpp-server: vpp-db:que utilizan las siguientes direcciones de red respectivamente:
172.20.0.x 172.21.0.x 172.22.0.x 172.23.0.xUno de los contenedores que uso, se conecta a las 4 redes (con el mismo orden):
# 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"¿Hay alguna manera de definir qué interfaz se conectará a cada red? Por ejemplo, me gustaría:
eth0 para conectarse al primero (vpp-nw)eth1 para conectarse al segundo (vpp-client)eth2 para conectarse al tercero (vpp-server)eth3 para conectarse al cuarto (vpp-db) A continuación puede ver una salida de ifconfig de este contenedor. Las NIC parecen conectarse a cada red de forma arbitraria cada vez que 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.0Lectura adicional, problemas de github:
Esta no es una respuesta, pero es una confirmación del comportamiento que ha informado junto con reproductores completos que podrían usarse para presentar un informe de error.
Soy capaz de reproducir tu comportamiento. Creo que es un error en docker-compose , ya que la clave de networks en su servicio es una lista ordenada. Espero que las redes se asignen a las interfaces en el orden en que aparecen en el archivo.
Usando este docker-compose.yml (en un directorio llamado nwtest ):
version: "2" services: server: image: alpine command: sleep 999 networks: - nw0 - nw1 - nw2 - nw3 networks: nw0: nw1: nw2: nw3:Y este script de shell:
#!/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 stopPuede verificar rápidamente el problema:
$ 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 ... Además, este problema parece ser específico de docker-compose ; si crea un contenedor Docker con docker run y luego adjunta varias redes, siempre se asignan a las interfaces de forma secuencial, como cabría esperar. El script de prueba para eso es:
#!/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_1Puede usar el atributo de prioridad en la referencia de composición de Docker para especificar el orden en que se componen las redes adjuntas a su contenedor.
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 ...Puedes intentar montar archivos de configuración
es decir, para imágenes basadas en RH:
/etc/sysconfig/network-scripts/ifcfg-eth0Entonces, su archivo yml se vería como a continuación:
# 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"