Agregar una nueva NIC a un contenedor Docker en un order específico

Estoy tratando de tener un contenedor CentOS con dos interfaces de networking. Después de revisar los documentos de Docker y "googlear" un poco, encontré este comentario de GitHub que especifica cómo lograr esto.

A continuación, creé una nueva networking (tipo pnetworkingeterminado: bridge )

 docker network create my-network 

Al inspeccionar la nueva networking, puedo ver que Docker la asignó a la subnetworking 172.18.0.0/16 y la puerta de enlace 172.18.0.1/16 .

Luego, al crear el contenedor, adjunto específicamente la nueva networking:

 docker create -ti --privileged --net=my-network --mac-address 08:00:AA:AA:AA:FF <imageName> 

Dentro del contenedor, puedo verificar con ifconfig que efectivamente la interfaz está presente con esa dirección IP y MAC:

 eth0 Link encap:Ethernet HWaddr 08:00:AA:AA:AA:FF inet addr:172.18.0.2 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::a00:aaff:feaa:aaff/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:3 errors:0 dropped:0 overruns:0 frame:0 TX packets:3 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:258 (258.0 b) TX bytes:258 (258.0 b) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) 

El problema surge cuando conecto el contenedor a la networking Docker por defecto ( bridge0 aka bridge ):

 docker network connect bridge <my-container> 

Comprobando ahora las interfaces en el contenedor:

 eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:02 inet addr:172.17.0.2 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:17 errors:0 dropped:0 overruns:0 frame:0 TX packets:6 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:2941 (2.8 KiB) TX bytes:508 (508.0 b) eth1 Link encap:Ethernet HWaddr 08:00:AA:AA:AA:FF inet addr:172.18.0.2 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::a00:aaff:feaa:aaff/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:17 errors:0 dropped:0 overruns:0 frame:0 TX packets:6 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:2941 (2.8 KiB) TX bytes:508 (508.0 b) 

La interfaz para mi nueva networking pasa a eth1 , mientras que la interfaz para las networkinges pnetworkingeterminadas obtiene eth0 .

Además, cuando verifico el file de configuration para la interfaz ( /etc/sysconfig/network-scripts/ifcfg-eth0 ), puedo ver que la dirección MAC especificada allí difiere de la que configuré manualmente al ejecutar el contenedor ( 08:00:AA:AA:AA:FF ):

 DEVICE="eth0" BOOTPROTO="dhcp" HWADDR="52:54:00:85:11:33" IPV6INIT="yes" IPV6_AUTOCONF="yes" MTU="1500" NM_CONTROLLED="yes" ONBOOT="yes" TYPE="Ethernet" UUID="25016937-1ff9-40d7-b4c3-18e08af0f98d" 

En /etc/sysconfig/network-scripts solo existe el file de configuration para eth0 . El file para eth1 (la interfaz recién agregada) falta.

Debido a los requisitos del trabajo en el que estoy involucrado, necesito que la primera interfaz siempre esté desactivada y que su dirección MAC se establezca específicamente.

Cualquier otro trabajo relacionado con la networking debe pasar por la nueva NIC adjunta.

Mi pregunta es:

¿Cómo puedo adjuntar una nueva NIC al contenedor? eth0 tendrá la dirección MAC deseada.

Hacer esto a nivel de image también está bien.

El objective es tener un contenedor en ejecución con dos NIC: eth0 y eth1 .

eth0 tendrá una dirección MAC específica (digamos, AA:AA:AA:AA:AA:AA ) y se desactivará. Todas las networkinges se realizarán a través de eth1 .

Asumiré que la image de Docker tiene un usuario con derechos para ejecutar ifdown y / o ifconfig

eth0 ya está presente en la image y "habla" con el bridge pnetworkingeterminado Docker networ: (creado cuando se instaló Docker).

Tenemos que modificar el file de configuration para eth0 en la image ( /etc/sysconfig/network-scripts/ifcg-eth0 ) para modificar su dirección MAC: el campo llamado HWADDR en el file.

Después de esto, tenemos que enviar los cambios a una nueva image. Vamos a llamarlo myImage .

Ahora, tenemos que crear una nueva networking para la segunda interfaz:

 docker network create myNetwork 

Por defecto, es una networking bridge (que es suficiente en mi caso).

Como el requisito es tener eth0 con una dirección MAC personalizada, tenemos que crear el contenedor sin especificar una networking; que lo conectará a la networking puente pnetworkingeterminada.

 docker create -ti --mac-address=AA:AA:AA:AA:AA:AA --privileged --hostname=myHostnane --name=myContainer myImage 

Es importante crear el contenedor con el conmutador privilegiado para que podamos eliminar la interfaz eth0 .

Ahora, antes de iniciar el contenedor, lo conectamos a la nueva networking:

 docker network connect myNetwork myContainer 

Ahora el contenedor tiene dos interfaces: el eth0 original para la networking bridge y el nuevo eth1 para la networking myNetwork .

En este punto, podemos iniciar el contenedor:

 docker start myContainer 

y luego ejecuta la order para eliminar eth0 :

 docker exec myContainer /bin/bash -c "sudo ifdown eth0" 

Para eliminar la interfaz, debemos hacer esto al ejecutar un contenedor. La razón es que cualquier cambio en los files de networking solo persistirá en su contenedor en ejecución , por lo que no es posible confirmar la interfaz anterior (anterior, pero aún relevante).