Как использовать Docker (или контейнеры Linux) для эмуляции сети?
Edit: по состоянию на май 2015 года, SocketPlane (см. сайт и РЕПО) присоединился к команде Docker, и они находятся в процессе интеграции своего решения OVS в Docker core. Похоже, что их будет победителем различных сетевых решений Docker.
поэтому я использую Mininet для запуска тестов на моем сетевом программном обеспечении. Он, кажется, ударил ее пределы, хотя, как Mininet контейнеры, по сути, контейнеры Linux только с сетевым стеком. Я хотел бы, чтобы каждый контейнер имел свой собственный сетевой стек, файловую систему и набор процессов - в основном я хотел бы контейнер как можно ближе к виртуальной машине. Что приводит меня к Docker, как я понимаю, Docker противоположен Mininet, его контейнеры имеют файловую систему и свои собственные процессы, но не свой собственный сетевой стек. Я склоняюсь к Docker, поскольку у него есть хороший API для разветвления контейнеров, используя дисковое пространство только diff. Мой вопрос в том, возможно ли создайте набор контейнеров linux (с Докером или подобным) со следующим макетом контейнера + настройка сетевого интерфейса?
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. Даже я сам удивляюсь, как быстро он бежит. Попробуй!