빠른 비교
| 참조 방식 | 의미 |
|---|---|
ubuntu:24.04 | 태그가 가리키는 현재 이미지 |
ubuntu@sha256:... | digest로 고정한 특정 이미지 |
my-app:1.4.2 | 사람이 읽기 쉬운 버전 태그 |
my-app:latest | 기본값이지만 재현성 낮음 |
참조 방식
tag는 이름표이고 digest는 내용 주소다
Docker 이미지 태그는 사람이 읽기 쉬운 별칭입니다. node:22-alpine, postgres:16, ubuntu:24.04처럼 버전과 변형을 표현하기 좋습니다. 하지만 태그는 레지스트리에서 다른 이미지로 다시 가리킬 수 있습니다. 같은 태그를 다시 pull했을 때 이전과 다른 레이어를 받을 수 있다는 뜻입니다.
docker pull ubuntu:24.04digest는 이미지 내용에 대응하는 immutable identifier입니다. 같은 digest는 같은 이미지 버전을 가리키므로, 배포 재현성이 필요한 곳에서 특정 버전을 고정하는 데 씁니다.
docker pull ubuntu@sha256:2e863c44...digest pinning은 재현성을 얻는 대신 업데이트 책임을 가져온다
digest로 고정하면 베이스 이미지가 조용히 바뀌지 않습니다. 보안 스캔 결과와 배포된 이미지가 일치해야 하는 운영 환경에서는 장점입니다. 반면 upstream 이미지가 보안 패치를 받아도 digest는 자동으로 바뀌지 않습니다. 업데이트를 받으려면 새 digest를 확인하고 Dockerfile이나 Compose 파일을 직접 갱신해야 합니다.
FROM ubuntu@sha256:2e863c44b718727c860746568e1d54afd13b2fa71b160f5cd9058fc436217b30재현성이 중요한 운영 이미지는 digest를 검토하고, 개발 환경에서는 관리 편의상 명확한 버전 태그를 쓰는 식으로 나누면 됩니다.
latest는 기본값이지 운영 전략이 아니다
태그를 생략하면 기본적으로 latest를 사용합니다. 하지만 latest가 가장 최신 안정 버전이라는 보장은 없습니다. 이미지 작성자가 어떤 정책으로 태그를 갱신하는지에 따라 달라집니다. 운영 배포에서 latest를 쓰면 배포 diff 없이 실행 이미지가 바뀔 수 있습니다.
services:
app:
image: my-registry.example.com/app@sha256:abc123...태그는 사람이 읽는 버전 관리에, digest는 실제 배포 재현성에 쓰는 식으로 역할을 나눠야 합니다.
체크포인트
| 상황 | 적합한 선택 |
|---|---|
| 빠른 개발 테스트 | 명확한 버전 태그 |
| 운영 배포 재현성 | digest pinning |
| 자동 보안 패치 추적 | 태그 업데이트와 재빌드 파이프라인 |
| 배포 diff 명확화 | digest 변경을 코드 리뷰에 포함 |
| 사람이 읽는 릴리스 표기 | semver 태그 |
| 습관적인 기본값 | latest 사용 피하기 |
주의할 점
digest pinning은 이미지를 고정하지만 보안 업데이트를 자동으로 받지 않습니다. 운영에서 digest를 고정했다면 새 베이스 이미지 digest를 확인하고 재빌드하는 주기까지 함께 운영해야 합니다.
태그와 digest를 함께 기록하면 사람이 읽는 버전과 실제 내용 주소를 동시에 추적할 수 있습니다. 다만 최종 실행 기준은 digest이므로, 태그만 보고 "같은 이미지"라고 판단하면 안 됩니다.
참고 링크
2 sources