Возможно ли с помощью Docker привязать сетевое соединение хоста исключительно к контейнеру Docker?
Другими словами, для перемещения eth1(или выполнения чего-либо еще) в контейнер так, чтобы он был доступен только этому контейнеру — ни хост, ни какие-либо другие контейнеры/виртуальные машины и т. д., работающие на хосте, не должны иметь к нему доступа.
В контейнерах Linux (LXC) это тривиально, есть physтип сети, который делает именно это:
физ:
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или какой-либо другой инструмент контейнеризации, который упрощает эту конкретную задачу.


