Как передать физический контейнер NI C в Docker? - PullRequest
2 голосов
/ 12 февраля 2020

Возможно ли передать eth (n) в Docker Контейнер без установки дополнительных плагинов?

В LXC / LXD это легко сделать с помощью этой команды:

lxc config device add CONTAINER-NAME eth2 nic nictype=physical parent=eth2 name=eth2

Ответы [ 4 ]

1 голос
/ 12 февраля 2020

Вы не можете напрямую подключить NI C к контейнеру, но вы можете использовать сеть MACVLAN и использовать NI C в качестве родительского интерфейса

Проверьте свой NI C su bnet

ip addr show eth2

Должен возвращать что-то вроде

3: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP       group default qlen 1000
inet 172.16.86.250/24 brd 172.16.86.255 scope global eth2

Теперь создайте сеть MACVLAN в том же su bnet. Я использую 172.16.86.1 в качестве сетевого шлюза / маршрутизатора

docker network create -d macvlan \
--subnet=172.16.86.0/24 \
--gateway=172.16.86.1  \
-o parent=eth2 docker_macvlan

Затем запустите контейнер и подключите его к сети MACVLAN и присвойте ему IP-адрес того же su bnet, что и ваш NI C, скажем 172.16.86.15

docker run -itd --net=docker_macvlan --name macv1 --ip=172.16.86.15 ubuntu /bin/bash 
1 голос
/ 15 февраля 2020

На данный момент нет режима или механизма для передачи сетевого интерфейса непосредственно в контейнер. Однако существуют сетевые подключаемые модули, которые позволяют иметь прямой / сквозной доступ к сетевому устройству Ethe rnet к контейнерам Docker

Режим моста имеет один интерфейс для пространства имен хоста и все контейнеры на хост подключен к docker0 через пару veth. Здесь docker0 - это мост linux, созданный демоном docker. docker назначает частные IP-адреса контейнерам

. В режиме хоста сетевое пространство имен хоста должно использоваться совместно с внешним миром. Здесь отображение портов может использоваться для доступа к сервисам. Здесь контейнер использует IP-адрес хоста docker. Пожалуйста, обратитесь к Сеть с использованием хост-сети . Работа в режиме хоста может быть полезна в ситуациях, когда контейнеру необходимо обрабатывать большой диапазон портов.

Здесь приведена ссылка на пример приложения на основе macvlan, который также может быть полезен. Вы можете использовать сетевой драйвер macvlan для назначения адреса MA C виртуальному сетевому интерфейсу каждого контейнера, что делает его физическим сетевым интерфейсом, напрямую подключенным к физической сети. Это гарантирует, что для сетевых устройств в вашей сети ваш контейнер будет физически подключен к сети.

1 голос
/ 12 февраля 2020

Невозможно передать сетевой интерфейс непосредственно в контейнер. У демона Docker есть несколько сетей, к которым могут быть подключены контейнеры. Обычно это виртуальные сети, называемые мостовыми сетями. Демон действует как маршрутизатор для внешнего мира.

Однако существует сеть хоста, которую можно указать с параметром --network host для docker run. Сеть хоста позволяет контейнеру получать доступ к сети хоста. Это работает только на Docker для Linux, но не на Docker для Ma c или Window.

Обычный способ доступа к контейнеру извне - это сопоставление порта из контейнера с порт на хосте. Запросы на сопоставленный порт хоста направляются на порт контейнера.

0 голосов
/ 06 марта 2020

Возможно перенести сетевой интерфейс в контейнер NET NAMESPACE (пример, основанный на моем опыте перемещения интерфейсов VF SR-IOV в контейнер):

HOST_INTERFACE=enp4s6f5
CONT_IFACE_NAME=eth255
container=debian-test

NSPID=$(docker inspect --format='{{ .State.Pid }}' $container

ip link set "$HOST_IFACE" netns "$NSPID"

в случае, если интерфейс имеет значение, это возможно чтобы изменить его перед настройкой UP

ip netns exec "$NSPID" ip link set "$HOST_IFACE" name "$CONT_IFACE_NAME"

установить его

ip netns exec "$NSPID" ip link set "$CONT_IFACE_NAME" up
...