1. Введение
2. Коммит: Сохранение состояния контейнера в виде образа
2.1. Команда
docker commit <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 файловой системы контейнера без конкретных деталей, таких как слои образа контейнера и метаданные.
см. также:
- 🐳 Преобразование команд Docker run для команд в Docker-Compose
- 🐳 Как смонтировать том Docker, исключив подкаталог
- 🐳 Автоматический запуск Docker контейнера
- 🐳 Уменьшение размера логов Docker на диске