Docker / Image push ба pull

Image push ба pull

Өмнөх хичээлд registry-ийн тухай ерөнхийд нь үзсэн. Энэ хичээлд docker tag, docker push, docker pull командуудыг дэлгэрэнгүй судалж, image version удирдах стратеги бичнэ.

docker tag

Tag нь image-д нэр ба хувилбар тавих команд:

bash
docker tag <эх_image> <шинэ_нэр>
bash
# Байгаа image-д шинэ tag нэмэх
docker tag myapp:local myusername/myapp:1.0.0

# Нэг image-д олон tag
docker tag myapp:local myusername/myapp:1.0.0
docker tag myapp:local myusername/myapp:latest
docker tag myapp:local myusername/myapp:stable

docker tag нь image-ийг хуулдаггүй — зөвхөн нэр нэмнэ. Нэг image ID-д олон tag байж болно:

bash
docker images myusername/myapp
# REPOSITORY          TAG       IMAGE ID       SIZE
# myusername/myapp    1.0.0     abc123def456   112MB
# myusername/myapp    latest    abc123def456   112MB
# myusername/myapp    stable    abc123def456   112MB

IMAGE ID нь ижил — зөвхөн нэр өөр.

docker push

bash
# Нэг tag push хийх
docker push myusername/myapp:1.0.0

# latest push хийх
docker push myusername/myapp:latest

Гаралт:

код
The push refers to repository [docker.io/myusername/myapp]
a3b4c5d6e7f8: Pushed
b2c3d4e5f6a7: Pushed
1.0.0: digest: sha256:abc123... size: 1234

Layer-ууд тус тусдаа upload хийгдэнэ. Өмнө нь push хийсэн layer байвал Layer already exists гэж харуулж, дахин upload хийхгүй.

docker pull

bash
# Хамгийн сүүлийн latest татах
docker pull myusername/myapp

# Тодорхой version татах
docker pull myusername/myapp:1.0.0

# Digest-ээр татах (хамгийн найдвартай)
docker pull myusername/myapp@sha256:abc123def456...

docker run нь image байхгүй бол автоматаар pull хийдэг. Гэхдээ тодорхой татахыг хянахын тулд docker pull тусдаа ажиллуулах нь дээр.

Image version удирдах стратеги

Semantic versioning

bash
docker tag myapp myusername/myapp:1.2.3
docker tag myapp myusername/myapp:1.2      # minor alias
docker tag myapp myusername/myapp:1        # major alias
docker tag myapp myusername/myapp:latest

Ингэснээр хэрэглэгч аль хэмжээний тогтвортой байдал хэрэгтэйгээсээ хамааран tag сонгоно:

  • myapp:1.2.3 — яг тэр version
  • myapp:1.2 — 1.2.x-ийн хамгийн сүүлийн patch
  • myapp:1 — 1.x.x-ийн хамгийн сүүлийн version
  • myapp:latest — хамгийн сүүлийн бүх зүйл

Git hash-аар tag тавих

bash
GIT_HASH=$(git rev-parse --short HEAD)
BUILD_DATE=$(date +%Y%m%d)

docker build -t myusername/myapp:${GIT_HASH} .
docker tag myusername/myapp:${GIT_HASH} myusername/myapp:${BUILD_DATE}
docker tag myusername/myapp:${GIT_HASH} myusername/myapp:latest

docker push myusername/myapp:${GIT_HASH}
docker push myusername/myapp:${BUILD_DATE}
docker push myusername/myapp:latest

Ямар commit-оос ямар image гарсныг мэдэж болдог болно.

latest tag-ийн аюул

latest бол ердийн tag — ямар нэг тусгай утгагүй, Docker автоматаар ашигладаг анхдагч нэр.

Асуудал:

bash
# Сервер A дээр
docker pull myapp:latest   # v1.0.0 татна

# 2 долоо хоногийн дараа сервер B дээр
docker pull myapp:latest   # v2.0.0 татна — өөр version!

latest нь хэдийд ч өөрчлөгдөж болдог тул:

bash
# ❌ Production-д аюултай
docker run myusername/myapp:latest

# ✅ Production-д найдвартай
docker run myusername/myapp:1.2.3

Практик дүрэм:

  • Development: latest хэрэглэж болно
  • Production: заавал тодорхой version эсвэл digest ашиглана
  • CI/CD: commit hash-ийг tag болгох нь хамгийн найдвартай

Digest — хамгийн найдвартай

Tag өөрчлөгдөж болох ч digest нь өөрчлөгдөхгүй:

bash
# Digest харах
docker inspect --format='{{index .RepoDigests 0}}' myusername/myapp:1.0.0
# myusername/myapp@sha256:a1b2c3d4e5f6...

# Digest-ээр pull хийх
docker pull myusername/myapp@sha256:a1b2c3d4e5f6...

Нэвтрэх ба гарах

bash
# Docker Hub-д нэвтрэх
docker login

# Тодорхой registry-д нэвтрэх
docker login ghcr.io
docker login registry.example.com

# Гарах
docker logout
docker logout ghcr.io

Нэвтэрсний дараа credentials ~/.docker/config.json-д хадгалагдана.

Local image цэвэрлэх

bash
# Тодорхой image устгах
docker rmi myusername/myapp:1.0.0

# Ашиглагдаагүй бүх image устгах
docker image prune

# Бүх ашиглагдаагүй Docker объект устгах
docker system prune

Дараагийн хичээлд:

Ажиллаж байгаа container-ийг inspect хийх, debugging хийх аргуудыг үзнэ.