🐳 Как сохранить состояние контейнера Docker

Как экспортировать и коммитить образ Docker

by itisgood

1. Введение

Контейнеры Docker запускают легковесные приложения в изолированных средах.
Однако за эту изоляцию приходится платить постоянством.
Когда мы останавливаем или удаляем контейнер, мы теряем его файловую систему и все данные, хранящиеся в нем. Таким образом, контейнеры проектируются как эфемерные.
Тем не менее, бывают случаи, когда нам нужно сохранить состояние запущенного контейнера.
Это может быть сохранение данных или быстрая репликация среды.
В этой статье мы рассмотрим, как сохранить состояние контейнера Docker путем создания образов и экспорта.

2. Коммит: Сохранение состояния контейнера в виде образа

Docker позволяет нам создать образ из работающего контейнера с помощью команды docker commit.
Это становится полезным, если мы внесли изменения внутри контейнера, например, установили пакеты или изменили конфигурацию.

2.1. Команда

Синтаксис команды следующий:
docker commit <container_id_or_name> <image_name>:<tag>
Где <container_id_or_name> – идентификатор или имя запущенного контейнера, <image_name> – новое имя образа, а <tag> необязателен.
Сгенерированный образ представляет собой базовый образ с дополнительным слоем, содержащим текущее состояние контейнера.

Важно отметить, что команда docker commit фиксирует не все.

Например, в образ не будут включены смонтированные тома, установленные с помощью опций -v или -mount. Это означает, что файлы, хранящиеся на этих томах, не являются частью нового образа.

Кроме того, она не сохраняет специфические настройки контейнера, такие как сетевые конфигурации, IP-адреса, лимиты процессора и памяти, политики перезапуска или рабочий каталог.

2.2. Пример

Давайте рассмотрим практический пример экономии с помощью commit.

🐳 Как обновить образ Docker c новыми изменениями?

Начнем с запуска контейнера из образа Ubuntu:

$ docker run -it ubuntu /bin/bash

На этом шаге мы должны применить все необходимые модификации.

В данном случае внутри запущенного контейнера мы установим только пакет cURL:

# apt-get update && apt-get install -y curl

После того как мы закончили вносить изменения, давайте сохраним текущее состояние контейнера, создав новый образ под названием ubuntu-with-curl:

$ docker commit 81f7bdcc6eff ubuntu-with-curl
sha256:52217d19f1b958a8a2f52f98644d187340cc363db0e22f499ac2469a68a5d78a

Возвращаемое хэш-значение – это ID нашего только что созданного образа, что свидетельствует об успешном выполнении операции.

Чтобы подтвердить внесенные изменения, мы можем создать новый контейнер с созданным образом и проверить версию cURL:

$ docker run -it ubuntu-with-curl /bin/bash
# curl --version
curl 8.5.0 (x86_64-pc-linux-gnu) libcurl/8.5.0 OpenSSL/3.0.13 zlib/1.3 brotli/1.1.0 zstd/1.5.5 libidn2/2.3.7 libpsl/0.21.2 (+libidn2/2.3.7) libssh/0.10.6/openssl/zlib nghttp2/1.59.0 librtmp/2.3 OpenLDAP/2.6.7
Release-Date: 2023-12-06, security patched: 8.5.0-2ubuntu10.4
Protocols: dict file ftp ftps gopher gophers http https imap imaps ldap ldaps mqtt pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: alt-svc AsynchDNS brotli GSS-API HSTS HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM PSL SPNEGO SSL threadsafe TLS-SRP UnixSockets zstd

Чтобы облегчить распространение образа, мы можем использовать команду docker push для загрузки его в удаленный реестр, например Docker Hub.

3. Docker Export: Сохранение контейнера в виде tar-файла

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

Для этого Docker предоставляет команду docker export, которая сохраняет текущее состояние файловой системы контейнера в виде tar-архива, включая файлы, каталоги, установленные пакеты и многое другое.

3.1. Команда

Вот как мы можем использовать docker export:

docker export <container_id> > <filename>.tar

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

Таким образом, команда docker export не включает специфические для Docker метаданные, такие как слои образа контейнера или переменные окружения.

Как и при использовании команды docker commit, команда docker export не включает файлы, хранящиеся на томах, подключенных к контейнеру.

Так, если мы подключили том к папке внутри нашего контейнера, команда docker export получит только исходное содержимое этой папки, до того как том был подключен.

Файлы на самом томе сохранены не будут.

3.2. Пример

Итак, используя тот же идентификатор, что и контейнер, который мы установили в предыдущем разделе, давайте теперь экспортируем его в tar-файл:

$ docker export 81f7bdcc6eff > ubuntu-with-curl.tar

Если нам понадобится повторно импортировать эту файловую систему в Docker, мы можем воспользоваться командой docker import:

$ docker import ubuntu-with-curl.tar ubuntu-with-curl
sha256:41db1e00c5add5a28c50d7c16728baa7f2088dd4a087e484852f7bb3110e0cd4

Эта команда считывает tar-файл и создает из него образ файловой системы с именем ubuntu-with-curl.

4. Заключение

В этой статье мы изучили две команды docker, которые позволяют сохранить состояние контейнера: commit и export.

Команда docker commit помогает создать новый образ на основе изменений, внесенных в контейнер, например установки новых пакетов.

В качестве альтернативы команда docker export генерирует простой tar файловой системы контейнера без конкретных деталей, таких как слои образа контейнера и метаданные.

см. также:

Loading

You may also like

Leave a Comment