Архив рубрики: LXC

Работа с LXC контейнерами

Расскажу про базовую настройку контейнера и о том как осуществляется работа с LXC контейнерами версии 3.0. Работа с LXC контейнером имеет некоторые нюансы, но в основном проблем с настройкой и обслуживанием нет.

Введение

В этой статье вы узнаете как произвести базовую настройку контейнера LXC c операционной системой CentOS 7. Расскажу про основные команды управления контейнерами, так же узнаете о способах резервного копирования и клонирования контейнера.

Базовая настройка контейнера LXC

Ранее я рассказывал как производится Создание и настройка LXC контейнера. Работа с LXC начинается с того что необходимо произвести базовую настройку контейнера. В контейнере находится система CentOS 7 и работать с ней надо как с обычной системой, но с небольшими нюансами. Более подробно о настройке системы можно почитать в статье CentOS 7 установка и настройка.

Обновим систему:

yum update

Для автоматической проверки обновлений установим необходимую утилиту:

yum install yum-cron

Действия на хосте LXC

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

На хосте с установленной системой LXC выполним команду которая сделает проброс порта с изменением для сервера SSH в контейнере:

firewall-cmd --permanent --zone=external --add-forward-port=port=25552:proto=tcp:toport=22:toaddr=10.10.0.2
= вывод команды =
success

Сохраним изменения:

firewall-cmd --reload
= вывод команды =
success

Посмотрим результат выполненных действий:

firewall-cmd --list-all --zone=external
= вывод команды =
external (active)
target: default
icmp-block-inversion: no
interfaces: ens18
sources:
services: http https
ports: 25555/tcp 10050/tcp
protocols:
masquerade: yes
forward-ports: port=25552:proto=tcp:toport=22:toaddr=10.10.0.2
source-ports:
icmp-blocks:
rich rules:

В результате при запросе порта 25552 на хосте он будет проброшен на 22 порт в контейнер с ip адресом 10.10.0.2.

Установка программ

Установим популярный репозиторий Epel:

yum -y install epel-release

Ставим необходимые пакеты без вопросов:

yum -y install vim mc net-tools bind-utils htop atop iftop lsof wget bzip2 traceroute gdisk yum-utils

Настройка SSH и консоли

Установим, запустим и добавим в автозагрузку ssh сервер:

yum install openssh-server
systemctl start sshd
systemctl enable sshd

Создадим пароль пользователя root в контейнере:

passwd

Приводим отображение приветствия консоли к нашему виду и сразу делаем настройки истории внеся необходимые параметры:

vim /root/.bashrc
= добавляем внизу =
# Вид приветствия bash
PS1='\[\033[01;31m\]\u@\H\[\033[01;34m\] \w \$\[\033[00m\] '
# Настройка истории bash
export HISTSIZE=10000
export HISTTIMEFORMAT="%h %d %H:%M:%S "
PROMPT_COMMAND='history -a'
export HISTIGNORE="ls:ll:history:w"

Применим изменения без перезагрузки:

source ~/.bashrc

Время в контейнере

Время будет браться с хоста поэтому нам необходимо указать только временную зону.

Посмотрим текущую временную зону:

date
= вывод команды =
Пт окт 12 23:58:14 UTC 2018

Сделаем резервную копию текущей временной зоны:

mv /etc/localtime /etc/localtime.bak

в папке /usr/share/zoneinfo/ находим необходимую временную зону и делаем ссылку

ln -s /usr/share/zoneinfo/Europe/Moscow /etc/localtime

В результате увидим следующее:

date
= вывод команды =
Сб окт 13 02:59:46 MSK 2018

Смена имени контейнера

Смена имени производится командой:

hostnamectl старое НОВОЕ

Не забываем сменить в файле конфигурации контейнера lxc.

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

Настройка почты

Для проверки работы почты установим пакет который позволяет отправлять письма с консоли:

yum install mailx

Установим, запустим и добавим в автозагрузку сервис для работы с почтой Рostfix:

yum install postfix
systemctl start postfix
systemctl enable postfix

Дальнейшая настройка как производится отправка почты с авторизацией на другом SMTP сервере вы найдете в статье CentOS 7 установка и настройка.

Управления контейнером LXC

Для вывода справки к командам добавляется параметр -h. Например, # lxc-destroy -h

Запуск контейнера:

lxc-start php7-lxc

Запуск можно произвести с выводом информации о процессе загрузки указав необходимый параметр -F.

После выполнения команды запуска с выводом всей информации необходимо будет ввести данные пользователя чтобы попасть в консоль.

lxc-start php7-lxc -F

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

lxc-stop php7-lxc

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

lxc-freeze php7-lxc
lxc-unfreeze php7-lxc

Подключение к терминалу контейнера:

lxc-attach php7-lxc

Информация о контейнерах LXC

Вывод информации о всех контейнерах:

lxc-ls -f
= вывод команды =
NAME STATE AUTOSTART GROUPS IPV4 IPV6 UNPRIVILEGED 
elk-lxc RUNNING 1 - 10.10.0.2 - false 
glpi-lxc RUNNING 1 - 10.10.0.3 - false 
php5-lxc RUNNING 1 - 10.10.0.4 - false 
php7-lxc RUNNING 1 - 10.10.0.5 - false

Подробный вывод информации о контейнере php7-lxc:

lxc-info php7-lxc
= вывод команды =
Name: php7-lxc
State: RUNNING
PID: 3917
IP: 10.10.0.5
CPU use: 3353.19 seconds
BlkIO use: 5.50 GiB
Memory use: 11.39 MiB
KMem use: 0 bytes
Link: php7-lxc
TX bytes: 5.49 MiB
RX bytes: 310.08 MiB
Total bytes: 315.57 MiB

Резервное копирование контейнеров LXC

LXC-контейнеры совместимы с файловыми системами ZFS, Btrfs и томами LVM. При размещении контейнеров на хранилищах такого типа, будут использоваться их встроенные средства для создания моментальных снимков.

Перед созданием снимка (snapshot) контейнера его необходимо остановить!

Создать снимок:

lxc-snapshot php7-lxc

=== Для создания снимка с комментарием ===
= создаем файл с комментарием =
echo "base setup sevo44" > snap-comment
= создаем снимок с комментарием =
lxc-snapshot php7-lxc -c snap-comment

Посмотреть имеющиеся снимки с выводом комментариев если они есть:

lxc-snapshot php7-lxc -L -С
= вывод команды =
snap0 (/var/sevo44/lxcsnaps/php7-lxc) 2019:02:26 20:52:17
snap1 (/var/sevo44/lxcsnaps/php7-lxc) 2019:02:26 21:02:44
base setup sevo44

Откатится к снимку snap0 контейнера php7-lxc можно выполнив команду:

lxc-snapshot php7-lxc -r snap0

Удалить снимок:

lxc-snapshot php7-lxc -d snap0

Создать новый контейнер из снимка:

lxc-snapshot php7-lxc -r snap0 php7-2-lxc

Клонирование контейнеров LXC

Перед клонированием контейнера его необходимо остановить!

Клонирование контейнера:

lxc-copy php7-lxc -N php7-2-lxc

Перенос контейнера LXC на другой сервер

Прелесть использования контейнеров, так же заключается в том, что их можно переносить на другой сервер на котором стоит аналогичная версия LXC.

Если контейнер переносится один в один (название, пути и тд.), то он с большой вероятностью запустится и всё там будет работать.

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

Перед переносом контейнера его необходимо остановить!

Перейдем в домашнюю папку и создадим архив который будем переносить на примере для контейнера php7-lxc:

cd
tar --numeric-owner -czvf php7-lxc.tar.gz /var/sevo44/lxc/php7-lxc

Где параметры tar означают:

  • c — создание архива tar,
  • z — сжать архив, используя алгоритм gzip,
  • v — выводить подробную информацию процесса,
  • f — указывает имя файла архива,
  • —numeric-owner — какие изначально при архивации ID были, такими они и будет после распаковки.

После переноса распакуем архив в необходимую папку:

tar -xzvf php7-lxc.tar.gz -C /var/sevo44/

Где параметры tar означают:

  • x — создание архива tar,
  • -C — указывает место для распаковки архива.

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

Bash скрипт для переноса контейнера LXC

Для быстроты и удобства лучше использовать скрипт который будет выполнять следующие действия:

  • Останавливать переносимый контейнер,
  • Создавать архив контейнера,
  • Запускать контейнер после архивирования,
  • Передавать архив контейнера на удаленный сервер,
  • Удалять архив контейнера после передачи на удаленный сервер,
  • Распаковывать архив на удаленном сервере,
  • Удалять архив контейнера на удаленном сервере после распаковки.

Для подключение к удаленному серверу без ввода пароля пользователя необходимо произвести соответствующую настройку о которой рассказано в статье RSA или авторизация SSH по ключу.

Создадим папку для размещения скрипта и создадим скрипт:

mkdir /root/bin
vim /root/bin/tar-lxc_php7-lxc.sh
= необходимый код с пояснениями =
#!/bin/bash

# Переносимый контейнер
container_name="php7-lxc"
# Параметры подключения к удаленому серверу
connect_string="root@192.168.0.101"

# Остановка контейнера перед архивацией
lxc_status=$(lxc-info $container_name|grep "STOPPED")
if [ -z "$lxc_status" ];
then
 lxc-stop "$container_name"
 run_again="yes"
fi

# Создание архива контейнера
tar --numeric-owner -czvf /tmp/$container_name.tar.gz /var/sevo44/lxc/$container_name

# Запуск контейнера после архивирования
if [ -n "$run_again" ];
then
 lxc-start "$container_name"
fi

# Копирование архива контейнера на удаленный сервер
scp /tmp/$container_name.tar.gz $connect_string:/tmp/

# Удаление архива после отправки на удаленный сервер
rm -f /tmp/$container_name.tar.gz

# Создадим необходимую папку если она отсутствует
ssh $connect_string mkdir -p /var/sevo44/tmp

# Распаковка архива на удаленном сервере !!! ВНИМАНИЕ !!! указываем полное имя архива
ssh $connect_string tar -xvf /tmp/php7-lxc.tar.gz -C /var/sevo44/tmp/

# Удаление архива после распаковки на удаленном сервере !!! ВНИМАНИЕ !!! указывается полное имя архива
ssh $connect_string rm -f /tmp/php7-lxc.tar.gz

Делаем скрипт исполнительным для владельца файла:

chmod u+x /root/bin/tar-lxc_php7-lxc.sh

Запускаем скрипт с параметром отправки информации о завершении переноса контейнера:

/root/bin/tar-lxc.sh | mailx -s 'Контейнер php7-lxc перенесён!' info@sevo44.ru

В результате на почту придет сообщение с темой «Контейнер php7-lxc перенесён!» а в теле письма вы увидите перечень всех файлов что были архивированы.

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

lxc-destroy php7-lxc

Вывод

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

LXC установка на CentOS 7

Использование системы LXC даёт возможность на одном сервере запускать разные изолирование операционные системы. Успешно использую эту технологию для разворачивания на одном VDS сервере LEMP конфигураций с разными версиями программ PHP и MariaDB.

Введение

Работая с серверами VDS для меня прежде всего важна стабильность и удобство их обслуживания.

Лично для меня существует несколько принципиальных моментов при работе с серверами:

  • Резервное копирование. Для спокойного обслуживания систем всегда необходимо создавать их резервные копии, но к сожалению большинство компаний предоставляющих услуги не предоставляют таких возможностей по умолчанию. Можно делать резервирование разными способами, но это не всегда удобно и требует хороших знаний для быстрого восстановления работоспособности системы из бэкапа;
  • Использование сервера для конкретной задачи или ресурса. Ни секрет что чем меньше всего установлено на сервере тем проще его обслуживать;
  • Разные версии программного обеспечения на одном сервере. Бывает так что на одном сервере необходимо использовать PHP 7 и PHP 5. Простыми способами одновременно заставить сервер работать с двумя версиями сложно.

Разработчики системы Calculate Linux познакомили меня с технологией LXC благодаря чему я сильно упростил себе жизнь при обслуживании серверов.

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

Система позволяет создавать контейнеры в которых размещается почти полнофункциональная система с использованием ядра хоста на котором расположена система.

Существует версия LXD которая может использовать в контейнере своё ядно, но это уже отдельный разговор тем более для запуска на системе CentOS. Знаю точно что разработчики систем LXC и LXD спонсирует компания занимающаяся разработкой дистрибутива Ubuntu и поэтому все свои технологии и новшества они внедряют в первую очередь на Ubuntu.

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

Все настройки производились на сервере с настройками выполненными по статье CentOS 7 установка и настройка.

Настройка сети для LXC контейнеров

Контейнеры будут находиться внутри своей виртуальной сети — 10.10.0.0/24. Для настройки маршрутизации будем использовать FirewallD.

Установим без вопросов пакет bridge-utils необходимый для настройки сети контейнеров:

yum -y install bridge-utils

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

Отключение NetworkManager, удаление из автозагрузки и перезагрузка сетевых настроек выполняется следующими командами:

systemctl stop NetworkManager
systemctl disable NetworkManager 
systemctl restart network

После отключения можете настраивать всё руками изминяя файлы настройки сети в папке /etc/sysconfig/network-scripts.

Создание виртуального бриджа через Nmtui

Заходим в графический интерфейс для настройки сетевых параметров в CentOS 7:

nmtui

После открытия выполняем действия:

  1. Добавить — Мост,
  2. Переименовать Имя профиля и Устройство в virbr0,
  3. КОНФИГУРАЦИЯ IPv4 <Вручную> добавляем адрес 10.10.0.1/24,
  4. КОНФИГУРАЦИЯ IPv46 <игнорировать>.

Проверим что получилось в результате выведя информацию о сетевых интерфейсах:

ip addr
= вывод команды =
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host 
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 72:d7:b9:2f:78:89 brd ff:ff:ff:ff:ff:ff
inet 165.21.152.551/24 brd 85.22.952.5 scope global noprefixroute ens18
valid_lft forever preferred_lft forever
inet6 fe80::70d7:b9ff:fe2f:7889/64 scope link 
valid_lft forever preferred_lft forever
4: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 8a:f6:04:5e:97:4f brd ff:ff:ff:ff:ff:ff
inet 10.10.0.1/24 brd 10.255.255.255 scope global noprefixroute virbr0
valid_lft forever preferred_lft forever

Настройка FirewallD для LXC

Более подробно как работать с FirewallD можете узнать в статье FirewallD базовая настройка.

Выведем информацию об активных зонах:

firewall-cmd --get-active-zones
= вывод информации =
public
interfaces: eth0 virbr0

Оба сетевых интерфейса находятся в зоне public

Нам необходимо перенести интерфейс eth0 во внешнюю сеть в зону external а virbr0 во внутреннюю в зону internal.

Перед переносом в другие зоны убедитесь что там присутствует сервис SSH. В случае использования подключения по нестандартному порту не забудьте его добавить в зону куда переносите. В противном случае потеряете доступ к серверу по SSH.

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

firewall-cmd --permanent --zone=external --add-port=25555/tcp
firewall-cmd --reload

Выполним перенос интерфейсов в нужные зоны:

= внешняя сеть =
firewall-cmd --permanent --zone=public --remove-interface=eth0
firewall-cmd --permanent --zone=external --add-interface=eth0
= внутренняя сеть =
firewall-cmd --permanent --zone=public --remove-interface=virbr0
firewall-cmd --permanent --zone=internal --add-interface=virbr0

Можно воспользоваться одной командой для переназначения зоны интерфейсу:

= внешняя сеть =
firewall-cmd --permanent --zone=external --change-interface=eth0
= внутренняя сеть =
firewall-cmd --permanent --zone=internal --change-interface=virbr0

Посмотрим результат:

firewall-cmd --get-active-zones
internal
interfaces: virbr0
external
interfaces: eth0

Интерфейсы попали в нужные зоны.

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

Проверим состояние masquerade на внешнем интерфейсе:

firewall-cmd --zone=external --query-masquerade
= вывод команды =
yes

Маскарад присутствует и нам не надо его добавлять.

Выведем информацию о параметрах внешней зоны:

firewall-cmd --list-all --zone=external
= вывод команды =
external (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: ssh
  ports: 25000/tcp
  protocols: 
  masquerade: yes
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

Доступ по ssh нам не требуется и мы его удалим.

firewall-cmd --permanent --zone=external --remove-service=ssh

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

firewall-cmd --permanent --zone=external --add-port=10050/tcp

Так как в последствии сервер будет работать выполняя функции LEMP сервера добавим необходимые сервисы:

firewall-cmd --permanent --zone=external --add-service=http
firewall-cmd --permanent --zone=external --add-service=https

Забегая вперед пробросим еще порт для доступа к контейнеру по ssh:

firewall-cmd --permanent --zone=external --add-forward-port=port=25552:proto=tcp:toport=22:toaddr=10.10.0.2

Подключатся к контейнеру по ssh надо будет на 25552 порту а хост перебросит в нужный контейнер на стандартный порт.

Выведем информацию о параметрах внутренней зоны:

firewall-cmd --list-all --zone=internal
= вывод команды =
internal (active)
target: default
icmp-block-inversion: no
interfaces: virbr0
sources: 
services: ssh mdns samba-client dhcpv6-client
ports: 
protocols: 
masquerade: no
forward-ports: 
source-ports: 
icmp-blocks: 
rich rules:

Удалим ненужные сервисы:

firewall-cmd --permanent --zone=internal --remove-service=mdns
firewall-cmd --permanent --zone=internal --remove-service=samba-client
firewall-cmd --permanent --zone=internal --remove-service=dhcpv6-client

Применим все сделанные изменения:

firewall-cmd --reload
= вывод команды =
success

Главная задача выполнена и контейнеры получат доступ в интернет.

Если хотите использовать для маршрутизации iptables вы можете посмотреть статью и найти там интерферирующие настройки.

Установка LXC 3.0 на CentOS 7

В базовой версии присутствует старая версия 1.0. Можно использовать и её, но уж больно много удобств внесли разработчики в новые версии. Если бы изменения касались только команд управления и не затрагивали конфигурационных настроек файлов я подумал бы еще о том чтобы дождаться новой версии в базовой версии CentOS 7.

Устанавливать свежую версию будем с ресурса Fedora CORP. Вся интерферирующая нас информация находится тут.

Создадим файл репозитория:

vim /etc/yum.repos.d/lxc3.0.repo
=добавим необходимый код =
[thm-lxc3.0]
name=Copr repo for lxc3.0 owned by thm
baseurl=https://copr-be.cloud.fedoraproject.org/results/thm/lxc3.0/epel-7-$basearch/
type=rpm-md
skip_if_unavailable=True
gpgcheck=1
gpgkey=https://copr-be.cloud.fedoraproject.org/results/thm/lxc3.0/pubkey.gpg
repo_gpgcheck=0
enabled=1
enabled_metadata=1

Для установки необходим репозиторий Epel. Установим командой:

yum install epel-release

Установим свежую версию 3.0 со всеми необходимыми пакетами:

yum install debootstrap lxc lxc-templates lxc-extra libcap-devel libcgroup

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

lxc-checkconfig
= вывод команды =
Kernel configuration not found at /proc/config.gz; searching...
Kernel configuration found at /boot/config-3.10.0-957.1.3.el7.x86_64
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
newuidmap is not installed
newgidmap is not installed
Network namespace: enabled
Multiple /dev/pts instances: enabled
--- Control groups ---
Cgroups: enabled

Cgroup v1 mount points: 
/sys/fs/cgroup/systemd
/sys/fs/cgroup/freezer
/sys/fs/cgroup/pids
/sys/fs/cgroup/perf_event
/sys/fs/cgroup/hugetlb
/sys/fs/cgroup/cpu,cpuacct
/sys/fs/cgroup/net_cls,net_prio
/sys/fs/cgroup/devices
/sys/fs/cgroup/cpuset
/sys/fs/cgroup/blkio
/sys/fs/cgroup/memory

Cgroup v2 mount points:
Cgroup v1 clone_children flag: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled

--- Misc ---
Veth pair device: enabled, not loaded
Macvlan: enabled, not loaded
Vlan: enabled, not loaded
Bridges: enabled, loaded
Advanced netfilter: enabled, not loaded
CONFIG_NF_NAT_IPV4: enabled, loaded
CONFIG_NF_NAT_IPV6: enabled, loaded
CONFIG_IP_NF_TARGET_MASQUERADE: enabled, loaded
CONFIG_IP6_NF_TARGET_MASQUERADE: enabled, loaded
CONFIG_NETFILTER_XT_TARGET_CHECKSUM: enabled, not loaded
CONFIG_NETFILTER_XT_MATCH_COMMENT: enabled, not loaded
FUSE (for use with lxcfs): enabled, not loaded

--- Checkpoint/Restore ---
checkpoint restore: enabled
CONFIG_FHANDLE: enabled
CONFIG_EVENTFD: enabled
CONFIG_EPOLL: enabled
CONFIG_UNIX_DIAG: enabled
CONFIG_INET_DIAG: enabled
CONFIG_PACKET_DIAG: enabled
CONFIG_NETLINK_DIAG: enabled
File capabilities:

Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig

Кроме двух строк (отмечены в выводе оранжевым) параметр у строк должен быть enabled.

LXC обычно использует следующие пути:

  • /var/lib/lxc/ — дефолтное место для контейнеров,
  • /var/lib/lxcsnap/ — дефолтное место снимков,
  • /var/cache/lxc/ — дефолтное место для кэша шаблонов,
  • $HOME/.local/share/lxc/ — дефолтное место для непривилегированных контейнеров,
  • $HOME/.local/share/lxcsnap/ — дефолтное место для непривилегированных снимков,
  • $HOME/.cache/lxc/ — дефолтное место для непривилегированного кэша шаблонов.

Шаблоны операционных систем хранятся в /usr/share/lxc/templates/.

Мне удобней держать контейнеры в своей папке. Создадим необходимую папку:

mkdir -p /var/sevo44/lxc

Создадим файл конфигурации и поместим туда нужный код:

vim /etc/lxc/lxc.conf
= необходимый код =
lxc.lxcpath = /var/sevo44/lxc

Если вы переопределяете место для контейнеров, то каталог снимков snap будет находится в вашей новой папке.

Запускаем LXC и добавляем в автозагрузку:

systemctl start lxc
systemctl enable lxc
= вывод команды =
Created symlink from /etc/systemd/system/multi-user.target.wants/lxc.service to /usr/lib/systemd/system/lxc.service.

Проверим статус службы:

systemctl status lxc
 lxc.service - LXC Container Initialization and Autoboot Code
Loaded: loaded (/usr/lib/systemd/system/lxc.service; enabled; vendor preset: disabled)
Active: active (exited) since Вт 2019-01-29 15:48:00 MSK; 25s ago
Docs: man:lxc-autostart
man:lxc
Main PID: 14338 (code=exited, status=0/SUCCESS)

янв 29 15:48:00 vds-micro2.sevo44.ru systemd[1]: Starting LXC Container Initialization and Autoboot Code...
янв 29 15:48:00 vds-micro2.sevo44.ru systemd[1]: Started LXC Container Initialization and Autoboot Code.

Служба работает. Переходим к настройке контейнеров.

Создание и настройка LXC контейнера

Предварительная настройка

При создании контейнера можно использовать необходимые нам параметры. Дефолтная конфигурация контейнера при установке находится в /etc/lxc/default.conf.

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

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

mkdir -p /var/sevo44/backup

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

Откроем файл дефолтной конфигурации для создаваемых контейнеров и внесём необходимые параметры:

vim /etc/lxc/default.conf
= необходимые параметры =
# sevo44 меняем значение 111 на необходимые
# lxc.uts.name = название контейнера.lemp.sevo44.loc
lxc.autodev = 1
lxc.net.0.type = veth
lxc.net.0.link = virbr0
lxc.net.0.flags = up
lxc.net.0.hwaddr = 00:16:3e:xx:xx:xx
lxc.net.0.veth.pair = 111-lxc
lxc.net.0.name = eth0
lxc.net.0.ipv4.address = 10.10.0.111/24
lxc.net.0.ipv4.gateway = 10.10.0.1
lxc.start.auto = 1
#lxc.start.delay = 5
lxc.mount.entry = /var/sevo44/backup/111 mnt none rw,bind 0.0

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

После создания контейнера надо будет зайти в файл настройки контейнера и поменять значения 111 на свои.

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

Создание контейнера LXC

Создавать будем контейнер с именем php7-lxc в котором развернем работу LEMP сервера с неоходимой версией php.

Создадим сразу папку для бэкапов:

mkdir /var/sevo44/backup/php7

Устанавливать будем скачивая необходимую версию дистрибутива.

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

lxc-create php7-lxc -t download
= вывод команды с пояснениями =
Setting up the GPG keyring
Downloading the image index
---
DIST	RELEASE	ARCH	VARIANT	BUILD
---
= в выводе скрыты все остальные варианты операционных систем =
centos	7	amd64	default	20190129_07:09
centos	7	arm64	default	20190129_07:10
centos	7	armhf	default	20190129_07:11
centos	7	i386	default	20190129_07:09
centos	7	ppc64el	default	20190129_07:10
---
Distribution: 
centos
Release: 
7
Architecture: 
amd64

Downloading the image index
Downloading the rootfs
Downloading the metadata
The image cache is now ready
Unpacking the rootfs
---
You just created a Centos 7 x86_64 (20190129_07:09) container.

Настройка контейнера LXC перед первым запуском

Заходим в файл настройки контейнера и вносим необходимые правки:

vim /var/sevo44/lxc/php7-lxc/config
= вывод команды с необходимыми правками =
# Template sed to create this container: /usr/share/lxc/templates/lxc-download
# Parameters passed to the template:
# For additional config options, please look at lxc.container.conf(5)

# Uncomment the following line to support nesting containers:
#lxc.include = /usr/share/lxc/config/nesting.conf
# (Be aware this has security implications)

# sevo44 меняем значение 111 на необходимые
# lxc.uts.name = название контейнера.lemp.sevo44.loc

# Distribution configuration
lxc.include = /usr/share/lxc/config/common.conf
lxc.arch = x86_64

# Container specific configuration
lxc.autodev = 1
lxc.start.auto = 1
#lxc.start.delay = 5
lxc.mount.entry = /var/sevo44/backup/php7 mnt none rw,bind 0.0
lxc.rootfs.path = dir:/var/sevo44/lxc/php7-lxc/rootfs
lxc.uts.name = php7-lxc.lemp.sevo44.loc

# Network configuration
lxc.net.0.type = veth
lxc.net.0.link = virbr0
lxc.net.0.flags = up
lxc.net.0.hwaddr = 00:16:3e:3b:18:15
lxc.net.0.veth.pair = php7-lxc
lxc.net.0.name = eth0
lxc.net.0.ipv4.address = 10.10.0.2/24
lxc.net.0.ipv4.gateway = 10.10.0.1

Значение строк на которые стоит обратить внимание:

  • lxc.net.0.ipv4.address = 10.10.0.2/24 — ip который будет присвоен контейнеру,
  • lxc.start.auto = 1 — автозагрузка контейнера при перезагрузке системы,
  • lxc.mount.entry = /var/sevo44/backup/php7 mnt none rw,bind 0.0 — говорит о том что папка /var/sevo44/backup/php7 будет примантированна в папку контейнера mnt,
  • lxc.uts.name = php7-lxc.lemp.sevo44.loc — название контейнера.

Для доступа в интернет в контейнере необходимо добавить dns серверы в /etc/resolv.conf. Добавим dns от Yandex и Google:

vim /var/sevo44/lxc/php7-lxc/rootfs/etc/resolv.conf
= необходимый код =
nameserver 77.88.8.8
nameserver 8.8.4.4

Конфигурацию сетевого интерфейса в контейнере приводим к следующему виду:

vim /var/sevo44/lxc/php7-lxc/rootfs/etc/sysconfig/network-scripts/ifcfg-eth0
= необходимые параметры =
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
HOSTNAME=php7-lxc.lemp.sevo44.loc
NM_CONTROLLED=no
TYPE=Ethernet

Управление контейнером LXC

Запуск контейнера php7-lxc осуществляется командой:

# lxc-start php7-lxc

Посмотрим состояние запущенного контейнера:

# lxc-info php7-lxc
= вывод команды =
Name: php7-lxc
State: RUNNING
PID: 14861
IP: 10.10.0.2
CPU use: 0.70 seconds
BlkIO use: 0 bytes
Memory use: 19.19 MiB
KMem use: 0 bytes
Link: php7-lxc
TX bytes: 656 bytes
RX bytes: 2.35 KiB
Total bytes: 2.99 KiB

Узнать другие параметры настройки можно выведя информацию о всех имеющихся контейнерах:

lxc-ls -f
= вывод команды =NAME     STATE   AUTOSTART GROUPS IPV4      IPV6 UNPRIVILEGED 
php7-lxс RUNNING 1         -      10.10.0.2 -    false

Подключимся к консоли контейнера.

= Так выглядит моя строка приветствия с необходимой командой =
root@vds-micro2.sevo44.ru ~ # lxc-attach php7-lxc
= Так выглядит строка приветствия контейнера =
[root@php7-lxс ~]#

Для проверки работы интернета выполним обновление системы:

yum update
= вывод команды =
Загружены модули: fastestmirror
Determining fastest mirrors
* base: mirror.sale-dedic.com
* extras: mirror.sale-dedic.com
* updates: dedic.sh
base                                   | 3.6 kB 00:00:00 
extras                                 | 3.4 kB 00:00:00 
updates                                | 3.4 kB 00:00:00 
(1/4): base/7/x86_64/group_gz          | 166 kB 00:00:00 
(2/4): extras/7/x86_64/primary_db      | 156 kB 00:00:00 
(3/4): updates/7/x86_64/primary_db     | 1.4 MB 00:00:00 
(4/4): base/7/x86_64/primary_db        | 6.0 MB 00:00:00 
No packages marked for update

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

exit

Вывод

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