Привязать сетевое соединение исключительно к контейнеру Docker

Привязать сетевое соединение исключительно к контейнеру Docker

Возможно ли с помощью Docker привязать сетевое соединение хоста исключительно к контейнеру Docker?

Другими словами, для перемещения eth1(или выполнения чего-либо еще) в контейнер так, чтобы он был доступен только этому контейнеру — ни хост, ни какие-либо другие контейнеры/виртуальные машины и т. д., работающие на хосте, не должны иметь к нему доступа.

В контейнерах Linux (LXC) это тривиально, есть physтип сети, который делает именно это:

физ: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или какой-либо другой инструмент контейнеризации, который упрощает эту конкретную задачу.

Связанный контент