데이터를 컨테이너가 아닌, 호스트에 저장하는 것. 보통 컨테이너끼리 데이터를 공유할 때 사용한다.(혹은, 컨테이너의 존재와 관련없이 데이터를 저장하고 싶을 때나.)
당연한 이야기지만, dockere commit을 해도 데이터 볼륨의 변경사항은 이미지에 포함되지 않는다.
- volume
- 도커가 일반적으로 권장하는 방식
- "컨테이너에서 생성하고 사용하는 데이터를 유지하기 위한 기본 메커니즘"
- 도커가 생성/관리 - 타 프로세트는 이 파일을 건드릴 수 없다.
- 리눅스가 아닌 OS는 리눅스VM에서 관리한다.
/var/lib/docker/volumes/
에 저장된다.- 도커가 관리하기 때문에 OS 종류에 상관없이 동일하게 사용가능
- 한 볼륨(호스트에 저장된)을 여러 컨테이너끼리 마운트하여 사용할 수 있다.
- 도커 컨테이너를 경유해야 볼륨에 접근 가능하다.
- 원격 호스트 or 클라우드 제공자에게 볼륨을 저장하도록 하거나, 볼륨의 내용을 암호화 하거나 다른 기능을 추가할 수 있다.
- 컨테이너의 크기를 늘리지 않고, 컨테이너와 생명주기가 별도다.
- 도커가 일반적으로 권장하는 방식
- bind mount
- bind mount는 호스트의 디렉터리 절대 경로를 도커의 컨테이너가 참조하는 방식으로 동작한다.
- 도커가 관리하지 않기 때문에 Host OS에 영향을 받는다.(파일 구조 등)
- 또한, 도커가 아닌 프로세스에서 파일을 건드릴 수 있다.
- 컨테이너에서 Host에 직접 접근할 수 있기 때문에 보안 상 좋지 않다.
- Host OS의 종류에 따라 다른 설정이 필요할 수 있다.
- tmpfs mount
- 호스트 시스템의 메모리에만 저장된다.
- 일시적으로 데이터를 저장해야 하는 경우 사용한다. (보안or많은 비지속적 데이터 관리 필요 등)
- volume
- 특정 데이터를 여러 컨테이너에서 공유
- 컨테이너의 데이터를 로컬이 아닌 원격 호스트 또는 클라우드 공급자에 저장하려는 경우
- bind mount
- 로컬에서 도커를 사용하여 개발을 할 경우
- Docker 호스트와 컨테이너의 개발 환경 간에 소스 코드 또는 빌드 툴을 공유하는 경우
- 파일을 직접 수정해야 하는 일이 많은 경우
- 로컬에서 도커를 사용하여 개발을 할 경우
보니까, volume은 그냥 컨테이너를 만들 때, 연결해서 컨테이너의 작업 상황이 기록되는 느낌? 호스트에서 따로 수정하는게 불가능한듯...
볼륨을 사용할 때 중요한 점은 바인드 마운트나 볼륨 마운트를 선언은 동시에 하되 <볼륨or로컬 경로>:<컨테이너 경로>
로 볼륨 마운트인지 바인드 마운트인지 결정하기 때문에 헷갈리지 말아야 한다.