Перейти к основному содержимому

Как изменить образ Docker

·569 слов·3 минут
DevOps • Networks • Security • Infrastructure
Автор
DevOps • Networks • Security • Infrastructure
DevOps/Network/Infra Engineer, CyberSecurity Expert

Как изменить существующий 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 (неизменяемыми).
Это значит, что любые изменения приводят к созданию нового образа.

Основные способы изменить образ:

  1. изменить исходный Dockerfile
  2. создать новый Dockerfile на основе существующего образа
  3. изменить контейнер и сохранить его через docker commit

На практике чаще всего используется Dockerfile, так как он обеспечивает воспроизводимость и хорошо подходит для CI/CD.
Лучшей практикой является хранить Dockerfile в системе контроля версий, например Git.

Related

Основные команды Docker
·1030 слов·5 минут
Lazydocker для Docker
·89 слов·1 минута
Установка Docker на Ubuntu
·263 слов·2 минут