Как изменить существующий Docker-образ #
Иногда при работе с Docker возникает необходимость изменить уже существующий образ.
Например:
- установить дополнительный пакет
- добавить конфигурационный файл
- изменить настройки приложения
- добавить скрипты запуска
- исправить ошибку в конфигурации
Важно понимать одну ключевую особенность Docker:
Docker-образ нельзя изменить напрямую.
Любые изменения создают новый слой, формируя новый образ.
В этой статье разберём несколько способов изменить Docker-образ.
Как работает Docker Image #
Docker-образ состоит из слоёв (layers).
Каждая инструкция в Dockerfile создаёт новый слой:
Base Image
↓
RUN apt install curl
↓
COPY config
↓
CMD start-app
Контейнер при запуске добавляет ещё один слой — writable layer.
Поэтому Docker не изменяет существующий образ, а создаёт новый слой поверх него.
Способ 1. Изменить первоначальный Dockerfile #
Если у вас есть доступ к исходному Dockerfile, это самый правильный и удобный способ изменить образ.
Например, исходный Dockerfile:
FROM nginx:latest
COPY index.html /usr/share/nginx/html/index.html
Допустим, нужно установить пакет curl.
1. Изменяем Dockerfile #
FROM nginx:latest
RUN apt-get update && apt-get install curl -y
COPY index.html /usr/share/nginx/html/index.html
2. Теперь пересобираем образ #
docker build -t custom-nginx .
После сборки новый образ будет содержать все изменения.
Преимущества этого метода:
- легко повторить сборку
- удобно использовать в CI/CD
- конфигурация хранится в Git
Способ 2. Создать новый Dockerfile на основе существующего образа #
Если исходного Dockerfile нет, можно создать новый Dockerfile, используя существующий образ как базовый.
1. Создаём Dockerfile #
Например, мы хотим изменить образ nginx.
Создаём файл Dockerfile.
FROM nginx:latest
RUN apt-get update && apt-get install curl -y
COPY index.html /usr/share/nginx/html/index.html
2. Собираем новый образ #
В директории с Dockerfile выполняем:
docker build -t custom-nginx .
3. Проверяем созданный образ #
docker images
Пример вывода:
REPOSITORY TAG IMAGE ID CREATED SIZE
custom-nginx latest a82f2e39b9a3 5 seconds ago 143MB
nginx latest 605c77e624dd 2 weeks ago 141MB
4. Запускаем контейнер #
docker run -d -p 8080:80 custom-nginx
Способ 3. Изменение контейнера и создание образа #
Этот способ используют для быстрых изменений и экспериментов.
Он менее удобен для production, потому что изменения нельзя легко повторить.
1. Запускаем контейнер #
docker run -it ubuntu bash
2. Вносим изменения внутри контейнера #
Например установим пакет curl:
apt update
apt install curl -y
Можно изменить конфигурацию, добавить файлы и т.д.
3. Выходим из контейнера #
exit
Контейнер остановится.
4. Смотрим список контейнеров #
docker ps -a
Пример:
CONTAINER ID IMAGE COMMAND CREATED STATUS
d9b100f2f636 ubuntu bash 2 minutes ago Exited
5. Создаём новый образ #
docker commit d9b100f2f636 custom-ubuntu
Теперь у нас появился новый Docker-образ.
6. Проверка созданного образа #
Проверим список образов:
docker images
Вывод:
REPOSITORY TAG IMAGE ID
custom-ubuntu latest 91c4f2d3f1a2
ubuntu latest 2ca708c1c9cc
Когда использовать Dockerfile и docker commit #
| Метод | Когда использовать |
|---|---|
| Изменить Dockerfile | лучший вариант, если есть исходники |
| Новый Dockerfile | если Dockerfile отсутствует |
| docker commit | быстрые изменения и эксперименты |
Dockerfile позволяет:
- повторять сборку
- хранить конфигурацию в Git
- автоматизировать процесс сборки
Полезные команды Docker #
Список образов #
docker images
Список контейнеров #
docker ps -a
Удаление контейнера #
docker rm container_id
Удаление образа #
docker rmi image_name
Просмотр истории образа #
Показывает слои образа и команды, которые их создали:
docker history image_name
Итог #
Docker-образы являются immutable (неизменяемыми).
Это значит, что любые изменения приводят к созданию нового образа.
Основные способы изменить образ:
- изменить исходный Dockerfile
- создать новый Dockerfile на основе существующего образа
- изменить контейнер и сохранить его через
docker commit
На практике чаще всего используется Dockerfile, так как он обеспечивает воспроизводимость и хорошо подходит для CI/CD.
Лучшей практикой является хранить Dockerfile в системе контроля версий, например Git.