Volume
데이터의 형태
먼저 Volume에 대해서 파기 전에 데이터가 어떤 형태로 있는지 확인해봐야합니다. 기본적으로 3개의 형태로 나눠볼 수 있습니다. 그리고 사용해봤으면 알겠지만 컨테이너 레이어안에 데이터는 휘발성인 것을 확인 할 수 있죠.
유형 | 설명 | 위치 |
---|---|---|
애플리케이션 | 코드와 설정 포함, 이미지 빌드 시 추가, 변경 불가 | 📍 위치: 이미지 레이어 (읽기 전용) |
임시 데이터 | 실행 중 생성, 메모리나 임시 파일에 저장, 주기적 삭제 | 📍 위치: 컨테이너 레이어 (읽기/쓰기 가능, 임시) |
영구 데이터 | 실행 중 생성, 파일이나 DB에 저장, 중지 후에도 유지 | 📍 위치: 컨테이너 레이어 & 볼륨 (읽기/쓰기 가능, 영구적) |
데이터 손실 문제 예시
어떤 폼을 제출하는 애플리케이션이 있다고 가정해봅시다. 이 애플리케이션은 응답을 ./response/*.txt
형태로 저장합니다. 애플리케이션을 이미지로 빌드하고 실행하면, 파일이 정상적으로 저장되는 것을 확인할 수 있습니다.
컨테이너를 중지하고 다시 시작하면 데이터는 여전히 살아있지만, 컨테이너를 지우고 다시 빌드하고 실행한다면 데이터가 사라지는 것을 확인할 수 있습니다. 이렇게되면 위에서 언급했던, 임시 데이터에 해당이 되겠죠 ?
도커 볼륨이란?
도커 볼륨은 컨테이너의 데이터를 지속적으로 저장하기 위한 메커니즘입니다. 컨테이너가 삭제되거나 재시작되더라도 데이터가 유지되도록 합니다. 볼륨은 호스트 머신의 하드 드라이브 폴더로, 여러 컨테이너 간에 데이터를 공유할 수 있게 합니다.
볼륨과 바인트마운트의 유즈 케이스
1. 익명 볼륨
docker run -v host-path:/container-path
- 도커가 자동으로 생성하고 관리
- 컨테이너의 수명 동안만 필요한 데이터를 저장하는 데 사용
- 컨테이너와 맵핑되기 때문에 컨테이너가 삭제되면 익명 볼륨도 삭제됩니다.
ex) CI/CD, 로그 처리, 캐싱, 데이터베이스 테스트에서 사용될 수 있습니다.
2. 명명된 볼륨
docker run -v name:/container-path
- 사용자가 직접 이름을 지정하여 관리할 수 있는 볼륨
- 여러 컨테이너에서 공유
- 컨테이너가 삭제되더라도 데이터는 유지됨
ex) Jenkins, Redis, Nginx 등의 지속적인 설정, 애플리케이션 간의 데이터 공유
3. 바인드 마운트
docker run -v /container-path
- 사용자가 직접 이름을 지정하여 관리할 수 있는 볼륨
- 같은 호스트 머신 경로를 연결하면 컨테이너간 공유가 가능
- 호스트 머신 특정 디렉토리를 컨테이너 내의 경로와 직접 연결
- 컨테이너가 삭제되더라도 데이터는 유지됨
ex) 개발 환경에서 코드 동기화, 로그 파일 유지, 데이터베이스 백업/복원, CI/CD에서 소스 코드
Bind Mount도 volume인가요 ?
아닙니다. 헷갈려 보일 수 있지만 Bind Mount는 호스트의 특정 디렉터리를 직접 연결하는 방식이고, Docker Volume은 Docker가 자체적으로 관리하는 스토리지에 데이터를 저장하는 방식입니다. Volume이 보안성과 관리 측면에서 더 유리하지만, Bind Mount는 더 직접적이고 빠릅니다.
그 외 볼륨관련 내용
-
readonly
설정- 볼륨을 읽기 전용으로 마운트하여 컨테이너가 데이터를 수정하지 못하도록 설정할 수 있습니다. 이를 통해 docker가 변경해서는 안될 가능성을 없앱니다.
- 예시:
docker run -v name:/container-path:ro
:ro
옵션을 사용하여 볼륨을 읽기 전용으로 설정합니다.
-
docker volume cli
- Docker CLI를 사용하여 볼륨을 관리할 수 있습니다.
- 주요 명령어:
docker volume create [OPTIONS] [VOLUME]
: 새로운 볼륨을 생성합니다.docker volume inspect [VOLUME]
: 볼륨의 세부 정보를 확인합니다.docker volume ls [OPTIONS]
: 모든 볼륨을 나열합니다.docker volume prune [OPTIONS]
: 사용하지 않는 모든 볼륨을 삭제합니다.docker volume rm [VOLUME]
: 특정 볼륨을 삭제합니다.
로컬 개발 환경 팁
Bind Mount를 통해 로컬 환경과 컨테이너를 동기화를 시킬때, 서버코드를 고치면, 서버를 다시 리부트해야하는 번거로움이 있는데, 이럴땐 nodemon
같은 패키지를 통해 파일시스템은 감시하여, 이를 자동으로 수행해줘서 생산성을 높일 수 있습니다.