docker commit и docker save — сохранить контейнер и образ

Два способа сохранить состояние Docker: docker commit — сохранить изменения контейнера в новый образ, docker save — экспортировать образ в файл для переноса без Docker Hub.

Вся рубрика Docker: уроки, команды и практические сценарии

docker commit — снимок контейнера

# Запустить контейнер и что-то изменить внутри
docker run -it ubuntu bash
# Внутри установить пакеты
apt update && apt install -y python3 vim curl
exit

# Сохранить изменения в новый образ
# docker commit КОНТЕЙНЕР НОВЫЙ_ОБРАЗ:ТЕГ
docker commit CONTAINER_ID my-ubuntu:with-tools

# Или по имени (если контейнер запустили с --name)
docker run -it --name my-container ubuntu bash
# ... внести изменения ...
docker commit my-container my-ubuntu:v1

# С сообщением об изменениях
docker commit -m "Added python3, vim, curl" my-container my-ubuntu:v1

# Проверить
docker images | grep my-ubuntu
docker run -it my-ubuntu:v1 python3 --version

Когда использовать docker commit

  • ✅ Быстрое прототипирование — зафиксировать рабочее состояние
  • ✅ Отладка — сохранить контейнер в момент воспроизведённой проблемы
  • ✅ Одноразовые эксперименты — исследовал образ, добавил что нужно
  • ❌ Не подходит для продакшена — нет воспроизводимости (неизвестно что внутри)
  • ❌ Не для CI/CD — лучше Dockerfile: декларативно, версионируется в git

docker save — экспортировать образ в .tar файл

# Сохранить образ в файл
docker save -o my-ubuntu.tar my-ubuntu:with-tools

# Несколько образов в один файл
docker save -o images.tar nginx:latest ubuntu:22.04 myapp:1.0

# Сжатый архив (меньше размер)
docker save my-ubuntu:with-tools | gzip > my-ubuntu.tar.gz

# Проверить размер
ls -lh my-ubuntu.tar.gz

docker load — загрузить образ из файла

# Загрузить образ на другой машине
docker load -i my-ubuntu.tar
docker load -i my-ubuntu.tar.gz

# Проверить что загрузился
docker images | grep my-ubuntu

# Запустить
docker run -it my-ubuntu:with-tools bash

Типичный сценарий: перенести образ на машину без интернета, в закрытый контур, на сервер без доступа к Docker Hub.

docker export/import — файловая система контейнера

# export — сохранить файловую систему контейнера (без истории слоёв)
docker export my-container -o container.tar

# import — создать образ из tar-архива
docker import container.tar my-image:imported

# Запустить
docker run -it my-image:imported bash

save vs export — в чём разница

docker savedocker export
Что сохраняетОбраз: все слои, история, метаданныеФайловую систему контейнера
Восстанавливается черезdocker loaddocker import
Сохраняет историю слоёв✅ Да❌ Нет (один плоский слой)
Размер файлаБольшеМеньше
CMD/ENTRYPOINTСохраняютсяТеряются — нужно задать при import
Когда использоватьПеренести образ между серверамиОдноразовый снимок файловой системы

Просмотр истории образа

# Посмотреть слои и команды из которых собран образ
docker history myapp:1.0
# IMAGE         CREATED        CREATED BY                                SIZE
# abc123        2 hours ago    CMD ["python", "app.py"]                  0B
# def456        2 hours ago    COPY . .                                  45.2kB
# ghi789        2 hours ago    RUN pip install -r requirements.txt       89.5MB
# ...

# Полные команды (не обрезанные)
docker history --no-trunc myapp:1.0

Часто задаваемые вопросы

docker commit или Dockerfile — что лучше?

Для серьёзных проектов — всегда Dockerfile. Он декларативный (понятно что внутри), версионируется в git вместе с кодом, воспроизводимый (одинаковый образ при каждой сборке), подходит для CI/CD. docker commit — для быстрых экспериментов и отладки. Аналогия: Dockerfile = рецепт, docker commit = сфотографировать готовое блюдо.

Как перенести Docker образ без Docker Hub?

Используй docker save/docker load: 1) На исходной машине: docker save myapp:1.0 | gzip > myapp.tar.gz. 2) Скопировать файл: scp myapp.tar.gz user@server:/tmp/. 3) На целевой машине: docker load -i /tmp/myapp.tar.gz. Этот подход работает в закрытых сетях, air-gapped средах, и при переносе на флешке.

Как посмотреть историю образа?

docker history имя:тег — показывает все слои образа с командами и размерами. По этой команде можно восстановить Dockerfile если он потерян. Флаг --no-trunc показывает полные команды. docker inspect имя:тег — детальная JSON информация об образе: метаданные, переменные окружения, CMD, точки монтирования.

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x