docker pull nginx:1.27
docker pull nginx@sha256:abc123...
-
태그 — 사람이 붙이는 이름. 언제든 다른 이미지를 가리킬 수 있다
-
다이제스트 — 내용의 해시. 절대 안 바뀐다
-
nginx:1.27 이 어제와 오늘 다른 이미지일 수 있다
- 보안 패치로 다시 빌드해 같은 태그로 올렸다면 그렇다
latest 는 "최신" 이 아니다
latest 는 그냥 기본 태그 이름이다 아무도 올리지 않으면 몇 년 전 이미지가 latest 일 수 있다
운영에서 latest 를 쓰면
-
노드마다 다른 이미지가 떠 있을 수 있다
-
롤백할 대상이 없다 (무엇으로 돌아갈지 모른다)
-
재현이 안 된다 — "어제는 됐는데" 의 원인을 찾을 수 없다
-
배포는 다이제스트나 불변 태그(커밋 SHA · 빌드 번호)로 고정한다
imagePullPolicy 와 엮인다
- 태그가 latest 면 — 기본이 Always (매번 레지스트리 확인) 그 외 태그면 기본이 IfNotPresent (있으면 안 받는다)
불변 태그를 쓰면 pull 이 줄고 배포가 빨라진다 반대로 가변 태그 + IfNotPresent 조합은 최악이다 — 노드에 이미 있는 옛 이미지를 그대로 쓴다
무엇이 떠 있는지 확인한다
docker inspect --format '{{index .RepoDigests 0}}' myapp:1.0
# myapp@sha256:... ← 실제로 무엇인지
장애 조사에서 "모든 노드가 같은 이미지인가" 를 확인하는 첫 명령이다 태그만 보면 알 수 없다
멀티 아키텍처
같은 태그가 여러 아키텍처를 가리킬 수 있다 (manifest list)
- linux/amd64 · linux/arm64 · … 클라이언트가 자기 플랫폼에 맞는 것을 골라 받는다
실무에서 걸리는 것
- 애플 실리콘에서 빌드한 이미지를 x86 서버에 올리면 안 돈다
- exec format error
- buildx 로 함께 빌드해 올린다
- docker buildx build --platform linux/amd64,linux/arm64 --push .
- 에뮬레이션 빌드(QEMU)는 매우 느리다 — 네이티브 러너를 쓰는 편이 낫다
태그 전략
-
불변 태그 — 커밋 SHA · 빌드 번호 · 시맨틱 버전 + 빌드 메타
- myapp:1.4.2-a1b2c3d
- 배포는 반드시 이것으로 한다
-
이동 태그 — latest · stable · 1.4 · main
- 사람이 참조하기 편하다. 배포에는 쓰지 않는다
-
두 가지를 함께 붙인다
- docker tag myapp:a1b2c3d myapp:latest
- 배포는 a1b2c3d, 사람은 latest
이미지 서명
다이제스트로 고정해도 '누가 만든 것인지' 는 알 수 없다 레지스트리가 뚫리면 다이제스트째로 바꿔치기될 수 있다
cosign sign --key ... myapp@sha256:...
cosign verify --key ... myapp@sha256:...
배포 시점에 서명을 검증하면 파이프라인 밖에서 만든 이미지를 막는다 공급망 보안(SBOM·provenance)과 같은 묶음이다
면접 함정
- ❌ "latest는 항상 최신 버전" → 기본 태그 이름일 뿐이다.
- ❌ "태그가 같으면 같은 이미지" → 다이제스트가 아니면 보장되지 않는다.