Vincular el enlace de red exclusivamente al contenedor Docker

Vincular el enlace de red exclusivamente al contenedor Docker

¿Es posible, con Docker, vincular un enlace de red de host exclusivamente a un contenedor Docker?

En otras palabras, moverse eth1(o lo que sea) a un contenedor para que solo esté disponible para ese contenedor; ni el host ni ningún otro contenedor/máquina virtual, etc., que se ejecute en el host debería tener acceso a él.

En Linux Containers (LXC) esto es trivial, hay un phystipo de red que hace exactamente esto:

fisico:lxc.net.[i].linkse asigna al contenedor una interfaz ya existente especificada por .

no soypreguntando sobre la rutao usando macvlan ootros trucos.

Idealmente, esto será posible usando comandos estándar de Docker, pero por lo que he leído, me temo que la implementación de red de Docker no lo admite. Una posible solución alternativa mediante ipcomandos sería mejor que nada.

Respuesta1

Esto no es posible con los comandos de red estándar. Docker rechazó explícitamente las características que facilitarían esto hace unos años (https://github.com/moby/moby/pull/8216).

Por supuesto, puede mover manualmente una interfaz al espacio de nombres de red de un contenedor Docker, pero esto está plagado de problemas: por ejemplo, cada vez que reinicie o vuelva a crear el contenedor, tendrá que volver a configurar su red.


Para agregar una interfaz al espacio de nombres de red de su contenedor:

  1. Obtenga el PID de su contenedor:

    container_pid=$(docker inspect <container_name_or_id> -f '{{ .State.Pid }}')
    
  2. Asigne la interfaz al espacio de nombres del contenedor:

    ip link set netns ${container_pid} dev ${device}
    

Y ya terminaste... casi.

Si desea configurar la interfaz después de agregarla al espacio de nombres, deberá:

  • Ejecute su contenedor con privilegios adicionales. Probablemente solo --cap-add=NET_ADMIN, aunque también puedes usarlo --privilegedmientras pruebas cosas.

  • Úselo nsenterpara realizar la configuración desde fuera del contenedor:

    nsenter -t ${container_pid} -n ip addr ...
    

Si bien todo esto funciona, debido a las limitaciones que he notado, simplemente me quedaría con el macvtapcontrolador si por alguna razón necesito una interfaz física dentro del contenedor. lxcO utilice systemd-nspawnalguna otra herramienta de contenedorización que facilite esta tarea en particular.

información relacionada