Использование системы 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
После открытия выполняем действия:
- Добавить — Мост,
- Переименовать Имя профиля и Устройство в virbr0,
- КОНФИГУРАЦИЯ IPv4 <Вручную> добавляем адрес 10.10.0.1/24,
- КОНФИГУРАЦИЯ 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 минимальными возможностями функционала. Информации об этой технологии у меня еще много, но об этом я расскажу в своих следующих статьях:
- Работа с LXC контейнерами,
- Настройка LXC контейнера LEMP под управлением CentOS 7.