Docker를 사용하여 호스트 네트워크 링크를 Docker 컨테이너에 구체적으로 바인딩할 수 있습니까?
즉, eth1
해당 컨테이너에서만 사용할 수 있도록 컨테이너로 이동(또는 다른 방식으로)합니다. 호스트나 호스트에서 실행 중인 다른 컨테이너/VM 등에 액세스할 수 없어야 합니다.
phys
Linux 컨테이너(LXC)에서는 이는 간단하며 이를 수행하는 네트워크 유형이 있습니다 .
물리학:지정된 기존 인터페이스를
lxc.net.[i].link
컨테이너에 할당합니다.
난 아니다방향을 묻다또는 macvlan을 사용하거나다른 해커.
이상적으로는 표준 Docker 명령을 사용하여 이것이 가능하지만, 내가 읽은 내용에 따르면 Docker의 네트워킹 구현이 이를 지원하지 않는다는 점이 우려됩니다. 명령을 사용하여 가능한 해결 방법은 ip
없는 것보다 낫습니다.
답변1
이는 표준 네트워크 명령으로는 불가능합니다. 몇 년 전, Docker는 이를 쉽게 만들 수 있는 기능을 명시적으로 거부했습니다(https://github.com/moby/moby/pull/8216).
물론 인터페이스를 Docker 컨테이너의 네트워크 네임스페이스로 수동으로 이동할 수 있지만 이는 문제가 많습니다. 예를 들어 컨테이너를 다시 시작하거나 다시 생성할 때마다 네트워크를 재구성해야 합니다.
컨테이너의 네트워크 네임스페이스에 인터페이스를 추가하려면 다음 안내를 따르세요.
컨테이너의 PID를 가져옵니다.
container_pid=$(docker inspect <container_name_or_id> -f '{{ .State.Pid }}')
컨테이너의 네임스페이스에 인터페이스를 할당합니다.
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