▶︎ 도커 이미지
도커 이미지는 컨테이너를 실행하기 위한 읽기 전용 파일이다.
도커 이미지의 경우 저장소를 효율적으로 사용하기 위해 Layerd File System으로 구성되어 있다.
이미지의 경우 한 번 만들어지면 이미지 내의 정보는 절대 변하지 않는다(Immutable,불변성).
이 이미지를 만들기 위해서는 Dockerfile(도커파일)을 작성해야 하는데
작성 방법의 경우에는 아래 포스트를 참고해보도록 하자.
https://jaehyojjang.dev/docker/dockerfile/
`Nginx` 이미지를 예로 들어보겠다.
로컬 저장소에 nginx
이미지가 없는 경우 아래와 같이 도커 허브에서 이미지를 다운로드 받는다.
사진을 잘 보면 nginx 이미지를 다운받는 과정에서
pull이 여러 단계에 걸쳐 실행되는 것이 보일텐데 여기서 각 줄이 레이어(Layer)를 의미한다.
이 레이어들이 모여서 하나의 이미지로 구성이 되는 것이다.
도커 이미지의 경우 컨테이너를 생성하기 위한 모든 정보를 담고 있기 때문에 이미지 한 개의 용량이 보통 수백MB ~ 수GB가 가뿐히 넘는다.
그런데 기존 이미지에서 작은 변경사항이 생겨 도커 파일에 코드 한줄을 추가하여 다시 이미지를 만들고 그 이미지를 다시 다운로드 받는다고 가정하면
겨우 코드를 한 줄 추가한 것 뿐인데, 이미지의 불변성 때문에 수백 ~ 수GB가 되는 이미지를 다시 다운로드 받는 것은 매우 비효율적인 방법이 되지 않을까?
도커는 이러한 문제를 해결하기 위해서 Layer(레이어)라는 개념을 도입한 것이다.
▶︎ 도커 레이어
위에서 말했듯이 레이어란 기존 이미지에 추가적인 파일이 필요할 때 다시 다운로드 받는 방법이 아닌 해당 파일을 추가하기 위한 개념이다.
만약 nginx 이미지가 기존에 존재하는데 nginx 이미지를 다운로드 받을 경우 nginx 레이어만 다운받게 된다.
Docker 이미지는 위 그림 처럼 여러 레이어로 구성되며, 각 레이어는 이전 레이어의 변경 사항을 가지고 있다.
이 여러 개의 레이어에는 읽기 전용인 read only
레이어와, 새로 변경되거나 추가된 내용을 담은 새로운 레이어로 구성된다.
도커 이미지에 작업이 추가되면 새로운 레이어가 생성되는 이러한 개념은 Git commit 로그를 쌓는 것과 결이 비슷하다고 볼 수 있다.
기존에는 이미지에 변경사항이 생기는 경우 새 이미지를 받아야 했었다면,
이제는 레이어 개념을 통해 기존 레이어는 그대로 둔 채 새로 업데이트된 내용만 담고 있는 레이어만 쌓는 개념으로 관리를 하기 때문에 매우 효율적이다.
업데이트된 부분만을 이미지로 생성하고 실행 시점에 기존 이미지를 바뀐 부분과 조합하기 때문에 바뀐 이미지의 크기는 크게 변화가 없을 것이다.
‣ 특징
- 레이어 격리: 각 레이어는 독립적인 파일 시스템으로, 각 레이어에 애플리케이션과 종속성에 대한 변경 사항만 포함된다.
- 레이어 재사용: 동일한 레이어를 여러 이미지에 공유할 수 있다. 이를 통해 이미지 빌드 시간과 저장소 사용량을 줄일 수 있다.
- 레이어 버전 관리: 레이어를 생성할 때마다 새로운 버전이 만들어진다. 이렇게 되면, 이미지 업데이트 시에도 이전 버전의 레이어를 유지할 수 있어, 애플리케이션의 변경 이력을 관리할 수 있다.
- Dockerfile 기반 레이어 생성: Dockerfile에서 작성된 명령어들이 각각 실행될 때마다 새로운 레이어가 만들어진다. 이렇게 하여 애플리케이션과 그에 상응하는 설정, 라이브러리, 종속성 등의 변경 사항을 추적할 수 있다.
## ‣ 작동 원리
- Docker 이미지를 생성할 때, Dockerfile을 사용하여 이미지 레시피를 정의
- Dockerfile에 기술된 명령어들이 순서대로 실행.
- 각 명령어가 실행될 때마다 새로운 레이어가 생성되고, 변경 사항이 레이어에 저장
- Docker 이미지를 실행할 때, 해당 이미지의 모든 레이어가 연결되어 전체 파일 시스템을 구성. 이렇게 하여 실행하는 컨테이너는 모든 레이어의 데이터에 액세스할 수 있다.
- 컨테이너 내에서 변경해 저장한 것은 컨테이너의 최상단 레이어에 저장되며 이미지의 레이어에는 영향을 주지 않는다.
▶︎ 컨테이너 레이어
이미지를 실행하여 도커 컨테이너를 생성할 때도 레이어 방식을 사용한다.
컨테이너 생성 시, 기존의 읽기 전용 이미지 레이어 위에 읽기/쓰기 전용 레이어(R/W Layer)를 추가한다.
이미지 레이어를 그대로 불변의 레이어로 사용하면서, 컨테이너가 애플리케이션 실행 중에 생성하는 모든 파일이나 변경사항은 읽기/쓰기 전용 레이어에 저장되므로
여러 개의 컨테이너를 실행하면서 이미지의 불변성을 유지할 수 있다.
▶︎ 실습
nginx
이미지의 레이어 이력을 조회해보자.
docker image history <이미지명>
docker image history nginx