이미지에서 레이어란 무엇일까?
레이어 (Layer)란?
--
이미지는
컨테이너를 실행하기 위한 읽기 전용 파일이다.
해당 이미지는 저장소를 효율적으로 사용하기 위해서
레이어드 파일 시스템으로 구성되어 있다.
즉, 이미지는 여러 개의 레이어로 구성되어 있다.
레이어란
여러 개의 층으로 구성되어 있는 것 중에 하나의 층을 의미한다.
기존에 이미지를 다운로드할 때 여러 단계에 걸쳐서 다운이 받아졌었다.
바로 이 한 줄 하나가 레이어를 의미한다.
이미 가지고 있는 이미지 중에서 같은 레이어를 사용하고 있었다면
이미지를 다운받을 때 해당 레이어는 다운로드하지 않고
기존에 가지고 있는 레이어를 공유해서 같이 사용하게 된다.
--
왜 이미지는 여러 개의 레이어로 구성되어 있을까?
--
바로 레이어드 구조가 재사용하기 유리한 구조이기 때문이다.
레이어드 파일 시스템 구조를 사용하면 재사용을 하기 때문에 공간을 효율적으로 사용할 수 있고
이미지를 저장 및 전송을 할 때에는 스토리지와 네트워크 사용량을 절약할 수 있게 된다.
위 그림처럼 이미지 A에 레이어 1, 2, 3, 4로 구성되어 있고
다른 이미지 B를 생성하고 싶은데 해당 이미지 B의 레이어는 기존 이미지 A의 레이어에서 1, 2, 4는 동일하다고 하면
레이어 1, 2, 4를 재활용하여 이미지 B를 생성할 수 있다.
그래서 결론적으로 레이어 1, 2, 4를 공유하고 있는 이미지 A와 이미지 B를 구성할 수 있게 된다.
--
이미지 레이어 구조
--
이미지의 레이어는
바로 직전 단계의 레이어에서 변경된(추가된) 내용들만 저장한다.
위 그림을 예시로
이미지를 만들 때 과정을 보자.
OS 설치 -> Nginx 소프트웨어 설치 -> Nginx 설정 파일 수정 -> index.html 파일 수정
을 하여 최종적으로 이미지를 만든다고 하자.
이미지 A 만들기
1번 레이어 : OS 파일 시스템을 가지고 있다.
2번 레이어 : 1번 레이어에서 추가된 Nginx 설치 파일만 가지고 있다.
3번 레이어 : 2번 레이어에서 수정된 Nignx 설정 파일(nginx.conf)만 가지고 있다.
4번 레이어 : 3번 레이어에서 수정된 index.html 파일만 가지고 있다.
이미지 B 만들기
기존 이미지 A에서 레이어 3번까지는 동일하기 때문에 3번에서 이어서 진행한다. (레이어 재사용)
4번 레이어 : 3번 레이어에서 수정된 index.html 파일만 가지고 있다.
즉, 이미지 A와 B는 총 3개의 레이어를 공유하고 각각 하나의 레이어를 별도로 사용하는 구조
이미지에서 한 번 저장된 레이어는 변경이 불가능하다.
변경 사항이 있다면 새로운 레이어로 변경사항을 추가로 저장해야 한다.
--
이미지를 컨테이너로 실행시킬 때 레이어 구성
--
"docker run" 명령어로 컨테이너를 실행하면
이미지의 마지막 레이어 위에 새로운 읽기/쓰기 전용 레이어가 추가된다.
해당 레이어를 컨테이너 레이어라고 부른다.
컨테이너 레이어에는
애플리케이션에서 로그가 쌓이거나 컨테이너가 실행 중에 생기는 모든 변경 사항들이 저장된다.
이미지 레이어와 컨테이너 레이어의 역할
- 이미지 레이어 : 컨테이너를 실행하기 위한 세이브 포인트 역할 (실행시키기 위한 재료들 보관)
- 컨테이너 레이어 : 컨테이너로 실행한 이후에 프로세스가 변경하는 내용들을 기록하는 역할
위 그림처럼
이미지 A로 컨테이너1로 실행하고 컨테이너2로도 실행하게 되면
두 개의 컨테이너는 동일한 이미지를 사용하기 때문에
해당 이미지 레이어를 복사해서 따로 구동하는 것이 아니라 이미지 레이어(읽기 전용 레이어)를 공유하게 된다.
그래서 이미지 위에 새로운 컨테이너 레이어만 하나씩 추가하게 되는 구조가 된다.
즉, 실제로 큰 부분을 차지하는 이미지를 하나로 공유하여 사용하기 때문에
컨테이너를 생성할 때 속도가 빨라지고 저장소도 더 효율적으로 사용할 수 있게 된다.
여기서 이미지 B를 사용하여 새로운 컨테이너를 또 실행해도
이미지 B는 이미지 A의 레이어 1, 2, 3을 공유하고 있기 때문에
컨테이너 3번도 컨테이너 1, 2번의 3번째 레이어인 nginx 설정까지는 공유하여 사용하게 된다.
--
Copy-on-Wirte (CoW) 전략 (실행중인 컨테이너에서 기존 내용을 변경한다면?)
--
파일의 내용을 수정할 때에는
기존 파일을 가지고 내용을 수정하는 것이 아니라
기존 파일을 복사하여 가져온 다음 복사한 파일의 내용을 수정하여 저장하는 형태이다.
위 그림의 과정
- 2번 레이어에서 Nginx 소프트웨어를 설치할 때 기본으로 index.html파일도 설치가 된다.
- 4번 레이어에서 2번 레이어의 index.html 파일을 복사하여 4번 레이어로 가져온 다음 내용을 수정하여 수정한 파일을 4번 레이어에 가지고 있는다. (저장)
- 해당 이미지를 컨테이너로 실행한 이 후에 index.html파일을 수정할 때
이미지 4번 레이어에서 index.html 파일을 복사하여 컨테이너 레이어로 가져온 다음 내용을 수정 후 수정한 파일을 컨테이너 레이어에 가지고 있는다. (저장)
결국 레이어에서 index.html파일은 총 3개가 존재하게 되는 것이고
실제로 실행되는 것은 가장 최근에 변경한 파일(컨테이너 레이어에 존재하는 index.html파일)이 실행된다.
Immutable Layers (불변 레이어)
이미지의 각 레이어는 불변으로, 한 번 생성되면 변경이 불가능하다.
그래야 이미지의 일관성을 유지하고, 여러 컨테이너에서 안전하게 공유할 수 있다.
그래서 이 규칙을 지키기 위해 Copy-on-Write 전략을 사용하게 되는 것이다.
--
참고 및 출처
'Docker' 카테고리의 다른 글
이미지를 만드는(저장) 방법 [ image build ] (+명령어) (+IaC) (+Dockerfile 작성법) (0) | 2024.06.19 |
---|---|
이미지를 만드는(저장) 방법 [ image commit ] (+명령어) (0) | 2024.06.18 |
Docker Hub에 이미지 다운로드 및 업로드 명령어 (+ Docker Hub 사용법) (0) | 2024.06.16 |
이미지 레지스트리 (feat. Docker Hub) (0) | 2024.06.15 |
컨테이너의 Lifecycle(생명주기) 정리 (+명령어) (0) | 2024.06.14 |