Docker
[Docker] 2. 도커 이미지(Docker Image) 3분 이해
big whale
2024. 2. 23. 15:09
Docker Image
- 도커 이미지는 추상화된 개념이기 때문에 비유적으로 이해하면 편하다.
- 도커 이미지는 클래스, 정지한 컨테이너라고 보면 된다.
- 이미지라고 해서 jpg, png 형식의 그림 이미지를 이야기하는게 아니다. 그 고정된 상태를 의미하는 차원에서의 이미지이다.
- Image: 빌드 타임 생성물
- Container: 런타임 생성물
특정 이미지를 참조해 컨테이너 생성했으면, 해당 이미지는 해당 컨테이너가 삭제되기 전까지 삭제 불가
컨테이너들은 호스트의 커널을 공유하기 때문에, 이미지 파일 내에는 특정 OS의 파일시스템, OS 관련 파일, app 관련 파일 뿐이다.
OS별 이미지 크기비교
- alpine linux 이미지: 4MB
- ubuntu 이미지: 120MB
- MS .NET 이미지: 2GB
공식, 비공식 이미지 저장소
- 공식: 최신 버전, 좋은 코드
- docker hub의 top-level namespace에 위치하는 이미지들
- 예시
- nginx(https://hub.docker.com/_/nginx)
- redis(https://hub.docker.com/_/redis)
- mongo(https://hub.docker.com/_/mongo)
- 비공식: 개인이 만든 이미지, 내가 만든 이미지 등
이미지 명령어
docker image ls -q // host 내의 모든 이미지의 ID값들을 반환함.
docker image rm ${docker image ls -q} -f // 모든 이미지 삭제
이미지 네이밍과 태깅
저장소의 이미지 호스트로 당겨오고 싶을 때,
docker image pull <repository>:<tag> // 특정 tag의 이미지를 받아오고 싶을 때
docker image pull -a <repository>:<tag> // 해당 이미지의 모든 버전 받아오고 싶을 때
tag
- 이미지의 버전을 명시해주는 역할
- tag에 latest 붙인다고 해서 해당 이미지의 가장 최신버전을 받아오는게 아니라, 단지 tag가 latest인 이미지를 받아오는 것이다.
- tag 명시 안할 경우 자동으로 latest로 적용된다.
- image ID는 같지만 tag만 다른 동일한 이미지를 만들 수 있다.
이미지를 이루는 레이어들
- 이미지는 느슨하게 연결된 읽기전용(read-only) 레이어들의 묶음이다.
- 레이어를 확인하기 위해 우분투 이미지를 pull 받아보자.
- 5번의 Pull을 통해 각각 레이어를 받아오는 것을 확인할 수 있다.
이미지 검사 방법
docker image inspect <image name> // 이미지 이름을 통해 이미지 식별
docker image inspect <imageId> // 이미지 id를 통해 이미지 식별
검사 결과
이미지 상세한 내부 구조
- 모든 도커 이미지는 처음에 하나의 레이어로 시작한다. 변경되고 추가됨에 따라 새 레이어들이 쌓인다.
레이어는 누가 쌓는걸까?
storage driver
- 레이어를 쌓는 역할을 맡음
- Linux: AUFS, overlay2, devicemapper, btrfs, zfs
- Windows: windowsfilter
이미지를 digest로 pull 받는법
- digest란?
- 이미지에 1대1 대응되는 해시값
- 이미지 코드 변경시 digest도 변경됨 -> immutable한 성질
- digest 도입 배경: 특정 버전에 버그가 있어 수정 후 같은 tag로 한 후 저장소로 push했을 때, 프로덕션 시스템들 중 어느 것이 수정된 이미지인지 알 수 없다는 문제(같은 tag 이므로)
- digest 도입 이후: digest가 123인 버그 이미지를 수정해서 digest가 1234인 이미지 생성 후 같은 태그로 push. 이후 수정본 pull 받고 싶을 때, digest가 1234인 이미지를 받으면 된다.
도커 허브에서는 유저가 push하여 받은 레이어의 해시 결과, 함께 보내진 레이어의 해시값을 비교해서 같은지 확인한다.
- 문제상황:
- 이미지를 push, pull할 때 대역폭과 저장소 공간 효율을 위해 레이어를 압축시킨다.
- 압축시 레이어가 바뀌면 내용물이 바뀌면서 레이어의 해시값도 바뀌게 된다.
- 기존 해시값과 압축된 레이어의 해시 결과가 달라지게 된다.
- 해결: distributed hash 도입
distribution hash
- 압축된 레이어의 해시값을 의미함
- 레이어 push, pull 될 때 미리 구해놓은 distribution hash도 함께 동봉되어 검증에 사용됨
- 위 이미지에서 Pull complete 왼편의 해시값이 distribution hash이다.