Image push ба pull
Өмнөх хичээлд registry-ийн тухай ерөнхийд нь үзсэн. Энэ хичээлд docker tag, docker push, docker pull командуудыг дэлгэрэнгүй судалж, image version удирдах стратеги бичнэ.
docker tag
Tag нь image-д нэр ба хувилбар тавих команд:
docker tag <эх_image> <шинэ_нэр>
# Байгаа 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 байж болно:
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
# Нэг 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
# Хамгийн сүүлийн 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
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— яг тэр versionmyapp:1.2— 1.2.x-ийн хамгийн сүүлийн patchmyapp:1— 1.x.x-ийн хамгийн сүүлийн versionmyapp:latest— хамгийн сүүлийн бүх зүйл
Git hash-аар tag тавих
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 автоматаар ашигладаг анхдагч нэр.
Асуудал:
# Сервер A дээр
docker pull myapp:latest # v1.0.0 татна
# 2 долоо хоногийн дараа сервер B дээр
docker pull myapp:latest # v2.0.0 татна — өөр version!
latest нь хэдийд ч өөрчлөгдөж болдог тул:
# ❌ 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 нь өөрчлөгдөхгүй:
# Digest харах
docker inspect --format='{{index .RepoDigests 0}}' myusername/myapp:1.0.0
# myusername/myapp@sha256:a1b2c3d4e5f6...
# Digest-ээр pull хийх
docker pull myusername/myapp@sha256:a1b2c3d4e5f6...
Нэвтрэх ба гарах
# 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 цэвэрлэх
# Тодорхой image устгах
docker rmi myusername/myapp:1.0.0
# Ашиглагдаагүй бүх image устгах
docker image prune
# Бүх ашиглагдаагүй Docker объект устгах
docker system prune
Дараагийн хичээлд:
Ажиллаж байгаа container-ийг inspect хийх, debugging хийх аргуудыг үзнэ.