В этой статье мы расскажем о том, как создавать снимки контейнеров, импортировать и экспортировать образы и восстанавливать систему из них.
Снимок (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.

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