legacy/Docker

[Docker] 이미지 레이어와 컨테이너 레이어

heemang_e 2024. 2. 15. 14:56

 

도커 컨테이너를 생성하기 위해서는 이미지가 필요로 합니다. Public 레지스트리에 저장된 이미지를 검색하여 다운로드할 수 있습니다.

우리가 다운로드한 이미지는 레이어 구조로 형성되어 있습니다. 이번 글에서 레이어의 개념에 대해서 알아보겠습니다.

 

이미지 레이어

Public 레지스트리에 업로드되어 있는 Nginx 이미지를 다운로드하여 보겠습니다.

// nginx 이미지 다운로드
$ docker pull nginx

 

터미널에서 nginx 이미지를 다운로드하면 다음과 같이 레이어 구조를 볼 수 있습니다. 사실 Nginx 이미지 또한 레이어 구조로 생성된 이미지입니다.

이미지는 레이어 구조이다

 

이미지를 레이어 구조로 생성하는 이유는 다음과 같습니다.

  • 공유 및 재사용 : 각 레이어는 독립적으로 관리되기 때문에 여러 application에서 동일한 레이어를 공유하고 재사용할 수 있다
  • 빠른 배포 : 이미지를 수정할 경우 변경된 부분만 새로운 레이어로 추가하고 이전 레이어는 그대로 사용할 수 있다
  • 보안 : 이미지는 읽기 전용이다
  • 효율적인 자원 관리 : 이미지 레이어는 캐시되어 있기 때문에 중복 다운로드를 방지하여 디스크 공간을 절약한다

 

위의 이유를 반대로 생각하면 레이어 구조를 사용하지 않을 때의 단점이 됩니다.

  • 전체 이미지 재빌드 : 이미지를 수정하면 전체 이미지를 다시 빌드해야 한다. 즉, 수정된 부분만 빌드하는 것이 아닌, 전체 이미지를 빌드해야 한다
  • 배포 시간 증가 : 이미지 변경 사항이 단일 이미지에 포함되므로 이미지의 크기가 커진다. 이는 배포시간의 증가로 이어진다
  • 자원 낭비 : 이미지 크기가 커짐에 따라 디스크 공간을 많이 차지하고, 네트워크 대역폭을 많이 소비한다
  • 이미지 관리 어려움 : 단일 이미지로 구성됨에따라 수정된 레이어를 추적할 수가 없다

위의 이유로 인해 이미지는 레이어 구조로 구성됩니다. 설계도를 예로 들어보겠습니다.

설계도 내부에 구조, 토목, 전기, 조경 4가지로 구성되어 있습니다. 전기 부분의 설계도가 잘못되어 설계를 변경해야 합니다. 이때 레이어 구조로 설계도를 작성하였기 때문에 전기 설계도만 변경하고 나머지 구조, 토목, 조경 설계도는 그대로 사용하면 됩니다. 

설계도

 

컨테이너 레이어

도커 컨테이너를 생성하기 위해서는 이미지가 필요합니다. 사실 컨테이너 또한 레이어 구조로 만들어집니다. 

그러나 이미지에서 사용되는 레이어 방식과 다른 부분이 존재합니다. 이미 생성된 이미지는 레이어를 수정할 수 없지만, 컨테이너는 이미지를 수정할 수 있습니다. 즉 컨테이너에서 발생하는 변경 사항은 해당 컨테이너에만 적용이 됩니다.

 

도커 컨테이너는 이미지의 읽기/쓰기 가능한 레이어 위에 생성됩니다. 컨테이너에서의 변경은 해당 컨테이너 레이어에만 영향을 미치는 이유입니다. 이는 동일한 이미지를 기반으로 여러 개의 컨테이너를 생성하더라도, 각 컨테이너는 독립적으로 동작하고 서로 영향을 미치지 않습니다. 

 

따라서 컨테이너에서 이미지를 수정하더라도 기존 이미지는 변경되지 않습니다. 이는 도커 레이어 형식의 장점이라고 할 수 있습니다. 이미지는 불변하게 유지되고, 컨테이너에서 발생하는 변경은 해당 컨테이너에만 영향을 미칩니다. 따라서 이미지의 재사용성과 관리의 편의성을 높여줍니다.

 

아래 사진을 보면 Nginx 이미지를 사용하여 3개의 컨테이너를 생성하였습니다. 컨테이너는 이미지 레이어 위에 읽기/쓰기 레이어를 생성한다고 했습니다. Container1과 2가 application을 실행하면서 레이어를 변경하더라도 imageA 이미지에는 영향을 미치지 않습니다. 또한 Container3도 변경 사항이 발생하더라도 imageB 이미지에는 영향을 미치지 못합니다. 

도커 컨테이너 레이어

 

결론

이미지 레이어의 특징은 다음과 같습니다.

  • 레이어 형태 : 각 레이어는 이전 레이어 위에 쌓인다. 레이어 방식은 중복 데이터를 최소화하고, 빌드 속도를 높여 저장소를 효율적으로 사용할 수 있도록 한다
  • Copy-on-Write 전략 : 다음 레이어에서 이전 레이어를 수정할 때, 해당 파일의 복사본을 만들어서 변경사항을 적용한다. 따라서 원래 레이어는 수정되지 않고 그대로 유지된다
  • Immutable 레이어 : 이미지의 각 레이어는 불변이므로, 한 번 생성되면 수정할 수 없다. 수정이 필요한 경우 새로운 이미지를 생성해야 합니다. 이는 이미지의 일관성을 유지할 수 있게 해준다
  • Caching : 레이어를 캐시하여 이미 빌드된 레이어를 재사용할 수 있다. 이는 이미지 빌드 시간을 줄일 수 있다

 


인프런 - 개발자를 위한 쉬운 도커

 

[2024 NEW] 개발자를 위한 쉬운 도커 강의 - 인프런

현업 개발자가 도커를 사용한 경험을 녹여낸 새로운 커리큘럼으로 기존 교재 및 강의와 차별된 강의를 제공합니다. 단순한 명령어 사용법이 아닌 도커를 왜 사용해야하는지 대한 근본적인 질문

www.inflearn.com