Как использовать Docker (или контейнеры Linux) для эмуляции сети?

Edit: по состоянию на май 2015 года, SocketPlane (см. сайт и РЕПО) присоединился к команде Docker, и они находятся в процессе интеграции своего решения OVS в Docker core. Похоже, что их будет победителем различных сетевых решений Docker.


поэтому я использую Mininet для запуска тестов на моем сетевом программном обеспечении. Он, кажется, ударил ее пределы, хотя, как Mininet контейнеры, по сути, контейнеры Linux только с сетевым стеком. Я хотел бы, чтобы каждый контейнер имел свой собственный сетевой стек, файловую систему и набор процессов - в основном я хотел бы контейнер как можно ближе к виртуальной машине. Что приводит меня к Docker, как я понимаю, Docker противоположен Mininet, его контейнеры имеют файловую систему и свои собственные процессы, но не свой собственный сетевой стек. Я склоняюсь к Docker, поскольку у него есть хороший API для разветвления контейнеров, используя дисковое пространство только diff. Мой вопрос в том, возможно ли создайте набор контейнеров linux (с Докером или подобным) со следующим макетом контейнера + настройка сетевого интерфейса?

enter image description here

5 ответов


можно использовать трубопровод для этой цели. Это, в частности, один из сценариев, который он реализует (частные сети между контейнерами, в дополнение к стандартной сети Docker).


Я знаю о двух сетевых эмуляторах с открытым исходным кодом, которые используют контейнеры linux:

на эмулятор основной сети использует контейнеры, и каждый контейнер имеет свою собственную файловую систему (или частичную файловую систему, поскольку она создает только пространства имен монтирования для каталогов, требуемых службами, запущенными на каждом узле).

на VNX сетевой эмулятор-еще один вариант. Он использует KVM или LXC для создания виртуальных узлов (но я не пробовал LXC вариант, пока).


CORE Network Emulator имеет службу Docker, которую я внес и написал статьи о. Начальная версия, которая находится в 4.8, в основном сломана, но я исправил и улучшил ее. Запрос на вытягивание включен GitHub.

служба позволяет помечать изображения Docker с помощью "core", а затем они отображаются как опция в настройках служб. Необходимо выбрать образ Docker, который запускает службу docker в контейнере. Затем выберите контейнер или контейнеры, которые вы хотите запустить в этом узле. Он довольно хорошо масштабируется, и у меня было более 2000 узлов на моей машине 16Gb.

вы также упомянули ОВС. Это еще не встроено в ядро, но может использоваться вручную. Я только что ответил на вопрос о списке рассылки CORE. Он дает краткий обзор переключения стандартного основного переключателя (моста) с OVS. Текст воспроизводится ниже, если он полезен:

не содержатся файлы раньше, но мельком взглянул.

Я установил openvswitch через мой менеджер пакетов (Ubuntu 15.04):

sudo apt-get install openvswitch-переключатель

затем я построил очень простую сеть в CORE 4.8. 2 шт подключены к коммутатору. Я начал эмуляцию в CORE. Затем на хосте я посмотрел на мосты, которые были установлены:

sudo brctl show

bridge name     bridge id               STP enabled     interfaces
b.3.76          8000.42c789ce95e9       no              veth1.0.76
                                                        veth2.0.76
docker0         8000.56847afe9799       no
lxcbr0          8000.000000000000       no

Я вижу, что мост, представляющий коммутатор, называется b.3.76 и имеет интерфейсы veth1.0.76 и veth2.0.76 прилагается к нему. Я удаляю мостик:

sudo ip link set b.3.76 down
sudo brctl delbr b.3.76

затем я установил мост openvswitch:

sudo ovs-vsctl add-br b.3.76
sudo ovs-vsctl add-port b.3.76 veth1.0.76
sudo ovs-vsctl add-port b.3.76 veth2.0.76

теперь я могу пинговать между узлами, поэтому коммутатор, похоже, работает. Я не пытался сделать какую-либо дальнейшую конфигурацию openvswitch.

когда вы останавливаете эмуляцию ядра, она явно не удаляет мост openvswitch или порты, поэтому вам нужно сделать это вручную:

sudo ovs-vsctl del-port veth2.0.76
sudo ovs-vsctl del-port veth1.0.76
sudo ovs-vsctl del-br b.3.76

это было бы относительно просто автоматизировать с помощью скрипта или с небольшим количеством работы интегрирован в docker.

надеюсь, что это помогает


@jpillora IMUNES сетевой эмулятор использует Docker для своих L3 (ПК, маршрутизатор, хост) и открывает vSwitch для узлов L2 (концентратор, коммутатор). Например, узел маршрутизатора на самом деле является контейнером Docker с системой Debian Jessie, которая автоматически запускает Quagga, поэтому вам просто нужно нарисовать узлы внутри GUI. Затем вы можете получить доступ к этим контейнерам, дважды щелкнув по ним и сделать все, что вы сделали бы в системе Linux. Он использует "специальный" образ Докера, доступный на концентраторе называется imunes / vroot, который использует фиктивный процесс инициализации, поэтому он не завершается. Технически, с немного настройки, вы можете заменить его чем угодно. Его исходный код доступен на сайте Github. Я думаю, это было бы уместно для вас использовать case.


Я попробовал CORE и несколько других, но обнаружил, что их трудно настроить и запустить (особенно в AWS или на Mac). Они, вероятно, мощные, но излишние, если вы просто хотите имитировать простые сети.

поэтому я написал альянс (Еще Один Сетевой Тренажер). YANS основан на Docker. Даже я сам удивляюсь, как быстро он бежит. Попробуй!