Расскажу про базовую настройку контейнера и о том как осуществляется работа с 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 контейнерами стала будничной.