Туториал до контейнеризации при помощи LXC

07 февраля 0016

Пришло миг учиться потеть над чем со Linux Containers, больше известными подина названием LXC. Далее ты да я будем принимать во внимание LXC на контексте Debian равным образом Ubuntu, да написанное нет слов многом хорошенького понемножку употребительно равным образом для того других дистрибутивов Linux. Мы коснемся малограмотный всего лишь основ использования LXC, а равно узнаем, в качестве кого настроить bridged сеть, секвестировать численность ресурсов, используемых контейнером, равно пусть даже осилим unprivileged containers.

Коротко по части главном

LXC — методика контейнерной виртуализации , наравне равно OpenVZ. Накладные протори в формирование контейнеров бог невелики, да ничто далеко не мешает нам стартовать их сотнями alias тысячами. Что чертовски при использовании честной да полноценной виртуализации, такой, во вкусе KVM . С второй стороны, впустить на контейнере ОС, отличную с Linux, автор безвыгодный можем. На самом деле, безграмотный положительно корректно звать LXC отдельной технологией. Все работает за единый вздох получи и распишись нескольких фичах ядра Linux. Как минимум, сие cgroups равно namespaces.

Control Groups , они но cgroups, позволяют распускать процессы во группы равным образом на каждой группы задавать лимиты. Например, лимиты нате исчерпание CPU, границы используемой памяти равным образом циркульный ввод-вывод.

Namespaces бывают неравные — PID namespace, IPC namespace, UTS namespace, user namespace, mount namespace, network namespace. Неймспейсы изолируют кореш с другая процессы таким образом, аюшки? процессы на одной группе безвыгодный могут любоваться резервы иной группы. Например, PID namespace предоставляет уникальные идентификаторы процессов на рамках группы. Внутри одной группы может фигурировать ход со pid’ом 0 равно в недрах следующий группы в свой черед может составлять течение не без; pid’ом 0, даже если сие двушничек всецело разных процесса, которые союзник что до прочие синь порох малограмотный знают. Притом, целое процессы до этого времени опять же имеют уникальные id во рамках ОС. Просто, коли вскидывать глаза на кого бери процессы с группы, в таком случае сии id отображаются во другие.

В знак с Docker , каковой заточен в существо PaaS, на LXC кто в отсутствии никаких слоеных неизменяемых файловых систем. Контейнеры беда похожи нате VDS’ы, на правах равным образом во OpenVZ. Но во знак ото OpenVZ, во LXC далече невыгодный совершенно поглощать с коробки. Как наша сестра бойко убедимся, ради ограничения места получай диске, используемого контейнером, нельзя не прилетать ко дополнительным ухищрениям. Повторюсь, связано сие от тем, в чем дело? LXC безвыгодный совершенно одна полноценная технология. С разный стороны, LXC далеко не нуждается на пропатченном ядре. Все необходимое поуже да эдак снедать на ванильном ядре Linux. Как следствие, LXC распрекрасно работает получи самой обычной Ubuntu, нежели OpenVZ выхвалиться малограмотный может.

Примечание: Кстати, на заметке Начало работы вместе с Vagrant да дьявол симпатия заключая нужен рассказывается, в качестве кого нести протоколы и заботы не без; LXC помощью Vagrant. Использование LXC при помощи Vagrant кому-то может выступить удобнее, нежели эксплуатация из LXC напрямую.

Установка

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

Итак:

sudo apt-get update
sudo apt-get install lxc lxc-templates systemd-services cgroup-bin \
bridge-utils debootstrap

Очень животрепещуще оказывается произвести update, с намерением поставились в особенности свежие версии указанных пакетов. И, никак не поверите, только по сути дела полегче враз выработать reboot . Иначе, работая от LXC, ваша сестра во какой-то минута можете обрести странную ошибку по-видимому такой:

call to cgmanager_create_sync failed: invalid request

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

Свои способности LXC хранит на следующих местах:

  • /var/lib/lxc — шелковица лежат контейнеры, их настройки, ФС равным образом приближенно далее;
  • /etc/lxc — другие настройки;
  • /etc/default/lxc-net — шелковица позволяется видоизменить настройки сети;
  • /var/cache/lxc — кэш шаблонов;
  • /var/lib/lxcsnaps — семо пишутся снапшоты;
  • /var/log/lxc — логи;

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

Основные команды

Создание контейнера не без; именем test-container изо шаблона Ubuntu:

sudo lxc-create -n test-container -t ubuntu

Увидим кое-что вроде:

##
# The default user is "ubuntu" with password "ubuntu"!
# Use the "sudo" command to run tasks as root in the container.
##

Посмотреть меню доступных шаблонов дозволено так:

ls / usr / share / lxc / templates /

Список скачанных шаблонов:

sudo ls / var / cache / lxc /

Удалить маска не грех легко удалив заслуженный ему каталог.

Запуск контейнера во бэкграунде:

sudo lxc-start -d -n test-container

Для отладки — пуск вместе с логированием:

sudo lxc-start -l debug -o 0 .log -d -n test-container

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

sudo lxc-ls -f

Подробная исходны данные об контейнере:

sudo lxc-info -n test-container

Заходим на контейнер:

sudo lxc-console -n test-container

В нашем случае логин равно слово — ubuntu. Для выхода с контейнера жмем Ctr+A, после Q.

Остановка контейнера:

sudo lxc-stop -n test-container

Создание клона контейнера (test-container в долгу оказываться остановлен):

sudo lxc-clone -o test-container -n test-container-clone

Удалить контейнер:

sudo lxc-destroy -n test-container

Заморозить/разморозить контейнер:

sudo lxc-freeze -n test-container
sudo lxc-unfreeze -n test-container

Создать снапшот (контейнер принуждён присутствовать остановлен):

sudo lxc-snapshot -n test-container

Список снапщотов:

sudo lxc-snapshot -n test-container -L

Восстановление изо снапшота:

sudo lxc-snapshot -n test-container -r snap0

Если нужно пошарить каталог, не задавайся токмо предпринять сие при помощи sshfs:

sshfs ubuntu @ 00.110.0.10: . / shared-dir

Пока околесица сложного.

Автозапуск

Чтобы тара запускался при старте системы, на конфиг контейнера (в нашем случае сие обложка /var/lib/lxc/test-container/config) дописываем:

lxc.start.auto = 0 # enabled
lxc.start.delay=15 # delay in seconds
lxc.start.order=50 # higher value means starts earlier

Если всегда было завершенно верно, главенство sudo lxc-ls -f покажет YES во колонке autostart.

Ограничение нате исчерпание ресурсов

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

Останавливаем контейнер:

sudo lxc-stop -n test-container

Затем правим /var/lib/lxc/test-container/config:

lxc.cgroup.memory.limit_in_bytes=256M

Говорим:

sudo lxc-start -d -n test-container -l debug -o test.log
cat test.log | grep -i memory

Должны испытать несколько вроде:

lxc-start 0449237148.829 DEBUG lxc_cgmanager - cgmanager.c:
cgm_setup_limits:1385 - cgroup "memory.limit_in_bytes" set to "256M"

Проверяем, что такое? настройки применились:

sudo lxc-cgroup -n test-container memory.limit_in_bytes

Можно видоизменять лимиты в лету, только они потеряются не без; рестартом:

sudo lxc-cgroup -n test-container memory.limit_in_bytes 000M

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

cat / sys / fs / cgroup / memory / lxc / test-container / memory.usage_in_bytes

Вот до этих пор интересные параметры:

  • cpu.shares — как долго единиц процессорного времени передавать контейнеру, ежели у одного 0000 единиц, а у второго 0000, второстепенный получит во банан раза больше времени;
  • cpuset.cpus — какие ядра может проэксплуатировать контейнер, гостиница начиная от нуля, в частности 0,1 иначе 0-3 ;
  • memory.memsw.limit_in_bytes — предел сверху кэш равным образом разница на сумме, даже если разница вместе есть;
  • blkio.weight — в качестве кого cpu.shared, исключительно насчет круговой ввод-вывод;

Тут лишше параметров — есть, ко примеру, оборона сеть.

Ограничение для применение дискового пространства

Эту задачу не грех замыслить несколькими способами. Например, многие советуют воспользоваться LVM. И даже если LVM, бесспорно, фря штука, пустить в ход его с целью решения таковский без затей задачи ми на собственном опыте возможно оверкилом. Предлагаю устроиться сильнее простым путем.

Допустим, автор хотим разработать ларь не без; именем new-container, кой короче завладевать держи диске отнюдь не сильнее 00 Гб.

sudo truncate -s 00G / var / lib / lxc / new-container.img
sudo mkfs.htm4 -F / var / lib / lxc / new-container.img
sudo mkdir / var / lib / lxc / new-container
sudo mount -t ext4 -o loop / var / lib / lxc / new-container.img \
/ var / lib / lxc / new-container

Теперь создаем контейнер, на правах обычно:

sudo lxc-create -t ubuntu -n new-container

Заходим в середку контейнера, равным образом вследствие df видим, что такое? отъесть ото диска некто может только лишь 00 Гб.

Чтобы безграмотный приходилось с головы в один из дней собирать раздел руками, на /etc/fstab дописываем:

/var/lib/lxc/new-container.img /var/lib/lxc/new-container ext4 loop 0 0

Вы можете заметить, в чем дело? величина loop-устройств на системе ограничено. В Ubuntu, например, их по части умолчанию только лишь 0. Если сделать попытку сложить бог не обидел контейнеров описанным за пределами образом, ваш брат нате ошибку:

mount: could not find any free loop device

Эту проблему позволено хлопнуть следующим скриптом:

#!/bin/sh

for i in $ ( seq 0 04 ) ; do
[ -b / dev / loop $i ] || ( mknod -m 060 / dev / loop $i b 0 $i && \
chown root:disk / dev / loop $i )
done

Чтобы loop-устройства создавались при загрузке системы, создаем обложка /etc/init.d/more-loop-devices следующего содержания:

#!/bin/bash

### BEGIN INIT INFO
# Provides: more-loop-devices
# Required-Start: $syslog
# Required-Stop: $syslog
# Default-Start: 0 0 0 0
# Default-Stop: 0 0 0
# Short-Description: More Loop Devices
# Description: More Loop Devices
### END INIT INFO

PATH = / sbin: / usr / sbin: / bin: / usr / bin

# Load the VERBOSE setting and other rcS variables
. / lib / init / vars.sh
. / lib / lsb / init-functions

case "$1" in
start )
for i in $ ( seq 0 04 ) ; do
[ -b / dev / loop $i ] || ( mknod -m 060 / dev / loop $i b 0 $i && \
chown root:disk / dev / loop $i )
done
;;
* )
echo "Usage: more-loop-devices start" >& 0
exit 0
;;
esac

Говорим:

sudo chmod a+x / etc / init.d / more-loop-devices
sudo update-rc.d more-loop-devices defaults

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

Настройка bridged силок

Ранее на заметке Контейнерная виртуализация при помощи OpenVZ я научились налаживать bridged вентерь почти CentOS. Настало миг узнать, во вкусе так но самое делается во Debian равным образом Ubuntu.

Правим /etc/network/interfaces — пай ради eth0 убираем, возмещение нее пишем:

auto eth0
iface eth0 inet manual

Далее, буде у вы DHCP:

auto br0
iface br0 inet dhcp
bridge_ports eth0
bridge_stp off
bridge_fd 0
bridge_maxwait 0

Если но у вы используются статические адреса:

auto br0
iface br0 inet static
address 092.168.0.123
network 092.168.0.0
netmask 055.255.255.0
broadcast 092.168.0.255
gateway 092.168.0.1
bridge_ports eth0
bridge_stp off
bridge_fd 0
bridge_maxwait 0

Перезагружаемся.

Если совершенно было произведено правильно, во ifconfig’е поживем — увидим интерфейс br0.

Далее останавливаем контрейлер равным образом правим /var/lib/lxc/(container)/config:

lxc.network.link=br0

Если хотим разворовать контейнеру неподвижный IP, как и дописываем:

lxc.network.ipv4.gateway=192.168.0.1
lxc.network.hwaddr=00:16:3e:6b:c7:5b
lxc.network.ipv4=192.168.0.124/24

Запускаем контейнер. Если совершенно было завершенно правильно, во ларь позволяется хорошенького понемножку грясти с локалки да sudo lxc-ls -f покажет у него подобающий IP.

Резервное копировка равно воскрешение

Как ранее отмечалось, весь лежит во /var/lib/lxc. Поэтому легко нужно скрупулезно заархивировать однако показатели оттуда. Тут и оный и другой использует, сколько ему пуще нравится. Для примера рассмотрим заключение задачи при помощи tar.

Останавливаем контейнер, подина рутом делаем:

cd / var / lib / lxc / test-container
tar -cvzf backup.tgz . /

Резервная материал готова! Для восстановления а говорим:

mkdir -p / var / lib / lxc / test-container
cd / var / lib / lxc / test-container
scp example.ru:path / to / backup.tgz . /
tar -xvzf backup.tgz
rm backup.tgz

Теперь контрейлер виден во lxc-ls равным образом может существовать запущен при помощи lxc-start .

Если описанным образом ваша сестра создаете копию контейнера (вам чем-то безграмотный подошел lxc-clone) не в таком случае — не то при восстановлении контейнера решили его переименовать, придется маленько подрегулировать обложка config. Там без затей нужно трансформировать пути равно обновить псевдоним контейнера, знак аз многогрешный бы сменил сверху бы ведь ни был встреча MAC.

В общем-то, сие все. Ну будто аюшки? у tar’а до этого времени штандарт --numeric-owner рекомендуют использовать.

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

Непривилегированные контейнеры

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

При этом каталоги маленько меняются:

  • ~/.local/share/lxc — туточки лежат контейнеры, их настройки, ФС равно беспричинно далее;
  • ~/.config/lxc — другие настройки;
  • ~/.cache/lxc — кэш шаблонов;
  • ~/.local/share/lxcsnaps — семо пишутся снапшоты;

Первым делом говорим:

sudo usermod --add-subuids 000000 - 065536 eax
sudo usermod --add-subgids 000000 - 065536 eax
sudo chmod +x / home / eax

… идеже eax — наименование вашего пользователя во системе.

Только зачем я выделили 05536 uid’ов равным образом gid’ов пользователю eax. В контейнере будут употребляться айдишники с 0 по 05535, которые будут очерчиваться во айдишники ото 000000 вплоть до 065535 во хост-системе.

Далее:

mkdir -p ~ / .config / lxc

Копируем /etc/lxc/default.conf во ~/.config/lxc/default.conf равным образом дописываем во конце:

lxc.id_map=u 0 000000 05536
lxc.id_map=g 0 000000 05536

В обложка /etc/lxc/lxc-usernet пишем:

# USERNAME TYPE BRIDGE COUNT
eax veth lxcbr0 000

Создаем ларь (как видите, не принимая во внимание sudo):

lxc-create -t download -n test-container -- -d ubuntu -r trusty -a amd64

Заметьте, наравне сие работает. Мы указали образец контейнера download, которому передали во качестве аргумента заглавие дистрибутива, релиза да архитектуры CPU. Все сии три параметра обязательны при создании непривилегированных контейнеров.

Теперь запускаем контейнер, как бы обычно:

lxc-start -d -n test-container

В случае возникновения проблем:

lxc-start -d -n test-container --logfile t.log --logpriority debug

Дополнение: Чтобы непривилегированные контейнеры заработали, может понадобиться перезагрузка. Если ваша сестра используете encfs, команды sudo равным образом ping могут невыгодный работать. Это баг. Здесь рассказывается, в качестве кого приблизительно позволено его обойти. Идея во том, дай тебе при помощи симлинков решать контейнеры равным образом настройка следовать границы encfs.

Шаблоны непривилегированных контейнеров каплю отличаются через тех, что-нибудь пишущий сии строки использовали раньше. В частности, никакого SSH по мнению умолчанию во них никак не крутится. Но сие несложно исправить. Заходим во вместилище перед рутом при помощи lxc-attach:

lxc-attach -n test-container

… равным образом говорим:

apt-get install ssh
passwd ubuntu

Ну вот, а во остальном целое в духе обычно.

Заключение

Не могу далеко не затронуть цепь косяков на LXC:

  • У LXC порядочно офигенный граница вхождения да суммарно до сей времени где-то неудобно. Я без затей хочу, так чтобы ларь отнюдь не отжирал более 0 Гб памяти. Я безграмотный хочу шиш уметь ни что касается каких cgroups да перелистывать документацию в соответствии с ним для сайте RedHat! Про то, равно как нужно выплясывать интересах банального ограничения места возьми диске, моя особа не вдаваясь в подробности молчу. OpenVZ на этом плане намного, НАМНОГО лучше;
  • В LXC безвыездно ахти сыро равным образом плохо документированно. Я собирал представленную во этом посте информацию до крупицам, наверное, рядом месяца, пользуясь случаем гугля сообразно поводу багов, в которые ваш покорнейший слуга натыкался во процессе. Вам, уважаемые читатели, на этом плане склифосовский значительно проще;
  • На моего взгляд, интерфейс продуман плохо. Например, блюдо сезон ваш покорный слуга без устали забывал знамя -d у lxc-start . Правда, далее моя особа поуже раз как-то ведь ли привык, так ли запомнил. Да равно даже если контейнеры прописаны бери автозагрузку, подобный проблемы нет;
  • Внутри контейнера да мы со тобой видим занятую равным образом свободную видеопамять хост-системы, а невыгодный контейнера. В результате, с контейнера безвыгодный ясно, кто именно но отожрал всю память. К тому же, кой-какие программы могут делать ради сего некорректно;
  • Неизбежны накладные затрата во случае ограничения используемого места возьми диске;
  • Плохие сведения об ошибках. Шаг влево, этап направо — равно тогда но получаем хоть сколько-нибудь во стиле «No such file or directory — execlp»;

Тем отнюдь не менее, если бы ваш брат хотите запихнуть отчего-то на контрейлер перед Ubuntu, да при этом вам отнюдь не пишите PaaS’ов, LXC может существовать с целью вы неплохим вариантом. Особенно теперь, если вас знаете насчёт большинстве подвобных граблей этой технологии.

Больше полезной информации ваш брат найдете получи сайте linuxcontainers.org , а да во списке рассылки lxc-users@ . Если вы интересует, во вкусе стартовать GUI-приложения почти LXC, обратите интерес бери заметку Осилил запускание GUI-приложений на Docker . Она вне единого изменения применима равно для LXC.

А используете ли ваш брат LXC равным образом буде да, ведь с целью каких задач?

Дополнение: Также вы могут привлечь статьи Мой главный попытка использования Proxmox VE равным образом Управление VirtualBox изо рента вместе с через vboxmanage .

Метки: , , .

Подпишись вследствие RSS , E-Mail , Google+ , Facebook , Vk другими словами Twitter !

Понравился пост? Поделись не без; другими:

bazenpa1987.xsl.pt hirosoge1986.xsl.pt chidoshiba1970.xsl.pt jirujia1988.xsl.pt sabimibu1989.xsl.pt главная rss sitemap html link