É possível, com o Docker, vincular um link de rede host exclusivamente a um contêiner do Docker?
Em outras palavras, para mover eth1(ou qualquer outra coisa) para um contêiner de modo que ele esteja disponível apenas para esse contêiner - nem o host nem quaisquer outros contêineres/máquinas virtuais, etc., em execução no host devem ter acesso a ele.
Em Linux Containers (LXC) isso é trivial, existe um phystipo de rede que faz exatamente isso:
física:uma interface já existente especificada pelo
lxc.net.[i].linké atribuída ao contêiner.
eu não souperguntando sobre roteamentoou usando macvlan ououtros hacks.
Idealmente, isso será possível usando comandos padrão do Docker, mas pelo que li, temo que a implementação de rede do Docker não suporte isso. Uma possível solução alternativa usando ipcomandos seria melhor que nada.
Responder1
Isto não é possível com comandos de rede padrão. Recursos que facilitariam isso foram explicitamente rejeitados pelo Docker alguns anos atrás (https://github.com/moby/moby/pull/8216).
É claro que você pode mover manualmente uma interface para o namespace de rede de um contêiner Docker, mas isso está repleto de problemas: por exemplo, sempre que você reiniciar ou recriar o contêiner, terá que reconfigurar sua rede.
Para adicionar uma interface ao namespace de rede do seu contêiner:
Obtenha o PID do seu contêiner:
container_pid=$(docker inspect <container_name_or_id> -f '{{ .State.Pid }}')Atribua a interface ao namespace do contêiner:
ip link set netns ${container_pid} dev ${device}
E você terminou... principalmente.
Se quiser configurar a interface depois de adicioná-la ao namespace, você precisará:
Execute seu contêiner com privilégios extras. Provavelmente apenas
--cap-add=NET_ADMIN, embora você também possa usar--privilegedenquanto testa as coisas.Use
nsenterpara realizar a configuração de fora do contêiner:nsenter -t ${container_pid} -n ip addr ...
Embora tudo isso funcione, devido às limitações que observei, eu ficaria com o macvtapdriver se precisar de uma interface física dentro do contêiner por algum motivo. Ou use lxcou systemd-nspawnalguma outra ferramenta de conteinerização que facilite essa tarefa específica.


