이미지 레이어의 이해
Docker 이미지는 레이어드 파일 시스템 (layered filesystem) 을 사용하여 빌드됩니다. 각 레이어는 파일 시스템 변경 사항의 집합을 나타냅니다. 이러한 레이어 방식 덕분에 Docker 는 저장 공간과 네트워크 사용량을 효율적으로 관리할 수 있습니다. 이 개념을 살펴보겠습니다.
먼저 이전에 가져온 Nginx 이미지의 레이어를 검사해 보겠습니다.
docker inspect --format='{{.RootFS.Layers}}' nginx
다음과 유사한 출력이 표시됩니다.
[sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f sha256:e379e8aedd4d72bb4c529a4ca07a4e4d230b5a1d3f7a61bc80179e8f02421ad8 sha256:b5357ce95c68acd9c9672ec76e3b2a2ff3f8f62a2bcc1866b8811572f4d409af]
이 긴 문자열들 (SHA256 해시라고 함) 각각은 이미지의 레이어를 나타냅니다. 각 레이어는 이미지를 빌드하는 데 사용된 Dockerfile 의 명령어 하나하나에 대응합니다.
레이어를 더 잘 이해하기 위해 간단한 커스텀 이미지를 만들어 보겠습니다. 먼저 현재 디렉토리에 Dockerfile이라는 새 파일을 생성합니다.
nano Dockerfile
파일에 다음 내용을 추가합니다.
FROM nginx
RUN echo "Hello from custom layer" > /usr/share/nginx/html/hello.html
이 Dockerfile 은 두 가지 작업을 수행합니다.
- 이전에 가져온 Nginx 이미지에서 시작합니다 (
FROM nginx).
- 이미지에 새 파일을 추가합니다 (
RUN echo...).
파일을 저장하고 종료합니다 (nano 에서는 Ctrl+X 를 누른 다음 Y, Enter 를 누르면 됩니다).
이제 이 이미지를 빌드해 보겠습니다.
docker build -t custom-nginx .
출력 예시:
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM nginx
---> 5ef79149e0ec
Step 2/2 : RUN echo "Hello from custom layer" > /usr/share/nginx/html/hello.html
---> Running in 2fa43e649234
Removing intermediate container 2fa43e649234
---> 73b62663b5c3
Successfully built 73b62663b5c3
Successfully tagged custom-nginx:latest
이 명령어는 Dockerfile 을 기반으로 새 이미지를 빌드하고 custom-nginx라는 태그를 붙입니다. 끝에 있는 .은 Docker 에게 현재 디렉토리에서 Dockerfile 을 찾으라고 지시하는 것입니다.
이제 커스텀 이미지의 레이어를 검사해 보겠습니다.
docker inspect --format='{{.RootFS.Layers}}' custom-nginx
이 이미지가 원래 Nginx 이미지보다 레이어가 하나 더 많다는 것을 알 수 있습니다. 이 추가된 레이어는 RUN 명령어로 인해 발생한 변경 사항을 나타냅니다.
레이어를 이해하는 것이 중요한 이유는 다음과 같습니다.
- 레이어는 캐시되므로 유사한 이미지의 빌드 속도가 빨라집니다.
- 레이어는 이미지 간에 공유되므로 디스크 공간이 절약됩니다.
- 이미지를 푸시 (push) 하거나 풀 (pull) 할 때 변경된 레이어만 전송하면 됩니다.