본문 바로가기

About/Docker

[Docker] 이미지 레이어 구조

Dockerfile을 빌드하여 Docker 이미지를 작성하면 Dockerfile의 명령별로 이미지를 작성합니다.

작성된 여러 개의 이미지는 레이어 구조로 되어 있습니다.

 

다음은 4개의 명령으로 구성된 Dockerfile입니다.

# Step 1 : Ubuntu (베이스 이미지)
FROM ubuntu:latest

# Step 2 : Nginx 설치
RUN apt-get update && apt-get install -y -q nginx

# STEP 3 : 파일 복사
COPY index.html /usr/share/nginx/html

# STEP 4: Nginx 시작
CMD ["nginx", "-g", "daemon off;"]

Dockerfile과 같은 디렉토리에 index.html를 임의로 구성하고 docker build를 통하여 이미지를 작성합니다.

docker build -t webap:1.0 .

실행 결과

Sending build context to Docker daemon  3.072kB
Step 1/4 : FROM ubuntu:latest
 ---> 7e0aa2d69a15
 
Step 2/4 : RUN apt-get update && apt-get install -y -q nginx
 ---> Running in d553b2e80394
 
 ~~중략~~
 
Removing intermediate container d553b2e80394
 ---> f5abca047313
 
Step 3/4 : COPY index.html /usr/share/nginx/html
 ---> 55ec8ca97c95
 
Step 4/4 : CMD ["nginx", "-g", "daemon off;"]
 ---> Running in 458dcf5d10de
Removing intermediate container 458dcf5d10de
 ---> 3a649f4fdb4e
 
Successfully built 3a649f4fdb4e
Successfully tagged webap:1.0

로그를 확인하면 Dockerfile 명령어 한 줄 마다 이미지(Layer)가 작성되는 것을 알 수 있습니다. (step 1/4~4/4)

또한 중간중간에 컨테이너가 생성되었다가, 삭제되는 것을 확인할 수 있는데, 이는 Docker에서 이미지 레이어를 생성할 때 컨테이너를 임시로 생성하였다가, 명령어를 실행한 뒤 해당 컨테이너를 통하여 이미지를 작성하고, 컨테이너를 삭제하는 것을 알 수 있습니다.

Docker 이미지 구조

Docker의 컨테이너는 Union File System을 기반으로 동작하기 때문에 복수의 레이어로 구성되어 있으며, 작성한 이미지 레이어는 다른 이미지와도 공유됩니다.  

en.wikipedia.org/wiki/UnionFS

 

UnionFS - Wikipedia

Unionfs is a filesystem service for Linux, FreeBSD and NetBSD which implements a union mount for other file systems. It allows files and directories of separate file systems, known as branches, to be transparently overlaid, forming a single coherent file s

en.wikipedia.org

따라서 공통의 베이스 이미지를 바탕으로 여러개의 이미지를 작성한 경우 베이스 레이어의 이미지가 공유됩니다. 이와 같이 이미지를 겹침으로써 Docker에서는 디스크의 용량을 효율적으로 이용합니다.

컨테이너의 이미지 공유


Docker 이미지 레이어의 구조에 대하여 알아보았습니다.