Работа с бэкапами контейнеров

5 min read

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

Снимок (snapshot) — это запись отличий изменений системы с определенного момента времени. Каждый новый снимок хранит в себе только отличия от предыдущего снимка, поэтому занимает гораздо меньше места, чем образ системы.

Образ (image) — это полная запись состояния, которую можно использовать для развертывания копии.

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

Делать снимки системы — всё равно, что сохраняться в какой-нибудь игре: необходимо для того, чтобы иметь возможность вернуться в какое-то определенное состояние.

Создать новый снимок можно следующей командой. В качестве snapshot_name можно указать какую-то отметку, которая позже поможет идентифицировать этот образ. Например, before-nginx-rebuild или install-php-7.

lxc snapshot <container_name> <snapshot_name>
В правом столбце отображается количество снимков контейнера 

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

lxc info <container_name>

Удалить ненужные снапшоты можно с помощью команды

lxc delete <container_name>/<snapshot_name>

Можно переименовать снапшот

lxc move <container_name>/<snapshot_name> <container_name>/<new_snapshot_name>

Восстановление состояния контейнера из снимка 

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

lxc restore <container_name> <snapshot_name>

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

lxc copy <source_container>/<snapshot_name> <destination_container>

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

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

Создать образ контейнера из снапшота можно с помощью следующей команды.

lxc publish <container_name>/<snapshot_name> --alias <image_name>

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

lxc image list

Экспорт образа

Соберем архив образа, который уже можно будет сохранить на внешнем носителе или в облаке.

lxc image export <image_alias/fingerprint>

В качестве параметра можно передать либо алиас, который мы задали при создании образа, либо его уникальный отпечаток (fingerprint).

Удаляем ненужные образы

Если какие-то лишние образы занимают место на сервере, их можно удалить командой

lxc image delete <image_alias/fingerprint>

Удалим образ alice-base.

Импорт образа и восстановление контейнера

А теперь представим ситуацию, что container-alice как-то сломался ? и/или нам необходимо восстановить его из созданного ранее архива-бекапа.

Останавливаем контейнер и удаляем его с помощью lxc stop и lxc delete.

Очевидно, что теперь при попытке зайти на сайт контейнера мы будем видеть ошибку от nginx с главного сервера. Запрос пришел, был перенаправлен на 10.0.1.2 (адрес container-alice), но так никуда и не дошел.

Собираем из архива новый образ.

lxc image import <path_to_archive> --alias <image_name>

Мы добавили образ, из которого теперь можно создать новый контейнер.

lxc init <image_name/fingerprint> <container_name>

Снова создадим container-alice, но теперь уже из определенного образа

Контейнер создан

Подключим его к сети и запустим.

lxc network attach <network_name> <container_name> <interface_name> lxc config device set <container_name> <interface_name> ipv4.address <ip_address> lxc start <container_name>

Открываем сайт контейнера alice.myserver.com.

container-alice снова рад нас видеть

Мы успешно восстановили полностью настроенный контейнер.

Заключение

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