Docker 컨테이너에만 네트워크 링크 바인딩

Docker 컨테이너에만 네트워크 링크 바인딩

Docker를 사용하면 호스트 네트워크 링크를 Docker 컨테이너에만 바인딩할 수 있나요?

즉, eth1해당 컨테이너에서만 사용할 수 있도록 (또는 무엇이든) 컨테이너로 이동하려면 호스트나 호스트에서 실행되는 다른 컨테이너/가상 머신 등이 이에 액세스할 수 없어야 합니다.

physLXC(Linux Containers)에서는 이는 사소한 일이며, 정확히 이 작업을 수행하는 네트워크 유형이 있습니다 .

물리학:로 지정된 기존 인터페이스가 lxc.net.[i].link컨테이너에 할당됩니다.

나는 아니다라우팅에 관해 질문하기또는 macvlan을 사용하거나다른 해킹.

이상적으로는 표준 Docker 명령을 사용하여 이것이 가능하지만, 내가 읽은 바에 따르면 Docker의 네트워크 구현이 이를 지원하지 않는 것 같습니다. 명령을 사용하여 가능한 해결 방법 ip은 없는 것보다 낫습니다.

답변1

이는 표준 네트워크 명령으로는 불가능합니다. 이를 쉽게 만드는 기능은 몇 년 전 Docker에서 명시적으로 거부되었습니다(https://github.com/moby/moby/pull/8216).

물론 수동으로 인터페이스를 Docker 컨테이너의 네트워크 네임스페이스로 이동할 수 있지만 이는 문제가 많습니다. 예를 들어 컨테이너를 다시 시작하거나 다시 생성할 때마다 네트워킹을 다시 구성해야 합니다.


컨테이너의 네트워크 네임스페이스에 인터페이스를 추가하려면 다음 안내를 따르세요.

  1. 컨테이너의 PID를 가져옵니다.

    container_pid=$(docker inspect <container_name_or_id> -f '{{ .State.Pid }}')
    
  2. 컨테이너의 네임스페이스에 인터페이스를 할당합니다.

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

그리고 당신은 끝났습니다 ... 대부분.

인터페이스를 네임스페이스에 추가한 후 구성하려면 다음 중 하나를 수행해야 합니다.

  • 추가 권한으로 컨테이너를 실행하세요. 아마 그냥 이지만 , 테스트하는 동안에 --cap-add=NET_ADMIN만 사용할 수도 있습니다 .--privileged

  • nsenter컨테이너 외부에서 구성을 수행하는 데 사용됩니다 .

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

macvtap이 모든 것이 작동하는 동안 앞서 언급한 제한 사항으로 인해 어떤 이유로든 컨테이너 내부에 물리적 인터페이스가 필요한 경우 드라이버를 계속 사용하겠습니다 . 또는 이 특정 작업을 더 쉽게 만들어주는 다른 컨테이너화 도구를 lxc사용 하세요.systemd-nspawn

관련 정보