컨테이너 용어 사전
이미지latest · digest · imagePullPolicy

태그와 다이제스트

태그는 언제든 다른 이미지를 가리킬 수 있다. latest는 최신이라는 뜻이 아니다.

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는 항상 최신 버전" → 기본 태그 이름일 뿐이다.
  • "태그가 같으면 같은 이미지" → 다이제스트가 아니면 보장되지 않는다.

함께 보면 좋은 용어

노트에서 맥락과 함께 보기 — 이미지와 레이어 — 빌드가 빨랐다 느렸다 하는 이유