해당 글은 쿠버네티스 교과서 책과 공식 홈페이지(https://kubernetes.io/ko/)를 참조하여 작성되었습니다
Image를 통해 Container를 생성하는 것은 알고있다
그렇다면 Image로 부터 Container를 어떻게 만들어낼까?
또 Image는 어떻게 만들어지는 것일까?
이를 위해 Container나 Image가 어떻게 내부 데이터를 관리하는지를 먼저 알 필요가 있다
앞서 설명한 그림에서 Image와 Container는 사실 Layer로 구성되어 있다
Layer란 Git의 커밋과도 같다
Layer에는 변경사항에 대한 데이터가 저장되어 있으며, 이런 Layer가 여러층 쌓여서 최종 결과물이 나오게 된다
즉 Container의 데이터는 Layer 들에 차곡차곡 저장된다고 볼 수 있다
이런 Layer에는 읽기전용(Readonly)와 쓰기가능(R/W)이 있으며, 커밋 과정을 통해 데이터를 저장한다
이때 사용하는 저장소를 Storage Driver라고 한다
Layer의 커밋 내용이 저장되는 공간이다
보통 최신 image들은 기본적으로 overlay2를 사용하는데, 이외에도 여러 종류가 있으며 선택하여 사용한다
(참고: )
데이터를 기록하는 방법은 우리가 코드를 작성하듯 커밋을 통해 가능하며, 대략 다음과 같다
데이터 변경 -> 변경사항 커밋 -> 현재 Layer 저장 -> 새로운 Layer 생성
저장이나 생성하는 과정을 커밋을 통해 자동으로 이뤄지게 된다
그럼 커밋은 어떻게 진행할 수 있을까? 그것은 다음과 같다
컨테이너 내부에서 커밋
원하는 만큼 변경하고 커밋을 진행한다
(docker commit -m {메시지 내용})
컨테이너 외부에서 커밋
외부에서는 DockerFile 명령어를 통해 커밋이 가능하다
(docker commit --chage “ADD ??? $$$” -m {메시지 내용})
복잡하지만 알아야 할 것은 하나이다
우리가 작성하는 DockerFile에 의해 Layer가 쌓이고 데이터가 저장된다 라는 사실만 알면 된다
DockerFile의 FROM으로 Base Image를 가져온다
이때 해당 Image의 각 layer를 차례대로 읽으며 새로 Layer를 쌓는다
(이때 생기는 Container Layer는 읽기전용으로 수정할 수 없다)
DockerFile의 명령 한줄마다 모두 layer가 새로 생성되며, 실행결과는 커밋되어 layer에 기록된다
이 부분은 R/W Container Layer 이다
이처럼 Container는 Image layer를 따라 만들어진 새로운 Layer들이라고 할 수 있다
그러나 컨테이너가 오류가 있어서 삭제 후 재실행해야 한다면? 생성 이후의 데이터는 모두 날아가게 된다
컨테이너는 이런 작업이 수시로 일어나며, 이는 당연한 일이다
그렇다면 데이터를 영구보존하고 싶을 때 어떻게 해야할까?
이를 위해 새로운 저장 공간이 필요하다
이를 위해 생긴 것 중 하나가 바로 볼륨(Volume)이다
볼륨이란 Docker에서 관리되는 공간으로, Docker api로 생성할 수 있으며 호스트의 특정 위치(/var/lib/docker/volumes/)에 생성된다
이렇게 생성된 빈 공간을 Container와 연동함으로써, 설령 Container가 삭제되더라도 호스트 볼륨에는 데이터가 남아있는 방식으로 영구 보관이 가능하다
Docker에서 관리하기에 볼륨이 존재하지 않는다면 마운트 시에 자동으로 생성된다
볼륨을 생성하지 않아도 가능한데 그것은 로컬 컴퓨터 내의 임의의 경로와 연동하는 방법이다
다만 이 방법은 Docker Host가 관리하는 볼륨이 아니기에, 자동 생성되지 않고 해당 경로에 폴더/파일이 존재해야 하는 것이 단점이다
이는 도커의 언제 어디서나 이미지 하나로 구축할 수 있다!라는 원칙(?)에 어긋나기 때문에 권장되지 않는다