본문 바로가기

DevOps/도커(Docker)

도커 컨테이너 이미지

도커 이미지를 내려받아 컨테이너로 실행하고 도커 이미지와 컨테이너를 삭제하는 법

이미지 찾기 > 실행하기 > 디렉터리와 연결하기 > 삭제하기

먼저 컨테이너 이미지와 컨테이너의 관계를 정리해보자. 컨테이너 이미지는 베이그런트 이미지와 유사하다. 베이그런트 이미지는 이미지 자체로는 사용할 수 없고 베이그런트를 실행할 때 추가해야만 사용할 수 있다. 이와 마찬가지로 컨테이너 이미지도 그대로는 사용할 수 없고 도커와 같은 CRI로 불러들어야 컨테이너가 실제로 작동한다. 이는 실행파일과 실행된 파일 관계로 볼 수 있다. 따라서 컨테이너를 삭제할 때는 내려받은 이미지와 이미 실행된 컨테이너를 모두 삭제해야만 디스크의 용량을 온전히 확보할 수 있다.

 

컨테이너 런타임 인터페이스(CRI)는 클러스터 컴포넌트를 다시 컴파일하지 않아도 
Kubelet이 다양한 컨테이너 런타임을 사용할 수 있도록 하는 플러그인 인터페이스다.

 

컨테이너 이미지

이미지는 레지스트리라고 하는 저장소에 모여있다. 레지스트리는 도커 허브처럼 공개도;ㄴ 유명 레지스트리일 수도 있고, 내부에 구축한 레지스트리일 수도 있다.

 

이미지 검색하기

$ docker search nginx

 

 

 

검색한 이미지 내려받기

$ docker pull nginx

이미지를 내려받을 때 사용하는 태그, 레이어, 이미지의 고유 식별 값등을 볼 수 있다.

 

  • 태그(tag): Using default tag와 함께 뒤에 따라오는 태그 이름을 통해 이미지를 내려받을때 사용한 태그를 알 수 있다. 아무런 조건을 주지 않고 이미지 이름만으로 pull을 수행하면 기본으로 latest 태그가 적용된다. latest 태그는 가장 최신 이미지를 의미한다. 따라서 내려받는 이미지 버전이 다를 수 있다.
  • 레이어(layer): 42c077~,62c70f~ 등은 pull을 수행해 내려받은 레이어이다. 하나의 이미지는 여러개의 레이어로 이루어져 있어서 레이어마다 Pull complete 메세지가 발생한다.
  • 다이제스트(digest): 이미지의 고유 식별자로, 이미지에 포함된 내용과 이미지의 생성 환경을 식별할 수 있다. 식별자는 해시(hash) 함수로 생성되며 이미지가 동일한지 검증하는 데 사용한다. 이름이나 태그는 이미지를 생성할 때 임의로 지정하기 때문에 이름이나 태그가 같다고 해서 같은 이미지라고 할 수 없다.그러나 다이제스트가 같은 이미지는 이름이나 태그가 다르더라도 같은 이미지이다.
  • 상태(Status): 이미지를 내려받은 레지스츠리, 이미지, 태그등의 상태 정보를 확인할 수 있다. 형식은 ‘레지스트리 이름/이미지 이름:태그'이다.

 

 

이미지 레이어의 구조

앞서 컨테이너 이미지는 실행 파일이라고 했는데, 사실 이미지는 애플리케이션과 각종 파일을 담고있다는 점에서 ZIP 같은 압축파일에 가깝다. 그런데 압축파일은 압축한 파일의 개수에 따라 전체 용량이 증가한다. 하지만 이미지는 같은 내용일 경우 여러 이미지에 동일한 레이어를 공유하므로 전체 용량이 감소한다.

 

1. stable 이미지 내려받기

$ docker pull nginx:stable

실행 결과에 42c077c10790: Already exists 라고 나오는데 42c077c10790 레이어가 이미 존재한다는 뜻이다. 앞에서 내려받은 nginx:latest 이미지에 해당 레이어가 있기 때문이다. 따라서 이 부분을 내려받지 않고 재사용한다.

 

 

2. 내려받은 이미지 조회

$ docker images nginx

stable 태그와 latest 태그의 두 개 이미지가 검색된다. 두 이미지 전부 사이즈가 142MB 이고 합치면 248MB이지만 두 이미지가 공유하는 레이어가 있다면 실제로 차지하는 용량은 더 적다.

 

 

3. stable 이미지가 어떤 과정을 거쳐 생성되었는지 확인한다. 

$ docker history nginx:stable

생성과정에서 단계별로 용량을 얼마나 차지하는지 자세한 이력이 나오므로 이미지가 차지하는 실제 용량을 확인할 수 있다.

 

 

4. latest 이미지가 어떤 과정을 거쳐 생성되었는지 확인한다.

$ docker history nginx:latest

80.4MB에 해당하는 레이어를 두 이미지가 공유하고 있는것을 확인할 수 있다.

이처럼 도커로 작성된 컨테이너는 레이어를 재사용하기 때문에 여러 이미지를 내려받더라도 디스크 용량을 효율적으로 사용할 수 있다. 참고로 docker history에서 나오는 내용들은 도커 컨테이너 이미지 자체를 만드는 명령을 보여주는것이다.

 

 

 

 

 

 

 

출처:

"컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커 - 조훈,심근우,문성주 지음/길벗출판사" 책을 기반으로 실습한 내용입니다.