도커 볼륨과 바인드 마운트

김래영·2023년 2월 20일
0

Docker Study

목록 보기
3/9
post-thumbnail

볼륨 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
  • 바운드 마운트의 경우 위치를 알 수 있습니다.
  • 특정 컨테이너에 연결되어 있지 않습니다.
  • 컨테이너 종료 및 제거 후에도 데이터가 유지되고 컨테이너 간의 데이터를 공유할 수 있습니다.
  • 바인드 마운트의 데이터를 삭제하려면 프로젝트 내의 모든 로컬 콘텐츠를 삭제해야만 데이터를 삭제할 수 있습니다.
  • 영구적이고 편집 가능한 데이터에 적합합니다.
profile
개발 노트

0개의 댓글