도커 이미지와 이미지 레이어
도커 이미지 및 이미지 레이어에 대한 내용을 알아봅니다.
(참고: ‘도커 교과서’책)
도커 이미지에는 우리가 패키징에 포함시킨 모든 파일이 들어 있다. 이들 파일은 나중에 컨테이너의 파일 시스템을 형성한다. 이 외에도 이미지에는 자신에 대한 여러 메타데이터 정보도 들어 있다. 이 정보중에는 이미지가 어떻게 빌드됐는지에 대한 간단한 이력도 포함된다. 이 정보를 이용하면 이미지를 구성하는 각 레이어는 무엇이고 이들 레이어가 어떤 명령으로 빌드됐는지 알 수 있다.
docker image history 이미지명
위 명령을 입력하면 한 줄 마다 한 레이어에 대한 정보가 출력 된다. 다음은 나의 환경에서 출력한 이미지 히스토리 중 처음 부분을 발췌한 것이다.
$ docker image history web-ping
IMAGE CREATED CREATED BY SIZE COMMENT
30349d68468d 10 minutes ago CMD ["node" "/web-ping/app.js"] 0B buildkit.dockerfile.v0
<missing> 10 minutes ago COPY app.js . # buildkit 846B buildkit.dockerfile.v0
<missing> 10 minutes ago WORKDIR /web-ping 0B buildkit.dockerfile.v0
<missing> 10 minutes ago ENV INTERVAL=3000 0B buildkit.dockerfile.v0
<missing> 10 minutes ago ENV METHOD=HEAD 0B buildkit.dockerfile.v0
<missing> 10 minutes ago ENV TARGET=blog.sixeyed.com 0B buildkit.dockerfile.v0
CREATED BY 항목은 해당 레이어를 구성한 Dockerfile 스크립트의 인스트럭션이다. Dockerfile 인스트럭션과 이미지 레이어는 1:1 관계를 갖는다.
도커 이미지는 이미지 레이어가 모인 논리적 대상이다. 레이어는 도커 엔진의 캐시에 물리적으로 저장된 파일이다. 이 점이 중요한 이유는, 이미지 레이어는 여러 이미지와 컨테이너에서 공유되기 때문이다. 만약 Node.js 애플리케이션이 실행되는 컨테이너를 여러 개 실행한다면 이들 컨테이너는 모두 Node.js 런타임이 들어 있는 이미지 레이어를 공유한다.
diamol/node 이미지는 최소한의 운영체제 레이어와 Node.js 런타임을 포함한다. 리눅스 이미지는 약 75MB의 디스크 용량을 차지한다. 우리가만든 web-ping 이미지는 diamol/node 이미지를 기반으로 하므로 기반 이미지의 모든 레이어를 포함한다. Dockerfile 스크립트의 FROM 인스트럭션의 의미가 바로 이것이다. 기반 레이어 위에 추가한 app.js 파일은 불과 몇 KB에 지나지 않는다.
docker image ls
위 명령어로 각 이미지의 용량을 확인할 수 있다.
SIZE 항목에 용량이 표시되는데 이 수치는 이미지의 논리적 용량이지 해당 이미지가 실제로 차지하는 디스크 용량을 나타내는 것은 아니다. 다른 이미지와 레이어를 공유하면 여기에 나온 수치보다 디스크 용량을 훨씬 덜 차지한다.
docker system df
위 명령으로 이미지 캐시에 실제 사용된 디스크 용량을 확인할 수 있다.
이렇게 절약되는 디스크 공간은 대개 런타임 등 같은 기반 레이어를 공유하는 애플리케이션의 숫자가 많을수록 더욱 늘어난다. 이들 기반 레이어가 자바, 닷넷, PHP 그 무엇이든 도커의 동작방식은 같다.
이미지 레이어를 여러 이미지가 공유한다면, 공유되는 레이어는 수정할 수 없어야 한다. 만약 이미지의 레이어를 수정할 수 있다면 그 수정이 레이어를 공유하는 다른 이미지에도 영향을 미치게 된다. 도커는 이미지 레이어를 읽기 전용으로 만들어 두어 이런 문제를 방지한다. 이미지를 빌드하면서 레이어가 만들어지면 레이어는 다른 이미지에서 재사용될 수 있다. 그러나 레이어를 수정할수는 없다. 이 점은 Dockerfile 스크립트를 최적화해 도커 이미지의 용량을 줄이고 빌드를 빠르게 만드는 기법에서 특히 잘 활용된다.