Назад | Перейти на главную страницу

как связать сетевой интерфейс Docker с сетевым интерфейсом Linux (eth5) на хосте Linux?

У моего хоста Linux 8 интерфейсов Ethernet, eth0 - eth7. Я запускаю три контейнера Docker 1.9 на этом хосте Linux.
Как я могу связать сетевой интерфейс внутри одного контейнера Docker с определенным физическим сетевым интерфейсом Linux (скажем, eth5) на хосте на уровне 3 (уровень IP)?

Причины подключения на уровне 3:
1. иметь возможность настраивать сетевой интерфейс Docker с помощью DHCP
и
2. для ВСЕГО входящего IP-трафика на физическом интерфейсе хоста (eth5), который будет перенаправлен на связанный интерфейс Docker (я не хочу выполнять сопоставление портов с использованием NAT, которое будет направлять трафик ТОЛЬКО для определенного порта TCP / UDP на интерфейс Docker)

В принципе, как подключить сетевой интерфейс Docker к конкретному сетевому устройству Linux (хосту) (скажем, eth5) на уровне 3 / уровне 2?

Для этого есть несколько способов:

  1. Использование мостов Linux (brctl)

  2. Использование Open vSwitch (ovs-vsctl)

  3. Использование MACVLAN

  4. Использование IPVLAN (введено в ядре 3.19, но не стабильно до версии 4.2 или новее)

MACVLAN и IPVLAN поддерживаются как модули ядра Linux.

MACVLAN: позволяет создавать виртуальные сетевые интерфейсы, которые «цепляются» за физический сетевой интерфейс (eth5 в вопросе выше). Каждый виртуальный интерфейс имеет свой собственный MAC-адрес, отличный от MAC-адреса физического интерфейса. Кадры, отправленные на виртуальные интерфейсы или от них, отображаются на физический интерфейс.

Хотя в Linux интерфейс уже может иметь несколько адресов, MACVLAN позволяет дополнительно изолировать трафик, который можно увидеть на таком интерфейсе. MACVLAN сможет видеть только трафик, MAC-адрес которого соответствует этому интерфейсу, не позволяя процессам / контейнерам на других интерфейсах прослушивать трафик, предназначенный для другой MACVLAN.

IPVLAN: концептуально очень похож на драйвер macvlan с одним важным исключением, которое использует L3 для мультиплексирования / демультиплексирования между подчиненными устройствами. Главное устройство использует L2 MAC со своими подчиненными устройствами. Это позволяет создавать виртуальные устройства вне основного интерфейса, и пакеты доставляются на основе IP-адреса dest L3 в пакетах. Все интерфейсы (включая основной интерфейс) совместно используют L2, что делает его прозрачным для подключенного коммутатора L2.

Для IPVLAN каноническая документация: https://github.com/torvalds/linux/blob/master/Documentation/networking/ipvlan.txt

В настоящее время Docker поддерживает как MACVLAN, так и IPVLAN в экспериментальной версии; они скоро появятся в GA

Дополнительные сведения о MACVLAN и IPVLAN (включая конкретные команды) см. В отличном блоге Брента Солсбери: http://networkstatic.net/configuring-macvlan-ipvlan-linux-networking/