컨테이너는 무상태 애플리케이션에게는 최적의 실행 환경이다. 그러나 애플리케이션에 전혀 상태가 없을 수는 없다. 퍼시스턴시(persistency)나 성능 향상을 위해 디스크를 사용하느 컴포넌트가 있어야 할 테고, 이 컴포넌트 역시 컨테이너에서 실행된다.
- 도커 볼륨과 마운트에 대해 배우고 컨테이너 파일 시스템이 어떻게 동작하는지 알아보자.
- 모든 컨테이너가 공유하는 이미지 레이어는 읽기 전용이고, 각 컨테이너가 따로 갖는 기록 가능 레이어는 컨테이너와 같은 생애주기를 갖는다.
- 이미지 레이어는 이미지를 내려받은 순간부터 삭제할 때까지 로컬 컴퓨터의 이미지 레이어에 존재한다. 그러나 컨테이너의 쓰기 가능 레이어는 컨테이너를 실행할 때 생성되며 컨테이너를 삭제할 때 함께 삭제된다.(컨테이너가 종료하는 것만으로는 컨테이너가 삭제되지 않는다. 그래서 종료된 컨테이너의 데이터도 그대로 남아 있는 것이다.)
도커 볼륨은 도커에서 스토리지를 다루는 단위다.
- 컨테이너에서 볼륨을 사용하는 방법은 두 가지다. 첫 번째는 수동으로 직접 볼륨을 생성해 컨테이너에 연결하는 방법이고, 두 번째는 Dockerfile 스크립트에서 VOLUME 인스트럭션을 사용하는 방법이다.
- VOLUME 인스트럭션의 문법은 VOLUME <target-directory> 형식이다.
- volumes-from 플래그를 적용하면 다른 컨테이너의 볼륨을 연결할 수 있다.
- 볼륨은 컨테이너 간 파일 공유보다는 업데이트 간 상태를 보존 하기 위한 용도로 사용해야 하며, 이미지에서 정의하는 것보다는 명시적으로 관리하는 편이 더 낫다. 볼륨에 이름을 붙여 생성하고 업데이트 시 다른 컨테이너로 옮겨 연결하면 된다.
6.3 파일 시스템 마운트를 사용하는 컨테이너 실행하기
- 볼륨의 장점은 컨테이너와 스토리지의 생애주기를 분리하면서도 도커를 사용하는 방식 그대로 스토리지를 다룰 수 있는 점이다. 볼륨 역시 호스트 컴퓨터상에 존재하지만 컨테이너와는 분리돼 있기 때문이다. 하지만 호스트 스토리지를 컨테이너에 좀 더 직접적으로 연결할 수 있는 수단이 있다. (바인드 마운트)
- 바인드 마운트는 호스트 컴퓨터 파일 시스템의 디렉터리를 컨테이너 파일 시스템의 디렉터리로 만든다!
6.5 컨테이너의 파일 시스템은 어떻게 만들어지는가?
도커가 다양한 출처로부터 모아 만든 단일 가상 디스크로 구성된 파일 시스템을 갖는다. 이 파일 시스템을 유니언 파일 시스템이라고 한다.
- 기록 가능 레이어 : 비용이 비싼 계산이나 네트워크를 통해 저장해야 하는 데이터의 캐싱 등 단기 저장에 적합하다. 각 컨테이너마다 독립적인 기록 가능 레이어를 갖지만, 컨테이너가 삭제되면 여기 저장된 데이터는 유실된다.
- 로컬 바인드 마운트 : 호스트 컴퓨터와 컨테이너 간 데이터를 공유하기 위해 사용. 개발자의 로컬 컴퓨터에서 컨테이너로 소스 코드를 전달하기 위해 사용하면 로컬 컴퓨터에서 수정한 내용이 이미지 빌드 없이도 즉시 컨테이너로 전달될 수 있다.
- 분산 바인드 마운트 : 네트워크 스토리지와 컨테이너 간에 데이터를 공유하기 위해 사용. 가용성이 높지만 로컬 디스크와 비교해 지원하지 않는 파일 시스템 기능이 있거나 성능 면에서 차이가 있을 수 있다. 읽기 전용으로 설정 파일을 전달하거나 공유 캐시로 활용할 수 있으며 읽기 쓰기 가능으로 데이터를 저장해 동일 네트워크상의 모든 컨테이너나 컴퓨터와 데이터를 공유하는데 적합하다.
- 볼륨 마운트 : 컨테이너나 도커 객체인 볼륨 간에 데이터를 공유하기 위해 사용된다. 볼륨 마운트를 사용하면 애플리케이션이 볼륨에 데이터를 영구적으로 저장한다. 컨테이너를 교체하는 방식으로 애플리케이션을 업데이트해도, 이전 버전 컨테이너의 데이터를 그대로 유지할 수 있다.
- 이미지 레이어 : 이미지 레이어는 컨테이너의 초기 파일 시스템을 구성한다. 레이어는 적층 구조를 갖는데, 후속 레이어와 이전 레이어의 내용이 서로 충돌하는 경우 후속 레이어의 내용이 적용된다. 레이어는 읽기 전용이며 여러 컨테이너가 공유한다.
'Engineering WIKI > Docker' 카테고리의 다른 글
[도커 교과서] 8장 헬스 체크와 디펜던시 체크로 애플리케이션의 신뢰성 확보하기 (0) | 2023.03.01 |
---|---|
[도커 교과서] 7장 도커 컴포즈로 분산 애플리케이션 실행하기 (0) | 2023.03.01 |
[도커 교과서] 5장. 도커 허브 등 레지스트리에 이미지 공유하기 (0) | 2023.02.25 |
[도커 교과서] 4장. 애플리케이션 소스 코드에서 도커 이미지까지 (0) | 2023.02.25 |
[도커 교과서] 3장. 도커 이미지 만들기 (0) | 2023.02.25 |
[도커 교과서] 2장. 기본 사용방법 (0) | 2023.02.25 |
[도커 교과서] 1장. 시작하기 전에 (0) | 2023.02.25 |
[Docker] Docker 컨테이너 확인, 생성, 접속, 빠져나오기 (0) | 2021.04.26 |