[Docker] 도커 이미지의 레이어

옹심이·2024년 12월 15일
0
post-thumbnail

시작하며

도커 이미지는 이미지를 효율적으로 저장하기 위해 레이어드 파일 시스템을 구성한다.

nginx를 다운로드 받는 과정에서 pull이 여러단계에 걸쳐 실행되는 것을 보면 이미지가 레이어 구조임을 확인할 수 있다.

레이어 구조에 대해 알아보고 도커 이미지가 레이어 구조로 구성된 이유를 특징과 함께 알아볼 것이다.

건축도면으로 레이어 구조 이해하기

구조, 토목, 전기 ,조경 각각의 레이어를 합치면 설계도 A가 완성된다.

건축도면을 레이어 구조로 설계하면 무엇이 좋을까?

각 레이어 간의 간섭을 줄이고 재사용성이 증가한다.

  • 조경 부분만 수정하고자 할 때 설계도가 레이어 구조라면 조경 부분만 수정하고 나머지 레이어는 수정할 필요가 없다. 이로써 효율성이 증가한다.
  • 전기 구조만 다른 설계도 B를 만들고자 할 때 전기 구조 이외에 나머지 레이어는 재사용할 수 있다는 점에서 이점이 있다.
  • 설계도 A를 가진 사람에게 설계도 B를 전달하고자 할 때 전기 구조 부분만 보내주면 되기 때문에 네트워킹 효율성에서도 이점을 가진다.

도커 이미지의 레이어 구조에서도 이와 같은 장점을 가진다.

Nginx 이미지로 보는 도커 레이어

nginx이미지 설계에는 OS, NginX 설치 파일, NginX 설정 파일, index.html이 필요하며 모두 레이어 구조로 구성할 수 있다.

Nginx 설치 파일 레이어를 추가하려고 할 때는 OS레이어에서 수정되는 것이 아니라 OS레이어 위에 새로운 레이어를 추가하는 방식으로 실행된다.

또한 이미지에서 한번 저장된 레이어는 변경할 수 없으며 기존 레이어의 복사본을 추가하여 수정해야한다.

만약 imageB의 index.html을 imageA에서 커스텀하여 사용하고자 한다면 index.html레이어만 별도로 사용하고 나머지 레이어들은 공동으로 사용할 수 있다.

또한 컨테이너는 읽기 전용 레이어인 이미지 레이어와 읽기/쓰기 전용 레이어인 컨테이너 레이어로 구성된다. 이 둘의 역할은 완전히 다르다.

  • 이미지 레이어 : 읽기 전용 레이어로서 수정이 불가능하며 컨테이너 실행을 위한 세이브 포인트 역할을 한다.
  • 컨테이너 레이어 : 이미지의 상단에 추가되어 컨테이너실행 중 변경 내용을 기록한다. 예를 들어 컨테이너 실행 중 index.html을 수정하고자 한다면 index.html에 해당하는 레이어를 컨테이너 레이어로 들고와 수정 후 WRITE한다. 이는 마치 GIT의 커밋 기능과 같다.

위 도면에 있는 컨테이너1과 2는 같은 이미지 레이어를 공유하며 컨테이너 실행 시 각자 컨테이너 레이어를 생성하여 동작한다. 그리고 컨테이너3은 이미지 레이어의 index.html을 제외한 다른 레이어를 공유하며 index.html 레이어와 컨테이너 레이어는 따로 가진다.

이런 구조를 통해 실행 시 전체 공간의 복사가 이뤄지지 않아도 되기 때문에 컨테이너를 더욱 빠르게 사용할 수 있다.

실습

다음과 같이 이미지를 다운 받아서 실습을 진행하였다.

  1. hello-nginx : 기존 nginx 이미지에서 index.html을 수정 후 추가한 커스텀 이미지
  2. config-nginx : hello-nginx 이미지에서 nginx.conf를 수정 후 추가한 커스텀 이미지
  3. pre-config-nginx : 기존 nginx 이미지에서 nginx.conf, index.html 순서대로 수정후 추가한 커스텀 이미지.

hello-nginx의 이미지 히스토리 조회 명령어 실행한 결과이다.

COPY는 현재 사용자가 가지고 있는 파일을 기존 레이어로 덮어쓰기하는 명령어이다

hello-nginx는 Nginx의 오피셜 이미지를 다운로드 후 index.html파일을 hello-nginx가 있는 파일로 덮어쓰기 한 것을 확인할 수 있다.

COPY 명령어를 통해 사용자가 가지고 있는 index.html 파일을 Nginx 이미지 경로의 index.html로 덮어쓰기 했다는 것을 보여준다

config-nginx의 이미지 히스토리 조회 명령어를 실행한 결과이다.

hello-nginx에서 한 줄이 더 추가되었다.

빨간 밑줄친 부분을 보면 nginx.conf 파일이 수정된 기록을 확인 할 수 있다.

pre-config-nginx의 히스토리 조회 명령어를 실행한 결과이다.

이전의 커스텀 이미지와 다르게 수정 순서가 바뀐 것을 확인할 수 있다.

실습에 사용된 이미지의 레이어 구조를 보여주는 이미지이다.

0개의 댓글