Третья статья из цикла статей про LXD от Стефана Грабера (Stéphane Graber). Научимся создавать и манипулировать своим первым контейнером.
Так как существует много команд для управления контейнерами LXD, то данный пост будет большим. Если вы предпочитаете быстрый тур "шаг за шагом", то лучше попробовать онлайн тур.
Как было указано в предыдущих статьях, клиент командной строки идёт с преднастроенными источниками образов (image). Официальные Ubuntu образы всех релизов и архитектур присутствуют там, но так же есть неофициальные образы других дистрибутивов. Их создаёт сообщество и поддерживаются мантейнерами upstream проекта.
Если вы просто хотите поддерживаемый релиз Убунту, то командуйте lxc launch ubuntu:
Заметьте, что при выходе новых релизов смысл вашей команды будет меняться. При использовании команды в сценариях вы будете ставить актуальный релиз.
Чтобы получить последний, протестированный, стабильный образ 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 доступны через "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)
Команды очевидны для большинства известных вам менеджеров виртуальных машин и контейнеров, но они будут описаны. Команды принимают множество имён контейнеров для пакетной обработки.
lxc start имя-контейнера
lxc stop имя-контейнера
lxc stop имя-контейнера --force
lxc restart имя-контейнера
lxc restart имя-контейнера --force
lxc pause имя-контейнера
lxc delete имя-контейнера
lxc delete имя-контейнера --force
LXD управляет множеством настроек контейнера, включая ограничения ресурсов, контроль старта контейнера и параметры проброса устройства из хоста в контейнер. Полный список очень большой и доступен в разделе Configuration.
Что касается устройств, LXD поддерживает следующие типы:
Список доступных профилей можно получить командой 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
Команда полезна для проверки, что на самом деле в итоге будет применено к данному контейнеру.
Обратите внимание, что все конфигурационные параметры и устройства могут быть применены к контейнеру "на лету". Вы можете добавлять или удалять устройства, изменять профиля безопасности БЕЗ необходимости перезагружать контейнер.
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].
Главная
Новости
Ворох бумаг
Видео Linux
Игры в Linux
Безопасность
Статьи об Astra Linux
Статьи о FreeBSD
Статьи об Ubuntu
Статьи о Snappy
Статьи об Ubuntu Phone
Статьи о Kubuntu
Статьи о Xubuntu
Статьи о Lubuntu
Статьи об Open Source
Карта сайта
1С под Linux. Ускорение Ubuntu. 21 пример iptables. Цикл статей о Ceph. Убунту в дикой среде. Ubuntu Linux на SSD. Ubuntu для блондинок. Поддержка железа в Linux. BTSync на службе у админа. Андроид программы в Ubuntu. Прокидывание портов для p2p. Анти СПАМ в Postfix. Узнайте больше про haval здесь.