Данная инструкция содержит пошаговый алгоритм установки и настройки LXD. Инструкция рассматривает следующие темы: — Установка и запуск контейнера.
— Настройка сети.
— Настройка статических IP адресов для контейнеров.
— Настройка NAT и Iptables.
— Создание бэкапов и восстановление из них.
— Отличительные особенности от Docker. LXD — это гипервизор контейнеров, который базируется на LXС[1]. Основное отличие от LXC состоит в том, что LXD вводит понятия образа контейнера, и строит инфраструктуру вокруг этих двух понятий.  Проще говоря, LXD – это Docker для виртуальных ОС. Принцип такой же: образ ОС можно скачивать из репозиториев и разворачивать экземпляры на хосте как контейнеры. Один образ можно «клонировать» на несколько виртуальных машин.  Отличия от Docker: Другие возможности LXD: LXD на текущий момент нормально работает на Ubuntu 16.04 LTS. Можно запустить и на других системах, но могут возникнуть сложности или что-то будет работать не так как надо. К примеру, на Centos 7 контейнеры запускаются только в привилегированном режиме, отсутствуют готовые сборки lxd и нужно их компилировать вручную. В свежей Ubuntu версии, по умолчанию, уже встроен lxd. Если он не установлен, то поставить можно так: Обновите систему и установите необходимые для работы пакеты: Инициализацию LXD нужно делать до того как вы начнете пользоваться контейнерами. Перед тем как делать инициализацию нужно решить, какое backend хранилище будет использоваться. Backend хранилищ – это место, где находятся все контейнеры и образы. Выделяют два основных типов хранилища: ZFS и Dir.  ZFS монтируется в файл как loop device, поэтому нужно следить за размером хранилища и увеличивать место, если его мало осталось. ZFS имеет смысл использовать, если у вас есть приватное удаленное хранилище образов, куда вы отправляете, время от времени, снимки контейнеров в качестве бэкапов, а затем скачиваете их от туда для установки новых версий или для восстановления контейнеров из бэкапов. Я на продакшн сервер решил поставить Dir. ZFS протестирую у себя на локалке. Бэкапы буду делать обычными скриптами – упаковывать их в tar и отправлять их на Amazon S3. После того как вы решили какое backend хранилище использовать, начинайте процесс инициализации. Делается это командой: Утилита будет задавать вопросы, на которые вам нужно будет ответить. Первым вопросом утилита спросит: какой тип хранилища использовать? Если ваш ответ Dir, то утилита сразу перейдет к настройке сети. Если ваш ответ ZFS, то система будет задавать следующие вопросы: «Size in GB of the new loop device» — это размер хранилища ZFS. Все образы и контейнеры будут храниться в этом хранилище, поэтому если вы собираетесь хранить много образов или контейнеров, то нужно увеличить это число. Затем утилита спросит: нужно ли открывать доступ к LXD из вне? Отвечаем «нет». Если вы хотите создать публичный или приватный репозиторий, то нужно ответить «да». После настройки типа хранилища, утилита спросит: «Желаете ли вы сконфигурировать LXD bridge?». Отвечаем «да». Запуститься интерфейс настройки сети. Отвечайте на вопросы следующим образом: Для сети будет использоваться мост с интерфейсом lxdbr0.  Маска сети 10.200.0.0/16.
IP адрес хоста 10.200.0.1.
Автоматически DHCP будет раздавать IP для контейнеров с 10.200.100.1 по 10.200.255.254, но вручную можно установить, начиная с 10.200.0.2.
Протокол ip6 для контейнеров можно не включать. Запустить повторно утилиту настройки LXD bridge можно командой: Откройте файл: Раскоментируйте строчку LXC_DHCP_CONFILE и пропишите: Создайте файл настроек статических IP адресов: Пропишите статический IP адрес для тестового контейнера: В дальнейшем, в этот файл можно будет добавлять другие статические IP адреса для других контейнеров. После каждого изменения файла /etc/lxd-dnsmasq.conf нужно будет перезагружать lxd-bridge командой: Если это не помагает, то нужно остановить контейнеры с неверными IP, удалить файл dnsmasq.lxdbr0.leases, а затем перезагрузить lxd-bridge: Для того, чтобы заработал NAT, выполнив команды: Отредактируйте файл Поменяйте строчку Без этой строки у меня при запуске lxd выходил warning о том что cgroup swap account не будет работать. Я решил включить опцией swapaccount=1. quiet – это тихая загрузка системы (опционально) Перезагрузите Ubuntu: Добавьте репозиторий (опционально, по умолчанию images уже добавлен): Скачайте образ: centos-image – синоним образа, чтобы легче было к нему обращаться Запустите образ: test — название будущего контейнера Можно запускать образы в две команды: Первая команда создаст контейнер, а вторая его запустит. Первая команда полезна, если вы хотите просто создать контейнер, но не запускать его. Посмотрите статус запущенных контейнеров Команда должна показать следующую информацию: Обратите внимание, что LXD выдал статический IP для контейнера, который вы настроили в /etc/lxc-dnsmasq.conf Данная команда монтирует папку /data/test/folder в контейнер test в папку /folder Монтирование папок не изменяет содержимое папок /var/lib/lxd/containers/test, а монтируется в отдельную папку /var/lib/lxd/devices/test. Поэтому бэкапы и снимки контейнера не будут содержать примонтированные папки и файлы. Обновление контейнера из бэкапа или образа не будет затрагивать содержимое примонтированных папок. Просмотреть информацию о настройке можно через команду: Зайдите в запущенный контейнер test: Проверьте соединение: Вывод: Проверьте NAT: Вывод: Установите базовые пакеты: Установите пароль от рута Отключитесь от контейнера: Скопируйте ключ ssh хоста в контейнер Если Ubuntu ругается, что не может найти ключ, то сначала сгенерируйте ключ ssh, а затем скопируйте его командой ssh-copy-id. Если ключ скопировался успешно, то пропустите этот шаг (генерация ключа). Теперь вы можете заходить в контейнер через ssh без пароля (через сертификаты): Часто нужно получить возможность подключения через ssh к контейнеру напрямую, минуя хост (чтобы каждый раз не заходить на хост, чтобы перейти в контейнер). Для этого нужно выполнить команду: В Ubuntu по умолчанию iptables теряются после перезагрузки хост машины. Чтобы решить эту проблему нужно создать файл: Записать содержимое файла: Установить права на запуск: Сохранить текущие настройки: Перезагрузиться и попробовать подключиться в к контейнеру через ssh: Если использовать восстановление iptables при загрузке, то LXD будет добавлять свои команды в iptables, и в iptables будут содержаться дубликаты записей. К тому же на различных серверах требуется запретить входящие соединения и открыть только необходимые порты. Готовый листинг /etc/default/iptables, решающий две задачи сразу, представлен ниже: Данный метод создает бэкапы контейнеров как LXD образы, готовые к импорту. В идеале нужно создавать снимки и отправлять их в приватный репозиторий LXD. Но иногда, этого сделать нельзя. Например, у небольшой компании нет возможности покупать еще один сервер. В этом случае можно обойтись простым решением tar + Amazon S3.  Скачайте готовые скрипты для создания и восстановления бэкапов: Установите флаг выполнения для скриптов: Перед созданием и восстановлением бэкапов нужно остановить работающий контейнер. Можно, в принципе, делать бэкап на работающем контейнере, но при создании бэкапа возможна потеря некоторых данных (зависит от установленных программ в контейнере). Данная команда создаст бэкап контейнера test, сожмет файл в архив и сохранит его на диске в папке /backup/lxc/test: Восстановление бэкапа из снимка: Для ZFS после имени контейнера нужно добавлять «.zfs» Создание бэкапа: Восстановление бэкапа из снимка: На новом хосте иногда потребуется создать контейнер из бэкапа. Для этого нужно сначала импортировать образ, а затем его запустить как контейнер. Команда импорта бэкапа как образа LXD: Команда запуска образа как контейнера: Данная статья не рассматривает множество других вопросов, связанных с LXD. Дополнительную литературу о LXD можно почитать здесь: