볼륨 vs 바인드 마운트
도커 컨테이너에 데이터를 보존하기 위해 볼륨과 바인드 마운트라는 두 가지의 외부 데이터 저장 메커니즘이 있습니다.
Volumes
- 컨테이너 외부의 특정 디렉토리에 연결된 도커 컨테이너의 내부 디렉터리입니다.
- 볼륨은 도커 내장 기능으로 도커가 관리합니다.
- 볼륨은 컨테이너가 종료된 경우에도 지속되며 계속 존재합니다.
- 볼륨은 도커가 인식하는 호스트 머신인 컴퓨터에 있는 디렉터리로 도커 컨테이너 내부의 디렉터리에 매핑됩니다.
(컨테이너 내부의 폴더와 컨테이너 외부 폴더 연결)
익명 볼륨(Anonymous volumes)
FROM node:16
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
EXPOSE 80
VOLUME ["<매핑되어질 컨테이너 내부 위치>"]
CMD ["node", "server.js"]
위 소스에서 저장하려는 VOLUME ["<매핑될 컨테이너 내부 위치>"]
볼륨은 익명 볼륨으로 컨테이너 내부의 경로로 외부 폴더에 매핑되어질 컨테이너 내부 위치(데이터가 저장될 위치)에 마운트 합니다.
VOLUME ["<매핑될 컨테이너 내부 위치>"]
or docker run -v <매핑되어질 컨테이너 내부 위치>
는 익명의 볼륨을 생성합니다.
- 컨테이너 내부의 경로를 지정한 것으로 호스트 머신의 경로는 알 수 없습니다.
- 익명으로 생성되는 볼륨은 도커가 자동으로 이름을 생성합니다.
- 익명 볼륨을 도커가 관리하므로 컨테이너가 실행되는 동안에만 존재합니다.(컨테이너를 종료하면 데이터가 사라집니다.)
- 컨테이너가 생성될 때마다 익명 볼륨이 다시 생성됩니다.
- 컨테이너가 제거되면 익명 볼륨은 의미가 없습니다.
- 익명볼륨은 하나의 특정 컨테이너와 연결되어 있습니다.
--rm
옵션으로 컨테이너를 생성 시 컨테이너를 중지하면 익명볼륨은 사라집니다.
--rm
옵션으로 컨테이너를 생성하지 않으면 나중에 컨테이너를 제거해도 익명 볼륨이 자동으로 제거되지 않습니다.
새 컨테이너를 실행하면 새로운 익명 볼륨이 다시 생성됩니다. 아래 명령어로 익명 볼륨을 제거할 수 있습니다.
docker volume rm <제거할 볼륨명> or docker volume prune
(사용하지 않는 익명 볼륨 제거)
- 익명볼륨을 사용하여 컨테이너 간에 데이터를 공유할 수 없습니다.
- 컨테이너에 이미 존재하는 특정 데이터를 잠그는데 유용하며 데이터가 다른 모듈에 의해 덮어 쓰이는 것을 방지하는데 유용합니다.
- 외부 경로보다 컨테이너 내부 경로의 우선순위를 높이는 데 사용할 수 있습니다.
명명된 볼륨(named volumes)
- Dockerfile에서 생성할 수 없으며 컨테이너를 생성할 때
-v <볼륨명>:<매핑될 컨테이너 내부 위치> 옵션으로
콜론 앞에 이름을 붙여 명명된 볼륨을 추가할 수 있습니 다.
- 특정 컨테이너와 연결되어 있지 않습니다.
- 컨테이너가 종료되어도 데이터가 유지됩니다. 때문에 여러 컨테이너 간에 데이터를 공유할 수 있습니다.
- 명명된 볼륨은 컨테이너가 종료될 때 도커에 의해 삭제되지 않습니다.
- 명명된 볼륨은 하나의 컨테이너에만 연결되지는 않습니다.
- 새 컨테이너를 생성하면 볼륨이 복구되고 폴더가 복구됩니다.
- 영구적이어야 하는 데이터나 편집하거나 직접 볼 필요가 없는 중요한 데이터에 적합합니다.
바인드 마운트
- 호스트 시스템 파일 또는 디렉터리가 컨테이너에 마운트 됩니다.
docker run -v <프로젝트 절대 경로>:<매핑될 컨테이너 내부 위치> <이미지 이름>
- 절대 경로 바로 가기(shortcuts) example
- macOS / Linux: -v $(pwd):/app
- Windows: -v "%cd%":/app
- 바운드 마운트의 경우 위치를 알 수 있습니다.
- 특정 컨테이너에 연결되어 있지 않습니다.
- 컨테이너 종료 및 제거 후에도 데이터가 유지되고 컨테이너 간의 데이터를 공유할 수 있습니다.
- 바인드 마운트의 데이터를 삭제하려면 프로젝트 내의 모든 로컬 콘텐츠를 삭제해야만 데이터를 삭제할 수 있습니다.
- 영구적이고 편집 가능한 데이터에 적합합니다.