도커 컨테이너 내부에서 정의된 파일들은 컨테이너의 라이프사이클과 동일한 라이프사이클을 가지게 되므로, 컨테이너가 제거될 때 같이 사라지는 문제가 있다.
또한 여러개의 컨테이너가 하나의 저장공간에 접근해야하는 경우도 빈번하게 있으므로 컨테이너 외부에 공용 저장공간을 둘 필요가 있다.
이를 해결하는 방법 2가지가 volume과 bind mount다.
출처: https://docs.docker.com/storage/volumes/
volume
- 도커가 관리하는 특정 공간(디렉토리)을 만들고 이를 컨테이너 내부 경로와 마운트한다.
- volume 생성
- docker volume create {volume name}
- volume 조회
- docker volume ls
- docker volume inspect {volume name}
- Mountpoint를 통해서 마운트 경로를 알 수 있다.
- volume mount
- docker run -v {volume name}:{container 내부 경로} --name {container name} {image}
- -v 옵션으로 생성한 volume과 container내부의 경로를 연결하였다.
- volume 삭제
- docker volume rm {volume name}
- 이때, 마운트가 되어있는 컨테이너가 있을 경우 삭제되지 않는다.
- 컨테이너부터 삭제해준다.
- docker rm -f {container name}
bind mount
- 파일 시스템의 특정 경로를 곧장 도커 내부 경로와 마운트한다.
- docker run 시 {volume name} 대신 실제 경로로 바꿔주면 된다.
- docker run -d -it --name {container name} -v "{path}":{container 내부 경로} {image}
volume vs bind mount
문서를 보면 일반적인 경우에 volume을 권장한다.
volume의 경우 docker에 의해 관리되므로, 백업, 이관, 보안 등 bind mount에 비해 관리가 용이하다.
자세한 내용은 다음 문서를 참고한다.
https://docs.docker.com/storage/volumes/