Как обновить образ Docker новыми изменениями, которые мы внесли в контейнер?
Да, все мы знаем, что образ Docker – это основная часть вашего контейнера Docker.
Контейнер работает на основе этого образа.
Образ Docker можно создать разными способами.
Мы можем построить множество контейнеров из одного образа.
Образ – это комбинация файловой системы и параметров.
Образ Docker состоит из ряда слоев.
Каждый словй представляет собой инструкцию в файле Dockerfile.
Каждый слой, кроме самого последнего, доступен только для чтения.
После запуска контейнера с использованием образа вы можете вносить в него изменения.
Например, вы можете создавать новые файлы, вы можете устанавливать новые модули, пакеты и т.д.
Эти изменения будут сохраняться в контейнере, пока он существует.
Не рекомендуется обновлять образ Docker с помощью этого метода. Всегда старайтесь использовать контейнеры stateless.
Это должно повысить производительность, и ваше приложение будет более подходящим для инфраструктуры stateless.
Рассмотрим ситуацию: ваш контейнер Docker завершен/остановлен, и вы не можете запустить контейнеры с помощью команды docker start.
В этом случае вам необходимо перезапустить или пересобрать контейнер из образа Docker.
Здесь все изменения, которые вы внесли в свой контейнер, будут потеряны, а новый контейнер из базового образа должен содержать только исходные вещи.
Итак, как обновить образ Docker?
Как зафиксировать изменения в существующих образах Docker?
Синтаксис
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
docker commit 782ce39021a0 wordpress:new2
Как зафиксировать изменения в существующих образах Docker?
Здесь 782ce39021a0 – это идентификатор контейнера, в котором вы внесли изменения в конфигурацию, и имя образа wordpress с тегом new2.
Вы также можете сохранить изменения в существующем образе Docker.
Здесь мы создадим новый образ с другим тегом.
Пример
У меня есть один контейнер, который начал использовать образ WordPress по умолчанию.
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 782ce39021a0 wordpress:new "docker-entrypoint..." 5 days ago Up 2 seconds 0.0.0.0:1883->80/tcp wp3
Выполним вход в контейнер:
# docker exec -it 782ce39021a0 bash
К примеру, мне нужен редактор файлов nano
Проверяем, доступен ли он в текущей среде контейнера.
# which nano
Вывод оказался пустым
Установим Nano
apt-get install nano
Проверим еще разок:
# which nano /bin/nano
Теперь закоммитим изменения
docker commit 66a9db890230 wordpress:new.with.nano sha256:c3afbec42bfcb883189d967a504076a993172db99bfdae2725d3fe8ac7d1efec
Проверим образы:
docker images REPOSITORY TAG IMAGE ID CREATED SIZE wordpress new.with.nano c3afbec42bfc 50 seconds ago 799MB wordpress new2 204ca49e7475 About an hour ago 798MB
Теперь запустим новый контейнер с обновленным образом.
docker run -it --name wp-new -d -p 1882:80 wordpress:new.with.nano 8ba28a0f25dd750d0e6d3179f7587525f991a58bf6b2c233cc0c2dc3e05d4360
Выполним вход в контейнер:
docker exec -it wp-new bash root@8ba28a0f25dd:/var/www/html#
Проверим, появился ли nano
which nano /bin/nano