Авторские статьи

LXD 2.0: Ваш первый LXD контейнер [3/12].


Третья статья из цикла статей про LXD от Стефана Грабера (Stéphane Graber). Научимся создавать и манипулировать своим первым контейнером.

Так как существует много команд для управления контейнерами LXD, то данный пост будет большим. Если вы предпочитаете быстрый тур "шаг за шагом", то лучше попробовать онлайн тур.

Создание и запуск нового контейнера

Как было указано в предыдущих статьях, клиент командной строки идёт с преднастроенными источниками образов (image). Официальные Ubuntu образы всех релизов и архитектур присутствуют там, но так же есть неофициальные образы других дистрибутивов. Их создаёт сообщество и поддерживаются мантейнерами upstream проекта.

Ubuntu

Если вы просто хотите поддерживаемый релиз Убунту, то командуйте lxc launch ubuntu: Заметьте, что при выходе новых релизов смысл вашей команды будет меняться. При использовании команды в сценариях вы будете ставить актуальный релиз.

Ubuntu 14.04 LTS

Чтобы получить последний, протестированный, стабильный образ Ubuntu 14.04 Trusty Tahr LTS, вам нужно - lxc launch ubuntu:14.04

Данная команда даст случайное имя контейнеру. Если хотите сами его задать (в примере c1), тогда командуйте так lxc launch ubuntu:14.04 c1
Если хотите уточнить архитектуру, то так lxc launch ubuntu:14.04/i386 c2

Текущий разрабатываемый релиз Убунту

Использование "ubuntu:" подразумевает только работу с официальными, протестированными образами Убунту. Если вы хотите работать с непротестированными, дневными билдами, используйте "ubuntu-daily:" - lxc launch ubuntu-daily:devel c3
В примере, последний разрабатываемый релиз автоматически будет запущен. Для примера так же можно указывать кодовое имя проекта - lxc launch ubuntu-daily:xenial c4

Последний Alpine Linux

Образы Alpine доступны через "images:" - lxc launch images:alpine/3.3/amd64 c5

И много ещё ...

Полные списки доступных образов Убунту вы получите
lxc image list ubuntu:
lxc image list ubuntu-daily:

Полные списки доступных неофициальных образов - lxc image list images:

Список алиасов (дружественных имён) вы можете получить так (в примере для удалённого ubuntu:) - lxc image alias list ubuntu:

Создание контейнера без его запуска

Если вы хотите просто создать контейнер или пачку контейнеров, но не хотите их запускать немедленно, то замените lxc launch на lxc init. Всё остальное идентично, за исключением того, что контейнер не стартует после создания.

lxc init ubuntu:

Информация о контейнерах

Список всех контейнеров

Список всех ваших контейнеров - lxc list

Есть различные опции, которыми вы можете определить отображаемые столбцы. В системах с большим количеством контейнеров вывод информации с дефолтными столбцами может быть медленным из-за получения информации о сети внутри контейнера. Вы можете вывести так - lxc list --fast , что потребует меньше обработки на стороне сервера.

Вы можете фильтровать по имени или свойствам. Для примера выведем привилегированные контейнеры - lxc list security.privileged=true

+------+---------+---------------------+-----------------------------------------------+------------+-----------+
| NAME |  STATE  |        IPV4         |                       IPV6                    |    TYPE    | SNAPSHOTS |
+------+---------+---------------------+-----------------------------------------------+------------+-----------+
| suse | RUNNING | 172.17.0.105 (eth0) | 2607:f2c0:f00f:2700:216:3eff:fef2:aff4 (eth0) | PERSISTENT | 0         |
+------+---------+---------------------+-----------------------------------------------+------------+-----------+

Для примера выведем контейнеры, обладающие в имени подстрокой alpine. Поддерживаются сложные регулярные выражения.
lxc list --fast alpine

+-------------+---------+--------------+----------------------+----------+------------+
|    NAME     |  STATE  | ARCHITECTURE |      CREATED AT      | PROFILES |    TYPE    |
+-------------+---------+--------------+----------------------+----------+------------+
| alpine      | RUNNING | x86_64       | 2016/03/20 02:11 UTC | default  | PERSISTENT |
+-------------+---------+--------------+----------------------+----------+------------+
| alpine-edge | RUNNING | x86_64       | 2016/03/20 02:19 UTC | default  | PERSISTENT |
+-------------+---------+--------------+----------------------+----------+------------+

Получение детальной информации о контейнере

Команда list не может показать детальную информацию про конкретный контейнер в читабельном виде. Запросить требуемое про контейнер вы можете - lxc info имя-контейнера
Пример

Name: zerotier
Architecture: x86_64
Created: 2016/02/20 20:01 UTC
Status: Running
Type: persistent
Profiles: default
Pid: 31715
Processes: 32
Ips:
 eth0: inet 172.17.0.101
 eth0: inet6 2607:f2c0:f00f:2700:216:3eff:feec:65a8
 eth0: inet6 fe80::216:3eff:feec:65a8
 lo: inet 127.0.0.1
 lo: inet6 ::1
 lxcbr0: inet 10.0.3.1
 lxcbr0: inet6 fe80::c0a4:ceff:fe52:4d51
 zt0: inet 29.17.181.59
 zt0: inet6 fd80:56c2:e21c:0:199:9379:e711:b3e1
 zt0: inet6 fe80::79:e7ff:fe0d:5123
Snapshots:
 zerotier/blah (taken at 2016/03/08 23:55 UTC) (stateless)

Команды управления жизненным циклом

Команды очевидны для большинства известных вам менеджеров виртуальных машин и контейнеров, но они будут описаны. Команды принимают множество имён контейнеров для пакетной обработки.

  • start.
    Запуск контейнера - lxc start имя-контейнера
  • stop
    Остановка контейнера - lxc stop имя-контейнера
    Если контейнер не отвечает и не реагирует на SIGPWR, то форсируйте - lxc stop имя-контейнера --force
  • restart
    Перезагрузка контейнера - lxc restart имя-контейнера
    Если контейнер не отвечает и не реагирует на SIGINT, то форсируйте - lxc restart имя-контейнера --force
  • pause
    Вы можете поставить контейнер на паузу. В этом режиме задачи в контейнере получат эквивалент SIGSTOP, что будет означать, что они по-прежнему видны, используют память, но не получают процессорного времени от планировщика (CPU scheduler). Это полезно, когда у вас есть жадный до CPU контейнер, который не нужен вам постоянно. Вы можете его запустить, поставить на паузу и запускать когда он нужен.
    lxc pause имя-контейнера
  • delete
    Если контейнер больше не нужен, то можете сказать ему до свидания - lxc delete имя-контейнера
    Заметьте факт, что если контейнер в данный момент работает, то нужно указывать lxc delete имя-контейнера --force

Конфигурация контейнера

LXD управляет множеством настроек контейнера, включая ограничения ресурсов, контроль старта контейнера и параметры проброса устройства из хоста в контейнер. Полный список очень большой и доступен в разделе Configuration.

Что касается устройств, LXD поддерживает следующие типы:

  • disk
    Физический диск или раздел, который может быть смонтирован внутри контейнера. С помощью mount bind можно путь в хосте смонтировать в контейнере.
  • nic
    Сетевой интерфейс. Это может быть виртуальный сетевой интерфейс типа bridge, устройство point-to-point, сетевое устройство macvlan или физический интерфейс, который пробросили в контейнер.
  • unix-block
    Блочное UNIX устройство типа /dev/sda
  • unix-char
    Символьное UNIX устройство типа /dev/kvm
  • none
    Специальный тип для скрытия устройства, которое иначе могло быть унаследовано через профили.

Профили конфигурации

Список доступных профилей можно получить командой lxc profile list
Содержимое конкретного профиля легко увидите командой - lxc profile show имя-профиля
Если вы хотите что-либо изменить внутри профиля, то lxc profile edit имя-профиля
Вы можете изменить список профилей, применённых к контейнеру - lxc profile apply имя-контейнера имя-профиля-1,имя-профиля-2,имя-профиля-3,...

Локальная конфигурация

Для уникальных опций конкретного контейнера нет смысла указывать это в профиле и можно установить значения данных опций напрямую:
lxc config edit имя-контейнера
Вместо открытия всех опций в редакторе, вы можете выставить нужные ключи индивидуально - lxc config set имя-контейнера имя-ключа значение
Добавляем конкретное устройство
lxc config device add имя-контейнера kvm unix-char path=/dev/kvm

Всё тоже самое доступно и для профилей - lxc profile set ... и lxc profile device add ...

Чтение конфигурации

Вы можете отобразить локальную конфигурацию
lxc config show имя-контейнера
или расширенную (expanded) конфигурацию, включая все ключи профиля
lxc config show --expanded имя-контейнера
Пример

name: zerotier
profiles:
- default
config:
 security.nesting: "true"
 user.a: b
 volatile.base_image: a49d26ce5808075f5175bf31f5cb90561f5023dcd408da8ac5e834096d46b2d8
 volatile.eth0.hwaddr: 00:16:3e:ec:65:a8
 volatile.last_state.idmap: '[{"Isuid":true,"Isgid":false,"Hostid":100000,"Nsid":0,"Maprange":65536},
{"Isuid":false,"Isgid":true,"Hostid":100000,"Nsid":0,"Maprange":65536}]'
devices:
 eth0:
  name: eth0
  nictype: macvlan
  parent: eth0
  type: nic
  limits.ingress: 10Mbit
  limits.egress: 10Mbit
 root:
  path: /
  size: 30GB
  type: disk
 tun:
  path: /dev/net/tun
  type: unix-char
ephemeral: false

Команда полезна для проверки, что на самом деле в итоге будет применено к данному контейнеру.

Обновление конфигурации в реальном времени

Обратите внимание, что все конфигурационные параметры и устройства могут быть применены к контейнеру "на лету". Вы можете добавлять или удалять устройства, изменять профиля безопасности БЕЗ необходимости перезагружать контейнер.

Получение shell

LXD позволяет выполнять задачи напрямую в контейнере. Наиболее частая задача - запуск shell для административной работы. Преимущество перед SSH состоит в том, что вы не зависите от сетевых настроек или наличия/отсутствия определенных программ.

Среда исполнения

Вам следует знать, что хоть LXD и выполняет ваши команды внутри контейнера, сам он не работает внутри контейнера, а следовательно не знает какую оболочку использовать, какие переменные окружения есть и какой путь к домашней директории. Команды, исполняемые через LXD, работают от прав root внутри контейнера (uid 0, gid 0) с минимальным PATH и HOME = /root. Дополнительные переменные окружения могут быть переданы через командную строку или выставлены на всегда через указание в конфигурации ключей environment.ключ.

Выполнение команд

Запуск оболочки внутри контейнера просто - lxc exec имя-контейнера bash , подразумевая что контейнер обладает установленным bash.

Более сложные команды требуют использования разделителя для корректного парсинга lxc exec имя-контейнера -- ls -lh /
Для установки или перекрытия переменных окружения вы можете использовать --env. Для примера lxc exec zerotier --env mykey=myvalue env | grep mykey
mykey=myvalue

Управление файлами

Так как LXD имеет прямой доступ к файловой системе контейнера, вы можете читать и писать любой файл внутри.

Взятие файла из контейнера

Получить файл из контейнера можно командой - lxc file pull имя-контейнера/путь место-назначения-dest
Пример, lxc file pull zerotier/etc/hosts hosts
или прочесть в выводом на стандартный output - lxc file pull zerotier/etc/hosts -

127.0.0.1 localhost
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

Помещение файла внутрь контейнера

lxc file push исходное-местоположение имя-контейнера/путь

Редактирование файла

Удобная функция, которая сама возьмёт (pull) файл, откроет его в вашем редакторе и затем поместит (push) его обратно с вашими правками: lxc file edit имя-контейнера/путь

Управление снимками

LXD позволяет сделать снимок и затем восстановить его. Снимки включают полное состояние контейнера, включая running состояние при использовании -stateful, что означает сохранение конфигурации контейнера, устройств и файловой системы.

Создание снимка

Просто создать снимок можно так lxc snapshot имя-контейнера и снимки будут иметь имя snapX, где X - увеличивающееся число. Сделать снимок с именем можно так - lxc snapshot имя-контейнера имя-снимка

Списки снимков.

Сколько всего снимков у контейнера показывается в команде lxc list, но фактически список снимков вы увидите в выводе lxc info имя-контейнера

Восстановление из снимка

Восстановить состояние контейнера на момент снимка - lxc restore имя-контейнера имя-снимка

Переименование снимка

Снимок переименовывается методом перемещения - lxc move имя-контейнера/имя-снимка имя-контейнера/новое-имя-снимка

Создание контейнера из снимка

Вы можете создать новый контейнер, который идентичен снимку какого-либо контейнера, за исключением такой уникальной информации типа адресов MAC. lxc copy имя-исходного-контейнера/имя-снимка имя-нового-контейнера

Удаление снимка

Просто удалить снимок - lxc delete имя-контейнера/имя-снимка

Клонирование и переименование

Получение чистого образа это всё хорошо, но часто требуется поставить кучу всего в контейнере, сконфигурировать его как надо и сделать из него пачку других контейнеров.

Копирование контейнера

Для копирования и эффективного клонирования в новый используйте - lxc copy имя-исходного-контейнера имя-нового-контейнера
Новый контейнер будет идентичен исходному за исключением сброшенных снимков и таких ключей как MAC адреса, которые должны быть уникальны среди контейнеров.

Перемещение контейнера

LXD позволяет копировать и перемещать контейнеры между хостами, но это мы рассмотрим в следующих статьях. Сейчас же move означает rename для контейнера - lxc move имя-контейнера новое-имя-контейнера Единственное требование - контейнер должен быть остановлен, остальное будет у нового контейнера таким же, включая такую информацию как MAC адреса.

Итог

Эта довольно таки длинная статья охватывает часто употребительные команды, которые вы будете использовать ежедневно. У многих команд есть дополнительные параметры, которые позволяют эффективно изменять определенные аспекты. Лучший способ узнать о них использовать параметр --help.

Дополнительная информация.

Главный сайт LXD - linuxcontainers.org/lxd
Github - github.com/lxd
Почтовая рассылка - lists.linuxcontainers.org
IRC #lxcontainers irc.freenode.net

Оглавление цикла статей про LXD 2.0.
Предыдущая статья LXD 2.0: Установка и конфигурирование LXD [2/12].
Следующая статья LXD 2.0: Контроль ресурсов [4/12].

Дата последней правки: 2023-12-27 16:57:36

RSS vasilisc.com   


Разделы

Главная
Новости
Ворох бумаг
Видео Linux
Игры в Linux
Безопасность
Статьи об Astra Linux
Статьи о FreeBSD
Статьи об Ubuntu
Статьи о Snappy
Статьи об Ubuntu Phone
Статьи о Kubuntu
Статьи о Xubuntu
Статьи о Lubuntu
Статьи об Open Source
Карта сайта