Как использовать команду docker container commit для создания новых образов

DockerDockerBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этой лабораторной работе вы научитесь использовать команду docker container commit для создания новых Docker-образов из существующих контейнеров. Мы начнём с запуска и модификации контейнера, а затем зафиксируем эти изменения в новом образе.

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/images("List Images") subgraph Lab Skills docker/run -.-> lab-555104{{"Как использовать команду docker container commit для создания новых образов"}} docker/ps -.-> lab-555104{{"Как использовать команду docker container commit для создания новых образов"}} docker/rm -.-> lab-555104{{"Как использовать команду docker container commit для создания новых образов"}} docker/inspect -.-> lab-555104{{"Как использовать команду docker container commit для создания новых образов"}} docker/pull -.-> lab-555104{{"Как использовать команду docker container commit для создания новых образов"}} docker/images -.-> lab-555104{{"Как использовать команду docker container commit для создания новых образов"}} end

Запуск и модификация контейнера

На этом шаге вы узнаете, как запустить Docker-контейнер и внести в него изменения. Мы будем использовать простой образ Ubuntu для демонстрации процесса.

Сначала загрузим образ Ubuntu. Эта команда скачивает образ Ubuntu с Docker Hub на ваш локальный компьютер.

docker pull ubuntu:latest

Вы увидите вывод, указывающий на загрузку образа. После завершения загрузки вы можете запустить контейнер на основе этого образа.

Теперь запустим интерактивный контейнер с использованием образа Ubuntu. Флаги -it используются для выделения псевдо-TTY и поддержания stdin открытым, что позволяет взаимодействовать с оболочкой контейнера. Флаг --name присваивает контейнеру имя для удобства последующего обращения.

docker run -it --name my-ubuntu ubuntu:latest /bin/bash

После выполнения этой команды вы окажетесь внутри bash-оболочки контейнера. Это можно проверить, посмотрев hostname, который будет соответствовать ID контейнера.

Внутри контейнера создадим простой файл. Используем команду echo, чтобы записать текст в файл hello.txt в корневой директории.

echo "Hello from inside the container!" > /hello.txt

Можно проверить, что файл создан и содержит правильное содержимое, с помощью команды cat.

cat /hello.txt

Вы должны увидеть вывод "Hello from inside the container!".

Теперь, когда мы внесли изменения в контейнер, выйдем из его оболочки.

exit

Теперь вы вернулись в терминал вашей основной системы. Контейнер продолжает работать в фоновом режиме. Это можно проверить, выведя список запущенных контейнеров.

docker ps

Вы должны увидеть контейнер my-ubuntu в списке.

Сохранение изменений контейнера в новый образ

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

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

Для выполнения коммита используется команда docker commit. Базовый синтаксис: docker commit [имя_контейнера] [имя_нового_образа]. Мы закоммитим контейнер my-ubuntu и назовём новый образ my-ubuntu-modified.

docker commit my-ubuntu my-ubuntu-modified

В результате вы увидите длинную строку символов — это ID вновь созданного образа.

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

docker images

В выводе вы должны увидеть my-ubuntu-modified вместе с оригинальным образом ubuntu.

Чтобы убедиться, что изменения сохранились в новом образе, запустим новый контейнер на основе my-ubuntu-modified и проверим наличие файла, созданного на предыдущем шаге.

docker run -it --name my-ubuntu-test my-ubuntu-modified /bin/bash

Оказавшись внутри нового контейнера, проверим существование файла /hello.txt.

cat /hello.txt

Вы должны увидеть текст "Hello from inside the container!", что подтвердит успешное сохранение изменений в новом образе.

Теперь выйдем из контейнера.

exit

Наконец, удалим тестовый контейнер, который только что создали.

docker rm -f my-ubuntu-test

Сохранение изменений контейнера с новыми настройками

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

Мы продолжим использовать контейнер my-ubuntu из предыдущих шагов. Сначала остановим контейнер, так как будем сохранять его текущее состояние.

docker stop my-ubuntu

Вы должны увидеть имя контейнера my-ubuntu в выводе, что подтверждает его остановку.

Теперь сохраним контейнер и добавим метку (label) к новому образу. Метки — это пары ключ-значение, которые можно прикреплять к образам для добавления метаданных. Мы добавим метку, указывающую версию нашего модифицированного образа. Используем флаг -c с указанием инструкции конфигурации.

docker commit -c 'LABEL version="1.0"' my-ubuntu my-ubuntu-labeled

В выводе вы увидите ID вновь созданного образа.

Проверим, что новый образ my-ubuntu-labeled создан и метка применена. Для просмотра детальной информации об образе используем команду docker inspect.

docker inspect my-ubuntu-labeled

Вывод будет представлять большой JSON-объект. Найдите раздел "Labels" внутри блока "Config". Там должна быть указана метка "version": "1.0".

Альтернативно можно использовать docker inspect с фильтрацией для проверки конкретной метки.

docker inspect --format '{{.Config.Labels}}' my-ubuntu-labeled

Эта команда выведет только метки, связанные с образом. Вы должны увидеть что-то вроде map[version:1.0].

Мы также можем добавить другие параметры конфигурации при сохранении, например, установить переменную окружения. Сохраним контейнер my-ubuntu ещё раз, на этот раз добавив переменную окружения.

docker commit -c 'ENV MY_VARIABLE="Hello Docker"' my-ubuntu my-ubuntu-env

Проверим новый образ и переменную окружения с помощью docker inspect.

docker inspect --format '{{.Config.Env}}' my-ubuntu-env

Вы должны увидеть вывод вида [PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin MY_VARIABLE=Hello Docker], что подтверждает установку переменной окружения.

Сохранение изменений контейнера с инструкциями CMD и EXPOSE

В этом завершающем шаге мы научимся сохранять изменения контейнера, устанавливая команду по умолчанию (CMD) и открытые порты (EXPOSE) для нового образа.

Инструкция CMD определяет команду, которая будет выполняться при запуске контейнера из образа без указания конкретной команды. Инструкция EXPOSE сообщает Docker, что контейнер прослушивает указанные сетевые порты во время работы.

Мы снова сохраним контейнер my-ubuntu, на этот раз установив команду по умолчанию для вывода содержимого файла /hello.txt и открыв порт 80.

Сначала убедимся, что контейнер my-ubuntu остановлен.

docker stop my-ubuntu

Теперь сохраним контейнер с инструкциями CMD и EXPOSE. Обратите внимание, что инструкция CMD передаётся в виде JSON-массива строк.

docker commit -c 'CMD ["cat", "/hello.txt"]' -c 'EXPOSE 80' my-ubuntu my-ubuntu-final

В выводе вы увидите ID вновь созданного образа.

Проверим настройки CMD и EXPOSE нового образа my-ubuntu-final с помощью docker inspect.

docker inspect --format '{{.Config.Cmd}}' my-ubuntu-final

Должен появиться вывод [cat /hello.txt], подтверждающий установку команды по умолчанию.

Теперь проверим открытые порты.

docker inspect --format '{{.Config.ExposedPorts}}' my-ubuntu-final

Вы должны увидеть что-то вроде map[80/tcp:{}], что означает открытие порта 80.

Наконец, запустим контейнер из этого нового образа без указания команды, чтобы проверить работу CMD по умолчанию.

docker run --rm my-ubuntu-final

Флаг --rm автоматически удаляет контейнер после завершения работы. Так как команда по умолчанию — cat /hello.txt, контейнер должен запуститься, вывести "Hello from inside the container!" и завершить работу.

Вы должны увидеть текст "Hello from inside the container!" в терминале.

Это демонстрирует, как можно сохранять изменения контейнера и определять поведение по умолчанию с настройками сети для результирующего образа.

Итоги

В этой лабораторной работе вы научились запускать и изменять Docker-контейнер. Вы скачали образ Ubuntu, запустили интерактивный контейнер на его основе, создали файл внутри контейнера, а затем вышли из оболочки контейнера, оставив его работать.

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