Как настроить и использовать LXD в Ubuntu 16.04

Вступление

Https://linuxcontainers.org/[Linux container] - это группа процессов, которая изолирована от остальной системы посредством использования функций безопасности ядра Linux, таких как пространства имен и группы управления. Это конструкция, похожая на виртуальную машину, но гораздо более легкая; у вас нет лишних затрат на запуск дополнительного ядра или моделирование аппаратного обеспечения. Это означает, что вы можете легко создать несколько контейнеров на одном сервере.

Например, представьте, что у вас есть сервер, на котором работают несколько веб-сайтов для ваших клиентов. В традиционной установке каждый веб-сайт будет виртуальным хостом одного и того же экземпляра веб-сервера Apache или Nginx. Но с контейнерами Linux каждый веб-сайт может быть настроен в своем собственном контейнере со своим собственным веб-сервером. Используя контейнеры Linux, вы упаковываете свое приложение и его зависимости в контейнер, не затрагивая остальную часть системы.

LXD позволяет создавать и управлять этими контейнерами. LXD предоставляет сервис гипервизора для управления всем жизненным циклом контейнеров. В этом руководстве вы сконфигурируете LXD и будете использовать его для запуска Nginx в контейнере. Затем вы направите трафик в контейнер, чтобы сделать веб-сайт доступным из Интернета.

Предпосылки

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

  • Один сервер Ubuntu 16.04, сконфигурированный с помощью учебного руководства Initial Server Setup с Ubuntu 16.04, с sudo non -руткит и брандмауэр.

  • При желании добавьте 20 ГБ или более блочного хранилища, следуя учебному руководству Getting Started with DigitalOcean Block Storage. Вы можете использовать это для хранения всех данных, связанных с контейнерами.

Шаг 1 - Настройка LXD

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

Войдите на сервер, используя учетную запись пользователя без полномочий root. Затем добавьте своего пользователя в группу + lxd +, чтобы вы могли использовать его для выполнения всех задач управления контейнерами:

sudo usermod --append --groups lxd

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

Теперь настройте бэкэнд хранилища. Рекомендованным внутренним хранилищем для LXD является файловая система ZFS, которая хранится либо в предварительно выделенном файле, либо с помощью Block Storage. Чтобы использовать поддержку ZFS в LXD, обновите список пакетов и установите пакет + zfsutils-linux +:

sudo apt-get update
sudo apt-get install zfsutils-linux

Теперь вы можете настроить LXD. Запустите процесс инициализации LXD командой + lxd init +:

sudo lxd init

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

Сначала вас спросят, хотите ли вы настроить новый пул хранения. Вы должны ответить + да. +.

Do you want to configure a new storage pool (yes/no) [default=yes]?

Затем вам будет предложено указать серверную часть хранилища, и вам будет предложено два варианта: + dir + или + zfs +. Опция + dir + указывает LXD хранить контейнеры в каталогах файловой системы сервера. Опция + zfs + использует комбинированную файловую систему ZFS и менеджер логических томов.

Мы будем использовать опцию + zfs +. Используя + zfs +, мы получаем как эффективность хранения, так и лучшую скорость отклика. Например, если мы создадим десять контейнеров из одного и того же начального образа контейнера, все они будут использовать дисковое пространство только одного образа контейнера. С этого момента только их изменения в исходном образе контейнера будут храниться в бэкэнде хранилища.

OutputName of the storage backend to use (dir or zfs) [default=zfs]:

Как только вы выберете + zfs +, вам будет предложено создать новый пул ZFS и назвать его. Выберите + yes + для создания пула и вызовите пул + lxd +:

OutputCreate a new ZFS pool (yes/no) [default=yes]?
Name of the new ZFS pool [default=lxd]:

Затем вас спросят, хотите ли вы использовать существующее блочное устройство:

OutputWould you like to use an existing block device (yes/no) [default=no]?

Если вы скажете + yes +, вам придется сообщить LXD, где найти это устройство. Если вы скажете + no +, LXD будет использовать предварительно выделенный файл. С помощью этой опции вы будете использовать свободное место на самом сервере.

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

Вариант 1 - Использование предварительно выделенного файла

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

Сначала, когда вас попросят использовать существующее блочное устройство, введите + no +:

OutputWould you like to use an existing block device (yes/no) [default=no]?

Далее вам будет предложено указать размер * loop device *, который LXD называет предварительно выделенным файлом. + Используйте предложенный размер по умолчанию для предварительно выделенного файла:

OutputSize in GB of the new loop device (1GB minimum) [default=15]:

Как правило, 15 ГБ - это самый маленький размер, который вы должны создать; Вы хотите предварительно выделить достаточно места, чтобы после создания контейнеров у вас оставалось не менее 10 ГБ свободного места.

После настройки устройства вам будет предложено настроить параметры сети. Перейдите по ссылке: # step-2-% E2% 80% 94-configuring-network [Шаг 2], чтобы продолжить настройку.

Вариант 2 - Использование блочного устройства

Если вы собираетесь использовать Block Storage в качестве бэкэнда хранилища, вам нужно найти устройство, которое указывает на том Block Storage, который вы создали, чтобы указать его в конфигурации LXD. Перейдите на вкладку * Volumes * на https://cloud.digitalocean.com [панель управления DigitalOcean], найдите свой том, нажмите на всплывающее окно * More *, а затем нажмите * Инструкции по настройке *.

Найдите устройство, посмотрев на команду для форматирования тома. В частности, ищите путь, указанный в команде + sudo mkfs.ext4 -F +. Не запускайте никакие команды с этой страницы, так как нам просто нужно найти правильное имя устройства для LXD. На следующем рисунке показан пример имени устройства тома. Вам нужна только та часть, которая подчеркнута красной линией:

image: https: //assets.digitalocean.com/articles/lxd_containers_ubuntu_1604/6rDyC1l.png [В инструкциях по настройке показано устройство для созданного блока Том хранения.]

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

ls -l
total 0
lrwxrwxrwx 1 root root  9 Sep  16 20:30  -> ../../sda

В этом случае имя устройства для тома равно + / dev / disk / by-id / scsi-0D0_Volume_volume-fra1-01 +, хотя ваше имя может отличаться.

Как только вы определите имя устройства для тома, продолжите установку LXD. Когда вам будет предложено использовать существующее блочное устройство, выберите + yes + и укажите путь к вашему устройству:

Output of the "lxd init" commandWould you like to use an existing block device (yes/no) [default=no]?
Path to the existing block device:

После того, как вы укажете диск, вас попросят настроить параметры сети.

Шаг 2 - Настройка сети

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

Сначала LXD спрашивает, хотите ли вы сделать его доступным по сети. Выбор + yes + позволит вам управлять LXD с локального компьютера без необходимости SSH к этому серверу. Оставьте значение по умолчанию + no +:

Output of the "lxd init" command - LXD over the networkWould you like LXD to be available over the network (yes/no) [default=no]?

Если вы хотите включить эту опцию, прочтите LXD 2.0: Удаленные хосты и контейнер миграция, чтобы узнать больше.

Затем нас просят настроить сетевой мост для контейнеров LXD. Это включает следующие функции:

  • Каждый контейнер автоматически получает частный IP-адрес.

  • Контейнеры могут связываться друг с другом через частную сеть.

  • Каждый контейнер может инициировать подключения к Интернету.

  • Созданные вами контейнеры остаются недоступными из Интернета; Вы не можете установить соединение из Интернета и получить доступ к контейнеру, если вы явно не включили его. На следующем шаге вы узнаете, как разрешить доступ к определенному контейнеру.

Когда вас попросят настроить мост LXD, выберите + yes +:

Output of the "lxd init" command - Networking for the containersDo you want to configure the LXD bridge (yes/no) [default=yes]?

Затем вы увидите следующий диалог:

изображение: https: //assets.digitalocean.com/articles/lxd_containers_ubuntu_1604/u9D79uB.png [Настройка сети LXD, мастер запуска конфигурации]

Подтвердите, что вы хотите настроить сетевой мост.

Вас попросят назвать мост. Примите значение по умолчанию.

Вам будет предложено выполнить настройку сети для IPv4 и IPv6. В этом уроке мы будем работать только с IPv4.

Когда появится запрос на настройку подсети IPv4, выберите «Да». Вы будете проинформированы о том, что для вас настроена произвольная подсеть. Выберите * Ok *, чтобы продолжить.

Когда будет предложено ввести действительный адрес IPv4, примите значение по умолчанию.

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

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

Выберите * Да * при запросе к NAT трафика IPv4.

Когда появится запрос на настройку подсети IPv6, выберите * Нет *. После завершения настройки сети вы увидите следующий вывод:

OutputWarning: Stopping lxd.service, but it can still be activated by:
 lxd.socket
LXD has been successfully configured.

Вы готовы создать свои контейнеры.

Шаг 3 - Создание контейнера Nginx

Вы успешно настроили LXD, и теперь вы готовы к созданию и управлению вашим первым контейнером. Вы управляете контейнерами с помощью команды + lxc +.

Используйте + lxc list + для просмотра доступных установленных контейнеров:

lxc list

Вы увидите следующий вывод:

Output of the "lxd list" commandGenerating a client certificate. This may take a minute...
If this is your first time using LXD, you should also run: sudo lxd init
To start your first container, try: lxc launch ubuntu:16.04

+------+-------+------+------+------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+------+-------+------+------+------+-----------+

Поскольку это первый раз, когда команда + lxc + связывается с гипервизором LXD, выходные данные позволяют вам узнать, что команда автоматически создала сертификат клиента для безопасного взаимодействия с LXD. Затем он показывает некоторую информацию о том, как запустить контейнер. Наконец, команда показывает пустой список контейнеров, что ожидается, так как мы еще не создали ни одного.

Давайте создадим контейнер, который запускает Nginx. Для этого мы будем использовать команду + lxc launch + для создания и запуска контейнера Ubuntu 16.04 с именем + webserver +.

Создайте контейнер + webserver +:

lxc launch ubuntu:x webserver

+ X + в + ubuntu: x + является сокращением для первой буквы Xenial, кодовое имя Ubuntu 16.04. + ubuntu: + - это идентификатор предварительно сконфигурированного хранилища образов LXD. Вы также можете использовать + ubuntu: 16.04 + для имени изображения.

Поскольку вы впервые создаете контейнер, эта команда загружает образ контейнера из Интернета и кэширует его локально, так что если вы создаете новый контейнер, он будет создан быстрее. Вы увидите этот вывод при создании вашего нового контейнера:

OutputGenerating a client certificate. This may take a minute...
If this is your first time using LXD, you should also run: sudo lxd init
To start your first container, try: lxc launch ubuntu:16.04

Creating webserver
Retrieving image: 100%
Starting webserver

Теперь, когда контейнер запущен, используйте команду + lxc list +, чтобы показать информацию о нем:

lxc list

Выходные данные показывают таблицу с именем каждого контейнера, его текущим состоянием, его IP-адресом, его типом и наличием снятых снимков.

Выход

+-----------+---------+-----------------------+------+------------+-----------+
|  NAME     |  STATE  |         IPV4          | IPV6 |    TYPE    | SNAPSHOTS |
+-----------+---------+-----------------------+------+------------+-----------+
| webserver | RUNNING |  (eth0)   |      | PERSISTENT | 0         |
+-----------+---------+-----------------------+------+------------+-----------+

Запомните адрес контейнера IPv4. Он понадобится вам для настройки брандмауэра, чтобы пропускать трафик из внешнего мира.

Теперь давайте настроим Nginx внутри контейнера:

Шаг 4 - Настройка контейнера Nginx

Давайте подключимся к контейнеру + webserver + и настроим веб-сервер.

Соединитесь с контейнером командой + lxc exec +, которая принимает имя контейнера и команды для выполнения:

lxc exec webserver -- sudo --login --user ubuntu

Первая строка + - + обозначает, что параметры команды для + lxc + должны остановиться на этом, а остальная часть строки будет передана как команда, которая будет выполнена внутри контейнера. Команда + sudo --login --user ubuntu +, которая обеспечивает оболочку входа для предварительно сконфигурированной учетной записи + ubuntu + внутри контейнера.

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

Outputubuntu@webserver:~$

Этот пользователь * ubuntu * в контейнере имеет предварительно настроенный доступ + sudo + и может запускать команды + sudo + без ввода пароля. Эта оболочка ограничена пределами контейнера. Все, что вы запускаете в этой оболочке, остается в контейнере и не может попасть на хост-сервер.

Давайте настроим Nginx в этом контейнере. Обновите список пакетов экземпляра Ubuntu внутри контейнера и установите Nginx:

sudo apt-get update
sudo apt-get install nginx

Затем отредактируйте веб-страницу по умолчанию для этого сайта и добавьте текст, который проясняет, что этот сайт размещен в контейнере + webserver +. Откройте файл + / var / www / html / index.nginx-debian.html:

sudo nano /var/www/html/index.nginx-debian.html

Сделайте следующее изменение в файле:

Отредактированный файл /var/www/html/index.nginx-debian.html

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx !</title>
<style>
   body {
       width: 35em;
       margin: 0 auto;
       font-family: Tahoma, Verdana, Arial, sans-serif;
   }
</style>
</head>
<body>
<h1>Welcome to nginx !</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
...

Мы отредактировали файл в двух местах и ​​специально добавили текст + на контейнерном веб-сервере LXD +. Сохраните файл и выйдите из редактора.

Теперь выйдите из контейнера и вернитесь обратно на хост-сервер:

logout

Используйте + curl +, чтобы проверить, что веб-сервер в контейнере работает. Вам понадобятся IP-адреса веб-контейнеров, которые вы нашли с помощью команды + lxd list + ранее.

curl http:///

Выход должен быть:

Output<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx !</title>
<style>
   body {
       width: 35em;
       margin: 0 auto;
       font-family: Tahoma, Verdana, Arial, sans-serif;
   }
</style>
</head>
<body>
<h1>Welcome to nginx !</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
...

Веб-сервер работает, но мы можем получить к нему доступ только через частный IP. Давайте перенаправим внешние запросы в этот контейнер, чтобы мир мог получить доступ к нашему веб-сайту.

Шаг 5 - Пересылка входящих соединений в контейнер Nginx

Последняя часть головоломки - подключение контейнера веб-сервера к Интернету. Nginx установлен в контейнере и по умолчанию недоступен из Интернета. Нам нужно настроить наш сервер так, чтобы он перенаправлял любые соединения, которые он может получать из Интернета через порт + 80 +, в контейнер + webserver +. Для этого мы создадим правило + iptables + для пересылки соединений. Вы можете узнать больше об IPTables в Wow IPtables Firewall Works и https://www.digitalocean.com/community/ tutorials / iptables-essentials-common-firewall-rules-and-commands [Основы IPtables: общие правила и команды брандмауэра].

Команде + iptables + требуется два IP-адреса: публичный IP-адрес сервера (`) и приватный IP-адрес контейнера `+ nginx +` (`), который вы можете получить с помощью ` + lxc list + `команда.

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

PORT= PUBLIC_IP= CONTAINER_IP= \
sudo -E bash -c 'iptables -t nat -I PREROUTING -i eth0 -p TCP -d $PUBLIC_IP --dport $PORT -j DNAT --to-destination $CONTAINER_IP:$PORT -m comment --comment "forward to the Nginx container"'

Вот как команда ломается:

  • + -t nat + указывает, что мы используем таблицу + nat + для трансляции адресов.

  • + -I PREROUTING + указывает, что мы добавляем правило в цепочку PREROUTING.

  • + -i eth0 + определяет интерфейс * eth0 *, который является общедоступным интерфейсом по умолчанию для Droplets.

  • + -p TCP + говорит, что мы используем протокол TCP.

  • + -d $ PUBLIC_IP + указывает IP-адрес назначения для правила.

  • + - dport $ PORT +: указывает порт назначения (например, + 80 +).

  • + -j DNAT + говорит, что мы хотим выполнить переход к месту назначения NAT (DNAT).

  • + - к месту назначения $ CONTAINER_IP: $ PORT + говорит, что мы хотим, чтобы запрос перешел на IP-адрес конкретного контейнера и порта назначения.

Вы можете перечислить правила IPTables, выполнив эту команду:

sudo iptables -t nat -L PREROUTING

Вы увидите вывод, похожий на этот:

Output Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DNAT       tcp  --  anywhere                    tcp dpt:http /* forward to this container */ to::80
...

Теперь проверьте, что веб-сервер действительно доступен из Интернета, используя его с локального компьютера с помощью команды + curl +, например:

curl --verbose  'http://'

Вы увидите заголовки, за которыми следует содержимое веб-страницы, которую вы создали в контейнере:

Output*   Trying ...
* Connected to  () port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.47.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: nginx/1.10.0 (Ubuntu)
...
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx !</title>
<style>
   body {
...

Это подтверждает, что запросы отправляются в контейнер.

Наконец, чтобы сохранить правило брандмауэра для повторного применения после перезагрузки, установите пакет + iptables-persistent +:

sudo apt-get install iptables-persistent

При установке пакета вам будет предложено сохранить текущие правила брандмауэра. Принять и сохранить все текущие правила.

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

Теперь, когда вы все настроили, давайте посмотрим, как все это разобрать.

Шаг 5 - Остановка и удаление контейнера

Вы можете решить, что хотите снять контейнер и заменить его. Давайте пройдемся по этому процессу:

Чтобы остановить контейнер, используйте + lxc stop +:

lxc stop

Используйте команду + lxc list + для проверки статуса.

Output+-----------+---------+------+------+------------+-----------+
|   NAME    |  STATE  | IPV4 | IPV6 |    TYPE    | SNAPSHOTS |
+-----------+---------+------+------+------------+-----------+
| webserver | STOPPED |      |      | PERSISTENT | 0         |
+-----------+---------+------+------+------------+-----------+

Чтобы удалить контейнер, используйте + lxc delete +:

lxc delete webserver

Запуск + lxc list + снова показывает, что контейнер не запущен:

Output+------+-------+------+------+------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+------+-------+------+------+------+-----------+

Используйте команду + lxc help +, чтобы увидеть дополнительные опции.

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

sudo iptables -t nat -L PREROUTING --line-numbers

Вы увидите свое правило с префиксом номера строки, например так:

OutputChain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination
   DNAT       tcp  --  anywhere                   tcp dpt:http /* forward to the Nginx container */ to:

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

sudo iptables -t nat -D PREROUTING

Убедитесь, что правило пропало, перечислив правила снова:

`sudo iptables -t nat -L PREROUTING --line-numbers`

Правило исчезнет:

OutputChain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination

Теперь сохраните изменения, чтобы правило не возвращалось при перезагрузке сервера:

sudo netfilter-persistent save

Теперь вы можете вызвать другой контейнер со своими настройками и добавить новое правило брандмауэра для пересылки трафика в него.

Заключение

Вы настроили веб-сайт, используя Nginx, работающий в контейнере LXD. Отсюда вы можете настроить больше веб-сайтов, каждый из которых ограничен собственным контейнером, и использовать обратный прокси-сервер для направления трафика в соответствующий контейнер. Обучающая программа How to Размещение нескольких веб-сайтов с Nginx и HAProxy Использование LXD в Ubuntu 16.04 поможет вам настроить это.

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

Для получения дополнительной информации о LXD см. Https://stgraber.org/2016/03/11/lxd-2-0-blog-post-series-012/[this серии сообщений в блоге на LXD 2.0], написанных сопровождающим LXD ,

Вы также можете зайти на try LXD online и следовать веб-учебнику для получения дополнительной практики.

Related