Короткий ответ
`docker build` собирает образ из Dockerfile и присваивает ему локальное имя и тег; `docker push` отправляет этот образ в удалённый registry, откуда его потом можно скачать на любом сервере или в кластере; тег нужен, чтобы однозначно идентифицировать конкретную версию образа.
Как это работает подробнее
тег — это часть полного имени образа (`registry/repo:tag`), которая обычно соответствует версии приложения или хэшу коммита. `docker push` загружает слои образа в registry (Docker Hub, GitHub Container Registry, ECR и т.п.), делая их доступными для других машин.
Пример кода
example.sh
docker build -t registry.example.com/myapp:1.5.0 .
docker push registry.example.com/myapp:1.5.0Что использовать на практике
- На практике. в CI-пайплайнах тег часто формируют из `CI_COMMIT_SHORT_SHA` или семантической версии, чтобы каждый собранный образ был уникальным и отслеживаемым до конкретного коммита. Это также основа для отката — можно развернуть образ с предыдущим тегом.
- Пример. Ожидаемое поведение: после выполнения команд в registry по адресу `registry.example.com/myapp` появляется новый тег `1.5.0`, который можно увидеть в веб-интерфейсе registry или командой `docker pull registry.example.com/myapp:1.5.0` с другой машины.
Подводные камни
- Частые ошибки. пушат образ без тега (тогда он получает тег `latest` по умолчанию), из-за чего невозможно понять, какая именно версия кода сейчас в проде; забывают выполнить `docker login` перед `push`, получая ошибку авторизации.