Docker - 실습으로 알아보는 Docker Image Layer 구조 (1)

박민준·2025년 5월 22일

layer

  • Docker Image는 Layer, Metadata로 구성됩니다.
    Layer에는 Docker layer와 Container layer로 또 한번 나눠집니다.

Docker layer vs Container layer

  • 위 layer는 읽기/쓰기 속성을 가질 수 있는데, Docker layer의 경우 Read only만 가능합니다.

Why❓

  • Image가 생성된 후 변경할 수 없는 상태로 유지되어야 신뢰성 있는 배포 및 일관된 실행 환경이 보장되기 때문입니다.
    이 덕분에, 캐싱, 공유, 빠른 배포 등이 가능해집니다.

Container layer

  • 컨테이너 레이어의 경우 도커 이미지를 통해 배포된 컨테이너에 해당됩니다.
    • 배포된 컨테이너에서는 작업이 가능하며, 즉 쓰기 작업이 가능합니다.(Writable)
  • 컨테이너 레이어는 컨테이너가 종료되는 경우 함께 제거됩니다.
    • 컨테이너에서 작업한 데이터가 사라지는 경우가, 컨테이너 레이어가 함께 제거되기 때문입니다.

1. Docker Layer 실습

busybox:latest 이미지를 통해 위 내용을 짚어보도록 하겠습니다.

  • image pull
    docker pull busybox:latest

  • inspect를 통해 busybox 이미지 metadata 확인
    docker inspect busybox:latest

  • RootFS.Layers에 sha256으로 시작하는 레이어가 존재함을 확인 가능합니다.
    이는 위에서 언급된 Docker layer에 속합니다.
    즉, 해당 레이어는 읽기만 가능하기에, 수정이 불가능 합니다.

Docker Layer Deep dive🌊

도커 이미지 레이어의 정보는 일반적으로 /var/lib/docker/image/overlay2/layerdb/sha256 디렉터리에 저장되며, 내부에는 inspect로 확인했던 것과 동일한 layer 정보가 담겨 있습니다.

2. Container Layer 실습

컨테이너 레이어는 쓰기 작업이 가능하다고 했었으며, 정말 가능한지 컨테이너의 tmp 디렉토리에 간단한 파일을 만드는 실습을 통해서 확인해보도록 하겠습니다.

  • 쉘 사용이 가능하도록 busybox 실행
    docker run -it --rm busybox sh

  • /tmp 로 이동 후, hi.txt 파일 생성

  • 컨테이너를 실행한 터미널은 그대로 둔 상태에서 다른 터미널을 열어, /var/snap/docker/common/var-lib-docker/overlay2 디렉터리로 접근합니다.
    접근 시, 아래와 같이 세개의 layer를 확인 가능합니다.

❓그런데, 86bed95... 레이어는 무엇일까?
❗해당 레이어가 바로 컨테이너 레이어입니다.
현재 docker run을 통해서 컨테이너를 실행하고 있기에, 쓰기 작업이 가능한 컨테이너 레이어가 생성되어 있습니다.

쓰기 작업 내용 확인

  • 86bed95... 컨테이너 레이어에 접근하여 확인 시, hi.txt 파일이 남아있는 것을 확인 가능합니다.

  • 실행 중인 컨테이너 종료 시, 해당 컨테이너 레이어는 사라지게 되며, hi.txt 파일 또한 함께 제거됩니다.

레이어 구조 시각화

busybox 이미지
├── sha256:068f... ← lowerdir (읽기 전용)
컨테이너 (ID: d756a67a66fe)
├── lowerdir = 이미지(도커) 레이어
├── upperdir = overlay2/86bed95.../diff
└── merged = upper + lower

3. 컨테이너 실행 방식(interactive vs detached) 차이

위 실습을 하다가 흥미로운 점을 발견했습니다.

docker run -it ... 와 같이 interactive 방식으로 컨테이너를 쉘을 사용할 수 있도록 실행한 후, 컨테이너 내부가 아닌, 호스트(외부)의 overlay2 디렉터리의 컨테이너 레이어에 쓰기 작업을 하면 컨테이너 내부에 쓰기 내용이 연동될까? 라는 궁금증이 생겼습니다.

  • 실제 확인 결과, -it 로 실행하는 경우 컨테이너 내부에 쓰기 작업이 연동되지 않음을 확인했습니다.

docker run -dit ... 로 실행한다면?

  • 확인 결과, 호스트에서 쓰기 작업을 해도 컨테이너 내부에 정상적으로 쓰기 내용이 연동되어 있음을 확인했습니다.

왜 이런 현상이 나타날까?

  • 찾아본 바로는 -it의 경우 overlayfs가 짧은 시간으로(daemon이 아닌 상태로) 마운트 되고, 이후 내부 캐시가 고정되어있어서 반영되지 않은 것인가라고 생각됩니다.
profile
바교망

1개의 댓글

comment-user-thumbnail
2025년 7월 9일

"Docker Layer 실습부분만 읽고 다음에 읽어야지" 라고 생각했는데 어느새 "컨테이너 실행방식" 까지 정독하고 있는 저를 보며 '아 이 블로그 나랑 맞다' 라는 생각이 들었습니다
나머지 섹션도 빨리 읽고 싶네요 항상 좋은 글 감사드립니다

답글 달기