Работа с LXC-контейнерами в Ubuntu Linux

    Общий рейтинг статьи: 0 (проголосовало 0 )
    Опубликовано:  [просмотров 433]


    LXC-контейнеры - один из методов контейнерной изоляции наиболее приближенный к понятию виртуальная машина Linux с минимальными издержками на обслуживание. Используется единая память хоста, единое ядро и при помощи cgroups. Механизм напоминает OpenVZ, но в отличие от OVZ может работать с современными ядрами.

    Для установки системы контейнерной изоляции LXC, выполните следующую команду:

    # aptitude install lxc lxc-templates

    Рассмотрим основные команды для работы с контейнерами в консоли Linux.

    Основы работы с LXC-контейнерами

    Создание контейнера гостевой ОС:

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

    # lxc-create --name web-server -t ubuntu

    • -t - тип системы для контейнера
    • --name - имя контейнера (уникальное имя используемое в операциях управления контейнерами)

    Создание контейнера путем загрузки образа из репозитария (быстро и ограничено только скоростью загрузки образа)

    # lxc-create -t download -n test -- -d ubuntu -r trusty -a amd64 --name web-server-01

    Получение списка контейнеров хост-системы и их текущего статуса:

    # lxc-ls -f

    В результате выполнения команды вы получите список контейнеров и их текущего состояния.

    Запуск контейнера:

    # lxc-start --name web-server

    Остановка контейнера:

    # lxc-stop --name web-server

    Удаление контейнера:

    # lxc-destroy --name test

    Подключение к консоли контейнера:

    # lxc-attach --name web-server

    Подключение осуществляется с учетными данными пользователя root. Обратите внимание, что по умолчанию для работы создается пользователь ubuntu с паролем ubuntu, а шаблон контейнера в свою очередь по умолчанию содержит sshd-сервер, поэтому обязательно смените пароль или вообще удалите пользователя ubuntu в целях обеспечения безопасности.

    Некоторые особенности использования системы контейнерной изоляции LXC.

    1. Контейнеры расположены в каталоге /var/lib/lxc/ файловая система контейнера находится в каталоге rootfs контейнера, а конфигурационным файлом является файл /var/lib/lxc/<Имя контейнера>/config.

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

    lxc.start.auto = 1
    lxc.start.delay = 5

    • lxc.start.auto - включает режим автостарта контейнера
    • lxc.start.delay - задержка запуска в секундах

    2. В минимальном варианте контейнер идет без настроенной поддержки кодовой таблицы ru_RU.UTF-8, это вызывает ошибки вида:

    perl: warning: Setting locale failed.
    perl: warning: Please check that your locale settings:
    LANGUAGE = (unset),
    LC_ALL = (unset),
    LC_TIME = "ru_RU.UTF-8",
    LC_MONETARY = "ru_RU.UTF-8",
    LC_ADDRESS = "ru_RU.UTF-8",
    LC_TELEPHONE = "ru_RU.UTF-8",
    LC_NAME = "ru_RU.UTF-8",
    LC_MEASUREMENT = "ru_RU.UTF-8",
    LC_IDENTIFICATION = "ru_RU.UTF-8",
    LC_NUMERIC = "ru_RU.UTF-8",
    LC_PAPER = "ru_RU.UTF-8",
    LANG = "en_US.UTF-8"
    are supported and installed on your system.

    Для устранения этой ошибки выполните следующую команду:

    # locale-gen ru_RU.UTF-8

    3. Сетевая подсистема по умолчанию настроена в режим сетевого моста с интерфейсом lxcbr0, автоматическое назначение сетевых адресов производится средствами dnsmasq. По умолчанию используется подсеть 10.0.3.0/24, для смены текущей подсети и имени интерфейса внесите соответствующие изменения в файл /etc/default/lxc-net:

    LXC_BRIDGE="lxc-bridge"
    LXC_ADDR="10.4.0.1"
    LXC_NETMASK="255.255.255.0"
    LXC_NETWORK="10.4.0.0/24"
    LXC_DHCP_RANGE="10.4.0.2,10.4.0.200"
    LXC_DHCP_MAX="198"

    Вы также можете настроить сетевую подсистему lxc при помощи мастера конфигурирования вызываемого командой:

    # dpkg-reconfigure -p medium lxd

    Обязательно переконфигурируйте уже созданные контейнеры изменив файл config в каталоге /var/lib/lxc/<название контейнера>:

    lxc.network.type = veth
    lxc.network.link = lxc-bridge

    Для изменения имени интерфейса для будущих контейнеров отредактируйте имя интерфейса в файле шаблона /etc/lxc/default.conf:

    lxc.network.link = lxc-bridge

    Для более сложных вариантов сетевая подсистема настраивается вручную.

    Выделение IP-адресов производится автоматически средствами DHCP-сервера dnsmasq. Вы можете или полностью отключить управление сетевой подсистемой lxc отключив службу lxc-net или назначать статические адреса контейнерам. Для реализации второго варианта расскомментируйте в файле /etc/default/lxc-net строку:

    LXC_DHCP_CONFILE=/etc/lxc/dnsmasq.conf

    Параметры статической адресаций прописываются в файле /etc/lxc/dnsmasq.conf, посредством указания параметра:

    dhcp-hostsfile=/etc/lxc/dnsmasq-hosts.conf

    Обратите внимание, что при указании связки имя -> ip-адрес используется не имя контейнера, а имя хоста в контейнерое прописанное в файле /etc/hostname. Файл dnsmasq-hosts.conf содержит пары значений "имя хоста - ip-адрес", например:

    postgresql-server, 10.4.0.3
    web-server, 10.4.0.2

    Проверить назначенные контейнерам сетевые адреса можно командой lxc-ls -f, результат ее работы выглядит следующим образом:

    NAME STATE AUTOSTART GROUPS IPV4 IPV6
    postgresql-server RUNNING 1 - 10.4.0.3 -
    web-server RUNNING 1 - 10.4.0.2 -

    В файле dnsmasq-hosts можно указать любые параметры конфигурации демона dnsmasq, а не только привязку статического ip-адреса.

    4. По умолчанию, работа с TUN/TAP интерфейсами в LXC заблокирована, следовательно попытка создать виртуальный интерфейс (например при запуске OpenVPN сервера или клиента) вызовет ошибку:

    ERROR: Cannot open TUN/TAP dev /dev/net/tun: No such file or directory (errno=2)

    Для включения требуемого функционала, добавьте в конфигурацию контейнера (файл config контейнера) параметр:

    lxc.cgroup.devices.allow = c 10:200 rwm

    На стороне контейнера создайте требуемое блочное устройство выполнив последовательность команд:

    mkdir /dev/net
    mknod /dev/net/tun c 10 200
    chmod 666 /dev/net/tun

    Эту операцию требуется выполнять при каждом перезапуске хост-машины (можно добавить их в файл rc.local).


    Обсуждение статьи

    Ваш комментарий: