image

Здравствуйте, коллеги. Продолжаем освещать разработку UNetLab. В предыдущем посте я рассказывал о новой версии UNetLab 1.0 и анонсировал запуск видео курса. Но время идет и разработчики выпустили очередное значительное обновление — UNetLab 1.0.0-12. Ключевые новшества, которые будут описаны в этой статье:
1) Dynamic nodes connection
2) Интеграция с Docker

Если вас заинтересовала данная тема, добро пожаловать по кат.

Dynamic nodes connection


Функция, которую так ждали все пользователи UNetLab. Наконец-то стало возможным динамическое соединение узлов простым кликом мышки (в видео уроке ниже показан сам процесс).

image

Теперь нет необходимости создавать сети в ручную. Таким образом создание топологий в UNetLab стало таким же удобным, как и в GNS3.

Если вы еще не успели обновиться, то делается это элементарно:

apt-get update
apt-get install unetlab


Интеграция с Docker


Вообще говоря, реализация Docker-а в UNL еще сыровата и требует серьезной доработки, однако я не могу не затронуть эту тему, т.к. она очень важна. На сколько я знаю, даже новая версия GNS3 так же имеет поддержку Docker-а. У этой технологии очень большой потенциал.

Но прежде чем начать, думаю весьма логично сначала рассказать про сам Docker. Что же это такое? Вопрос не самый простой, но я, как обычно, постараюсь объяснить максимально просто. Описывать буду поверхностно и общими фразами, т.к. данный курс не про виртуализацию, да и я сам не считаю себя экспертом в этой области.

Итак, на сегодняшний день можно выделить три основных вида виртуализации:

1) Полная (аппаратная) виртуализация</4>
image

Данный тип виртуализации используют VirtualBox, VMware, KVM, QEMU и т.д. Смысл заключается в полной эмуляции компьютера со всеми аппаратными средствами. В данном случае гипервизор распределяет аппаратные средства между виртуальными машинами. И уже в эти виртуальные машины устанавливается Операционная система, практически как на полноценный физический компьютер. Виртуальные машины полностью изолированны друг от друга. Аппаратная виртуализация должна поддерживаться процессором. Многие наверно уже включали в биосе эту функцию. Это либо Intel VT (VT-x) либо AMD-V.

2) Виртуализация уровня операционной системы


image

Данный тип виртуализации используют OpenVZ, LXC и т.д. В этом случае уже не используется эмуляция аппаратных средств. Создается как бы копия большинства процессов исходной операционной системы. Эти процессы изолируются в отдельный контейнер (отсюда и название — контейнерная виртуализация). При этом в контейнере мы получаем практически полноценную операционную систему, куда могут быть установлены приложения. Такой подход дает выигрыш в производительности по сравнению с полной виртуализацией, т.к. нет необходимости эмулировать аппаратные средства. Вообще есть много плюсов и минусов использования того или иного типа виртуализации, но наш урок не об этом.

3) Виртуализация приложений


image

Это уже более высокий уровень абстракции, который позволяет еще больше экономить системные ресурсы. Зачем виртуализировать целую операционную систему если нам к примеру нужна только отдельная база данных? Или отдельный web — сервер? Docker решает этот вопрос. Он позволяет создавать копию не всех процессов исходной операционной системы, а копию отдельного приложения и изолировать его в контейнер. Это очень удобно при разработке и тестировании. При этом docker так же умеет виртуализировать операционную систему, как это делает OpenVZ или LXC.

Если есть желание познакомиться с docker поближе, то можете воспользоваться данным ресурсом.

Вкратце рассказал, что есть что. Повторюсь, что я описал все очень поверхностно. Я даже не затрагивал такие вещи, как виртуализация сети или виртуализация систем хранения данных. Вообще виртуализация очень интересная и обширная тема. Если у вас есть свободное время, то по возможности обучайтесь по этому направлению, т.к. без виртуализации сегодня уже никуда!

А мы, тем временем, переходим к docker-у. Кто-то может спросить: «Зачем нам docker, когда есть и QEMU, и внешние виртуалки в виде VMware и тот же VPCS?» Попробую ответить.

Если взять виртуалки в виде QEMU или VMware, то они всем хороши, но, потребляют слишком много ресурсов (память, процессор, жесткий диск).

Казалось бы, есть VPCS, который вообще ничего не потребляет. Но у него весьма скудный функционал. Нет telnet или ssh клиента, нет tcpdump-а, нет nslookup-а и многих других полезных функций. Т.е. на данный момент мы либо тратим много ресурсов, либо испытываем проблемы с нехваткой функционала. Docker призван решить наши проблемы. Docker позволяет запустить практически полноценную Linux подобную систему с довольно скромныными параметрами, как по оперативной памяти, так и по жесткому диску. При этом у нас огромный выбор готовых контейнеров с различными дистрибутивами или приложениями.

В этом уроке мы рассмотрим работу с одним из самых маленьких контейнеров для docker-а — BusyBox. Что это такое, можно почитать вот здесь. Если коротко, то это очень маленький дистрибутив, с очень маленькими системными требованиям. Что ж, начнем.

Для начала нам необходимо установить docker на сервер unetlab, т.к. по умолчанию он отсутствует. Подробная инструкция есть на официальном сайте UNL в разделе howto. Не вижу смысла дублировать здесь эту информацию.

После установки можем перейти к веб-интерфейсу unetlab. Кстати говоря, для подключения к контейнерам используется специальная утилита docker-а. Убедитесь что у вас в папке C:\Program Files\UNetLab присутствуют необходимые файлы: docker.exe, docker_wrapper и win7_64bit_docker. Если нет, то вам нужно установить новый windows integration pack.

Какой же функционал нам дает этот экстремально малый дистрибутив? На самом деле довольно богатый. В busybox нам доступны:

— Клиент и сервер telnet
— Клиент и сервер tftp
— Клиент и сервер ftp
— HTTP сервер
— DNS сервер
— NTP сервер
— Такие утилиты как:
— ifconfig
— ip route
— traceroute
— arp
— nslookup
— netstat

Теперь давайте соберем простенькую схему и воспользуемся доступным нам функционалом. Предположим, что нам в лабораторной работе понадобилось протестировать такие сервисы как DHCP, HTTP, DNS, FTP и Telnet. Все это мы можем сделать с помощью Docker! Для настройки мы будем использовать следующие встроенные сервисы BusyBox:

udhcpd — для DHCP сервера
httpd — для WEB сервера
dnsd — для DNS сервера
ftpd — для FTP сервера
telnetd — для Telnet сервера

Весь процесс настройки можно посмотреть в данном уроке (смотреть с 10-й минуты):



Таким образом, мы подняли Telnet сервер, HTTP сервер, DHCP, FTP и DNS сервер на одном контейнере, образ которого весит всего 1 Мбайт! Впечатляет, правда? И мы рассмотрели всего лишь один образ, а их огромное кол-во с различным софтом внутри. Более того, вы можете с легкостью собрать свой собственный образ с нужным вам набором утилит. Наш урок не про это, но если вам стало интересно, то обязательно изучите эту возможность.

Резюмирую вышесказанное: можно с уверенностью сказать, что UNetLab продолжает динамичное развитие и становится все более функциональным и удобным средством для обучения.
Поделиться с друзьями
-->

Комментарии (18)


  1. chemtech
    22.07.2016 07:24

    Может расскажите/напишите создание лабы где будет подключение IPSEC VPN между Linux в Docker и Cisco?
    Также интересная тема: Учет трафика Cisco ASA с помощью NetFlow на Linux в Docker.
    Заранее спасибо.


  1. DeeZ
    23.07.2016 14:47

    Дела по мануалам. но почему то нет части команд

    root@Docker:/# ipconfig
    bash: ipconfig: command not found
    root@Docker:/# ip route
    bash: ip: command not found
    root@Docker:/#route
    bash: route: command not found
    root@Docker:/# ping
    bash: ping: command not found
    


    1. ciiccii
      24.07.2016 13:59

      возможно не тот образ busybox поставился?


      1. DeeZ
        24.07.2016 14:22

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


      1. DeeZ
        24.07.2016 18:14

        Разобрался со своей проблемой. У меня до этого был установлен образ убунту, как в официальном доке на UNL. и почему то всегда запускался именно он, даже если выбрать бизибокс (видимо та самая сырость UNL). Удалил убунту, поставил один бизибокс — все стало ок.


        1. DeeZ
          24.07.2016 18:48

          Не заработал сеть. Если старую руками с ключом "--cap-add=NET_ADMIN " все ок. а из UNL не дает поменять IP:

          / # ip addr add 10.0.0.1/24 dev eth0
          ip: RTNETLINK answers: Operation not permitted
          

          Как заставить UNL запускать с этим параметром?


          1. DeeZ
            24.07.2016 20:19

            Победил.
            Честно пока не знаю на сколько это опасно и костыльно (первый день докер трогаю). Но в UNL часть параметров из стартап конфига у меня не применялась. А из-за сырости докера приходилось удалять докер. добавлять снова. добавлять линк, потом идти писать\править стартап, и в Nodes выбирать стартап конфиг (если выбрать его при создании ноды — оно тоже не работает). надоело тратить кучу временина проверку каждой строки, решил рестартануть контейнер.

            #Из консоли UNL:
            docker -H=tcp://127.0.0.1:4243  ps -a
            #Запущеный UNL-ом контейнер будет с именем типа
            #NAMES: 82870f34-925a-438f-a17d-1841250497a6-0-5
            #ORTS:  47a9753304cc
            #Удаляем его:
            docker -H=tcp://127.0.0.1:4243  rm 47a9753304cc
            #запускаем с атрибутом NET_ADMIN и таким же именем:
            docker -H=tcp://127.0.0.1:4243  run --cap-add=NET_ADMIN -d --name 82870f34-925a-438f-a17d-1841250497a6-0-5 -i -t  busybox  /bin/sh
            

            Полагаю если добавить еще один докер, то надо будет рестартануть опять новый контейнер.


            1. cooper051
              25.07.2016 09:00

              Через startup config разве не работает?


              1. DeeZ
                25.07.2016 10:13

                Возможно это как раз сырость докера. У меня не срабатывал роут. ни через ip route ни через route add.
                На этой же лабе добавил второй докер — создался второй контейнер и все заработало. До этого исопльзовался всегда один, даже если удаляешь ноду.
                По этому я долго мучался с образом убунту, из How To, думая что запускаю бизибокс.

                Теперь у меня проблема с Windows образом :))


  1. ciiccii
    24.07.2016 13:59

    Интересно!

    А как подключится к например busybox если виртуальная машина с unetlab запущена не в виндовс, а в линуксе?
    Вебинтерфейс unetlab пытается отктырть ссылку типа «docker://192.168.122.60:4243/ace7062e-b1f3-418e-81db-f8f954ac8ef2-0-1?Docker» но браузер её не распознаёт. Ну это ладно, а через терминал как подключиться к работающему образу busybox? На линксе ведь не поставишь windows integration pack. Спасибо!


    1. DeeZ
      24.07.2016 14:23

      в статье есть об этом.надо запустить рег файл, что бы ассоциировать ссылки типа docker:// с docker_warper.bat
      Тогда все ок.


      1. ciiccii
        24.07.2016 15:22

        хе-хе, это если виртуальная машина в виндовсе запущена. я пытаюсь сделать это в линуксе.


        1. DeeZ
          24.07.2016 15:25

          Если FF то добавьте вручную ассоциацию на протокол
          Наверняка понадобится поставить докер, и напистаь срипт, который будет цепляться у кдаленому хосту. хотя може есть уже готовй пакет для линуксов.


          1. ciiccii
            24.07.2016 17:40

            Спасибо, ещё бы узнать команду для которую нужно передавать для локального докера(docker установлен). Если бы удалось вручную подключиться…

            Я пробовал docker attach но что-то не получается.


            1. DeeZ
              24.07.2016 17:59

              docker.exe -H=%H% attach %I%
              H — берется из ссылки, адрес куда цеплсять.
              I — ID докера.Передается в ссылке


              1. ciiccii
                24.07.2016 18:50

                спасибо!


              1. ciiccii
                24.07.2016 20:17
                +1

                Если кому интересно, то я навелосипедил скриптик, который запускает команду соответственно протоколу.

                cat ./protocol_handler.sh
                #!/bin/bash
                protocol=$(echo $1 | cut -d : -f 1)
                address=$(echo $1 | cut -d / -f 3)
                user=$(echo $address | grep @ | cut -d @ -f 1)
                port=$(echo $address | grep : | cut -d : -f 2)
                host=$(echo $address | cut -d @ -f 2 | cut -d : -f 1)
                case $protocol in
                    ssh)
                        connectstring=$(echo "$([ -z $user ] || echo "$user@")$host$([ -z $port ] || echo "-p $port")")
                        konsole --new-tab -e "$protocol $connectstring"
                        ;;
                    telnet)
                        connectstring=$(echo "$host $([ -z $port ] || echo "$port")$([ -z $user ] || echo "-l $user")")
                        konsole --new-tab -e "$protocol $connectstring"
                        ;;
                    rdesktop)
                        connectstring=$(echo "$([ -z $user ] || echo "-u $user ")$host$([ -z $port ] || echo ":$port")")
                        rdesktop -g 1280x960 $connectstring
                        ;;
                    vnc)
                        connectstring=$(echo "$host$([ -z $port ] || echo":$port")")
                        vncviewer $connectstring
                        ;;
                    docker)
                        konsole --new-tab -e docker -H=$address attach $(echo $1 | cut -d / -f 4 | cut -d \? -f 1) 
                        ;;
                esa
                


  1. ciiccii
    24.07.2016 18:49

    del