Глиф Учебники

Как обновить контейнер до новой версии образа

Справочник · Docker · 2 минуты чтения

Контейнер не обновляется сам: он навсегда привязан к тому образу, из которого создан. Обновление — это новый образ и новый контейнер с теми же настройками. Данные в томах и подключённых папках при этом сохраняются.

Как обновить

Порядок зависит от того, как запущен контейнер: через Docker Compose или командой docker run.

Docker Composepull и up -d

В папке проекта:

Bash
docker compose pull
docker compose up -d
docker image prune

pull скачивает свежие версии образов, up -d пересоздаёт только те контейнеры, чей образ изменился, image prune удаляет старые образы, которые больше не нужны. Обновить один сервис: docker compose pull web, затем docker compose up -d web.

Дальше: «Новая версия — это новый тег»

Запущен через docker runpull и пересоздание

Bash
docker pull nginx:alpine
docker stop web
docker rm web
docker run -d --name web -p 8080:80 -v "$HOME/site":/usr/share/nginx/html:ro --restart unless-stopped nginx:alpine
docker image prune

Главное — создать контейнер с теми же ключами, что и раньше: порты, переменные, тома, политика перезапуска. Если команда запуска не сохранилась, посмотрите настройки старого контейнера до его удаления:

Bash
docker inspect web

Нужное — в разделах Config.Env (переменные), HostConfig.PortBindings (порты), Mounts (тома и папки), HostConfig.RestartPolicy. Чтобы в следующий раз не восстанавливать по кусочкам, перенесите сервис в compose.yaml (урок Docker Compose).

Если данные лежат в слое контейнера, а не в томе, docker rm удалит их. Перед первым обновлением проверьте в docker inspect web раздел Mounts: там должны быть все папки с данными. Если чего-то нет — сначала скопируйте данные (docker cp) и подключите том.

Новая версия — это новый тег

docker pull обновляет образ в пределах тега: nginx:alpine — до свежего nginx:alpine, postgres:18 — до последнего выпуска 18. Чтобы перейти на другую основную версию, поменяйте тег в команде запуска или в compose.yaml (postgres:17 → postgres:18).

Базы данных при смене основной версии часто не открывают файлы старой версии — контейнер не запустится или потребует обновления данных. Перед такой сменой сделайте дамп базы и прочитайте инструкцию к образу на Docker Hub.

Откат

Если новая версия работает плохо, верните прежнюю, указав её точный тег, например nginx:1.30.4 вместо nginx:1.30, и пересоздайте контейнер. Откат возможен, только если данные совместимы со старой версией — у баз данных после обновления это не всегда так. Поэтому на серверах удобно указывать точные теги и повышать их осознанно.

Как проверить, что обновилось

Bash
docker ps
docker image ls nginx

Столбец CREATED у контейнера покажет, что он новый. Увидеть, на каком образе работает контейнер: docker inspect --format '{{.Image}}' web — идентификатор должен совпасть с идентификатором свежего образа.

Есть программы, которые обновляют контейнеры автоматически по расписанию. Они удобны для домашних серверов, но на рабочих серверах обновление лучше запускать самому — чтобы видеть, что изменилось, и иметь возможность откатиться.