В этой статье мы расскажем о том, как создавать снимки контейнеров, импортировать и экспортировать образы и восстанавливать систему из них.
Снимок (snapshot) — это запись отличий изменений системы с определенного момента времени. Каждый новый снимок хранит в себе только отличия от предыдущего снимка, поэтому занимает гораздо меньше места, чем образ системы.
Образ (image) — это полная запись состояния, которую можно использовать для развертывания копии.
Создание снимка контейнера
Делать снимки системы — всё равно, что сохраняться в какой-нибудь игре: необходимо для того, чтобы иметь возможность вернуться в какое-то определенное состояние.
Создать новый снимок можно следующей командой. В качестве snapshot_name можно указать какую-то отметку, которая позже поможет идентифицировать этот образ. Например, before-nginx-rebuild или install-php-7.
lxc snapshot <container_name> <snapshot_name>
![](https://static.codex.so/upload/editor/o_499fc88d06337d935194e27d90fb00d9.jpg)
Список снапшотов можно увидеть, вызвав команду для получения информации об определенном контейнере.
lxc info <container_name>
![](https://static.codex.so/upload/editor/o_8e6bebe3666d388ec3295c3181365af4.jpg)
Удалить ненужные снапшоты можно с помощью команды
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
![](https://static.codex.so/upload/editor/o_f1b4c2f4f527cb8ff93a3fc3cb421c55.jpg)
Экспорт образа
Соберем архив образа, который уже можно будет сохранить на внешнем носителе или в облаке.
lxc image export <image_alias/fingerprint>
В качестве параметра можно передать либо алиас, который мы задали при создании образа, либо его уникальный отпечаток (fingerprint).
![](https://static.codex.so/upload/editor/o_80697fe9394faa8cfb71264c411d3291.jpg)
Удаляем ненужные образы
Если какие-то лишние образы занимают место на сервере, их можно удалить командой
lxc image delete <image_alias/fingerprint>
Удалим образ alice-base.
![](https://static.codex.so/upload/editor/o_f973480b91b571863418961afa8a0973.jpg)
Импорт образа и восстановление контейнера
А теперь представим ситуацию, что container-alice как-то сломался ? и/или нам необходимо восстановить его из созданного ранее архива-бекапа.
Останавливаем контейнер и удаляем его с помощью lxc stop и lxc delete.
![](https://static.codex.so/upload/editor/o_a0c8bc8d0bf4d58282062f94797d069e.jpg)
Очевидно, что теперь при попытке зайти на сайт контейнера мы будем видеть ошибку от nginx с главного сервера. Запрос пришел, был перенаправлен на 10.0.1.2 (адрес container-alice), но так никуда и не дошел.
![](https://static.codex.so/upload/editor/o_d0f43e9869fb184714edb02f6cbdb2b5.jpg)
Собираем из архива новый образ.
lxc image import <path_to_archive> --alias <image_name>
![](https://static.codex.so/upload/editor/o_b168b40aebe387bffb782ea96f4aa7c0.jpg)
Мы добавили образ, из которого теперь можно создать новый контейнер.
lxc init <image_name/fingerprint> <container_name>
Снова создадим container-alice, но теперь уже из определенного образа
![](https://static.codex.so/upload/editor/o_419205ca367b4eb7bb2b5e5e78944400.jpg)
Подключим его к сети и запустим.
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>
![](https://static.codex.so/upload/editor/o_a98c7fabf5c99ed74b3f4ee85a838d16.jpg)
Открываем сайт контейнера alice.myserver.com.
![](https://static.codex.so/upload/editor/o_91a97c4c1f549cff1fe8fdea2717834f.jpg)
Мы успешно восстановили полностью настроенный контейнер.
Заключение
Теперь вы умеете создавать резервные копии контейнеров и восстанавливать из этих архивов окружение со всем содержимым. Автоматизируйте создание бэкапов, храните их в облачных хранилищах и периодически проверяйте, разворачивая на тестовом окружении.