Разработкой LXC занимается компания Canonical, последняя версия LXC 4.0.10 вышла совсем недавно в июле 2021, а началась в 2008.

В чем разница LXC и Docker:

  • Docker - это контейнер для упаковки одного процесса или службы;
    на практике Docker это пачка легких контейнеров для упаковки одного веб-сервиса;

  • LXC - это легкий контейнер на один веб-сервис или сайт, включающий все службы, которые нужны для его функционирования.

В каких случаях удобно применять LXC:

  • Legacy: у вас уже есть веб-сервис/сайт размещенный на выделенном сервере и нужно упаковать его в форме контейнера, который можно отдать разработчикам, либо перенести на другой сервер (резервный или stage);

  • Вам нравится работать в окружении, где все службы собраны в одном контейнере;

  • Нужна изоляция на сервере чтобы каждый веб-сервис находился в своем контейнере, но при этом не терять производительность как в случае с виртуальными машинами;

  • Если вы умеете настраивать основные сервисы в Linux, значит вы сможете создать LXC контейнер под ваш проект. LXC очень похож на обычную виртуалку.

Наш опыт и небольшая победа над Legacy

Преобразовать наш существующий массивный веб-проект в форме LXC-контейнера оказалось проще в форме LXC.

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

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

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

Как побочный эффект, получили:

  • способ развернуть stage-окружение для тестирования;

  • живую резервную копию сервера, куда настроили репликацию БД и синхронизацию файлов;

  • легкий переезд на другой сервер, когда понадобилось переехать в другой дата-центр.


Порог вхождения отсутствует

Чтобы настроить окружение под веб-проект из нескольких служб (mysql, nginx, php-fpm, memcached, postfix) дополнительных знаний не требуется. Видео-демонстрация: как создать контейнер установить nginx и php-fpm за несколько минут.

Все что нужно знать уместится в этот пост:

Установка LXC под Ubuntu: apt install lxc

# 1. создать контейнер с именем myapp
sudo lxc-create -t download -n myapp -- -d ubuntu -r focal -a amd64

# 2. посмотреть список контейнеров
sudo lxc-ls -f

# 3. запустить контейнер
sudo lxc-start myapp

# 4. остановить
sudo lxc-stop myapp

# 5. зайти в shell контейнера
sudo lxc-attach myapp

# 6. посмотреть файловую систему контейнера
ls -al /var/lib/lxc/myapp/rootfs

Для разработки каталог с исходными файлами проекта пробрасываем с хоста в контейнер.

Как пробросить (и особенность настройки прав)

Конфигурируется это через файл настроек: /var/lib/lxc/myapp/config

# Добавляем строку
# монтируем директорию хоста /home/user1/myapp в контейнер /var/www/myapp
lxc.mount.entry = /home/user1/myapp var/www/myapp none bind,create=dir,rw 0 0

Права для рабочей директории

Бывают трудности, когда uid и gid пользователя не совпадают на хосте и в контейнере.
Когда какой-то файл создается в пробрасываемой директории контейнера, скажем от пользователя ubuntu с uid=1000, а у вас на хосте uid=1002, то файл будет не доступен на редактирование.

Рекомендую после создания контейнера создать пользователя в контейнере с таким же uid и gid, как и в вашей хост системе:

# Выполнить команду id, посмотреть свой uid и gid
$ id
uid=1002(user1) gid=1002(user1) группы=1002(user1),27(sudo),130(docker)

# Настроить аналогичного пользователя в myapp,
# перейти в контейнер
sudo lxc-attach myapp 
userdel -r ubuntu
groupadd -g 1002 user1
useradd -s /bin/bash --gid 1002 -G sudo --uid 1002 -m user1

Резюме по LXC

  • Низкий порог вхождения: можно создать свой контейнер за минуты;

  • хорошо подходит для упаковки существующих проектов и для legacy;

  • если нужно посмотреть чей-то веб проект, установить определенные версии mysql/nginx или другие программы, при этом не затрагивая основную систему;

  • он легок, экономит время при отладке и настройке;

  • проверено работает при наличии sudo, хотя фича unprivileged контейнеров есть;

  • классно сочетается с zfs, в этом случае получаем мгновенные снэпшоты и дополнительную надежность.

Когда Docker может быть лучше

  • Вам нужен IaC. Dockerfile это отраслевой стандарт.
    В LXC похожее отсутствует. Концепция Infrastructiure as Code мне очень близка, я попробовал создать shell-скрипт который является аналогом Dockerfile чтобы воспроизводит LAMP окружение на LXC, но с помощью скрипта не обновить одной командой продакшен.

  • Если нужен готовый публичный образ какой-то программы или опубликовать свой образ.

Комментарии (9)


  1. Zezst
    03.08.2021 10:41

    1. agorlov Автор
      03.08.2021 11:32

      Ссылка почему-то не кликается. Но если говорить о LXD, то тоже его пробовали. И был когнитивный диссонанс. Потому что два очень похожих продукта, и самое путающиее, у LXC команды начинаются на ``lxc-...`` у второго (LXD) команды начинаются тоже на ``lxc команда``

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

      В LXD есть еще дополнительный демон для управления контейнерами с REST API. Идея в том чтобы управлять контейнерами на многих машинах.


      1. divanikus
        03.08.2021 12:39
        +1

        Зря вы так, там порог вхождения не особо выше чем у LXC, просто обертка над ним и не более. LXC использую в продакшене с 2016-го, LXD с 2019-го.


      1. Ru6aKa
        03.08.2021 14:54
        +2

        LXD это аналог libvirt, но попроще. LXD умеет управлять не только LXC контейнерами, но и виртуальными машинами qemu, и делает это очень неплохо. И образы для виртуальных машин очень хорошего качества, с cloud-init.

        Так же есть lxd провайдеры для terraform и vagrаnt.


    1. permeakra
      03.08.2021 13:59

      По личному опыту

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


  1. Ru6aKa
    03.08.2021 12:03
    +3

    Если вам надо IaC, то можно использовать terraform или vagrant с провайдером lxc, и не заниматься написанием shell-скриптов.


    1. agorlov Автор
      03.08.2021 16:25

      Спасибо за рекомендацию, посмотрю


  1. ex_ineris
    03.08.2021 13:01

    Terraform можно использовать для автоматизации.


  1. Keroosha
    05.08.2021 11:22
    +2

    Для упрощения развертки нового окружения и достижения воспроизводимости можно воспользоваться пакетным менеджером Nix из NixOS (Его порты есть почти для любого Linux дистрибутива)

    Достаточно описать конфигурацию системы с пакетами и настройками для системы и раскатывать/откатывать окружение одной командой.

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

    Будет всяко удобнее чем на bash мучаться