Docker
Docker 이미지 업데이트를 digest로 확인하기
같은 태그의 이미지도 내용이 바뀔 수 있다. Docker digest는 정확히 어떤 이미지를 쓰고 있는지 알려준다.
Docker에서 이미지를 관리할 때 가장 헷갈리는 부분은 태그의 의미다. latest 태그는 매일 바뀔 수 있고, 버전 태그도 특정 이미지의 고정 스냅샷을 보장하지 않는다. 실제로 어떤 이미지를 실행하고 있는지 확인하려면 digest를 봐야 한다.
Digest란 무엇인가
Docker digest는 이미지의 SHA256 해시값이다. 이미지의 내용이 조금이라도 다르면 digest도 완전히 달라진다. 반면 태그는 어떤 이미지를 가리키는 별칭일 뿐이고, 같은 태그가 여러 이미지를 가리킬 수 있다.
예를 들어 nginx:1.24 태그가 처음엔 2024년 1월에 빌드된 이미지를 가리켰다가, 나중에 보안 패치가 나오면서 새로운 이미지를 가리키게 될 수 있다. 그런데 로컬에 1.24 태그가 캐시되어 있으면, 실제로 최신 버전을 쓰고 있는지 알 수 없다.
# 현재 실행 중인 이미지의 digest 확인
docker inspect nginx:1.24 | grep -i digest
# 또는 더 간단하게
docker images --digests
실제 문제: 환경별 이미지 불일치
로컬 머신에서는 오래된 캐시를 쓰고 있는데, 서버에는 새 버전이 배포되었다는 상황이 자주 생긴다. 특히 docker pull을 자동으로 실행하지 않는 환경에서는 더 심하다.
운영 중에 이런 상황을 발견하려면, 실행 중인 컨테이너의 digest를 직접 확인해야 한다.
# 실행 중인 컨테이너가 쓰는 이미지의 digest
docker inspect <container_id> | grep -A 5 '"Image"'
# 또는 이미지 목록에서 확인
docker images --digests | grep nginx
Digest를 명시적으로 쓰기
Tag 대신 digest를 명시하면 정확히 어떤 이미지를 쓸지 완벽하게 제어할 수 있다. Kubernetes나 Docker Compose를 쓸 때 이 방식을 자주 본다.
# 태그로 실행
docker run nginx:1.24
# Digest로 실행 (권장)
docker run nginx@sha256:abc123...
Digest 방식의 장점은 무엇을 실행하는지 100% 명확하다는 것이다. 누군가 같은 태그를 새 이미지로 갱신해도, 내 설정에는 영향이 없다.
Digest 확인 워크플로우
배포할 때는 다음 순서로 확인하는 게 안전하다.
- 빌드할 이미지의 digest를 메모해두기
docker build -t myapp:v1.0 .
docker images --digests | grep myapp
- 배포 설정에 digest 기록하기
image: myapp@sha256:abc123...
- 배포 후 실제 이미지 확인하기
docker inspect <container> | grep -i image
태그와 Digest 함께 쓰기
실제로는 가독성을 위해 태그와 digest를 함께 쓰는 경우가 많다.
image: nginx:1.24@sha256:abc123...
이렇게 하면 태그로 대략 어떤 버전인지 알 수 있고, digest로 정확히 어떤 이미지인지 알 수 있다.
정리
Docker를 운영할 때 digest 없이 태그만 믿으면 위험하다. 특히 여러 환경에서 같은 이미지를 쓸 때는 더욱 그렇다. 중요한 배포는 digest를 명시해서 불확실성을 없애자. 로컬에서 테스트할 때도 digest로 확인하면, 나중에 운영에서 일어날 수 있는 환경 차이를 미리 발견할 수 있다.