본문 바로가기
Study/Docker&Kubernetes

[Docker] Volume

by kimdaepa 2026. 3. 3.

Data

다양한 종류의 Data가 존재

  • Application
    • Code + Environment
      1. Read Only(Image 저장)
    • Temporary App Data
      1. Application이 실행되면서 생성된 데이터
      2. 컨테이너(변수, 메모리, 파일 등)에 저장
      3. Read + Write(Container 저장)
    • Permanent App Data
      1. 영구적으로 존재해야 하는 데이터
      2. 파일 또는 DB에 저장
      3. Read-Write(Container&Volumes 저장)

 

Volume(Managed By Docker)

호스트 머신의 폴더

  • 이미지, 컨테이너에 있는 것이 아닌 호스트 컴퓨터에 장착된 하드 드라이버에 존재하여 사용 가능하거나, 컨테이너에 매핑되는 것

컨테이너가 제거 되어도 아래 경우와 같으면 데이터가 유지

  • 로컬 폴더 연결
    • 로컬 저장 경로는 알 수 없음
  • 명명(named)된 Volume
    • 영구적이어야 하거나, 편집하거나 직접 보지 않아도 되는 데이터를 저장
    • 익명 Volume은 컨테이너 1개와 연결 되어 있음
    • 명명된 Volume은 컨테이너 여러개와 연결할 수 있음
  • 컨테이너는 이 Volume에 있는 데이터를 Read-Write 가능
  • Dockerfile
FROM node:14

WORKDIR /app

COPY package.json .

RUN npm install 

COPY . .

EXPOSE 80

# 컨테이너 밖 레이어에 저장될 위치
~~VOLUME [ "/app/feedback"]~~
# 하지만 이렇게만 하면 호스트의 특정 디렉터리를 지정할 수 없고, 
# Docker가 관리하는 볼륨 위치(익명 볼륨)가 자동 할당.
# 익명 볼륨으로 가기 떄문에 사실상 데이터는 날라감.
# 그래서 이 명령어를 붙이지 않고 밑의 명령어를 써서 명명해야 함.

CMD [ "node", "server.js" ]
  • 명령어
    • Volume List
      • docker volume ls
    • Named Volume
      • # -v <"Volume 이름">:<"Volume 경로">
        # Volume 이름과 경로 명명
        docker run -d -p <"호스트 포트">:<"컨테이너 포트"> --rm --name <"이름"> \
        -v <"Volume 이름">:<"Volume 경로"> <"이미지 Name:Tag">
    • Volume 삭제
      • # 특정 Volume 삭제
        ## 컨테이너 중지 후 진행해야 함.
        docker volume rm <"Volume 이름">
        
        # 전체 Volume 삭제
        docker volume prune
    • Volume 생성
      • docker volume create <"Volume 이름">
    • Volume 점검
      • docker volume inspect <"Volume 이름">
        
        # 결과
        [
          {
            "CreatedAt": "2026-02-16T09:03:57Z",
            "Driver": "local",
            "Labels": null,
            "Mountpoint": "HostPath",
            "Name": "VolumeName",
            "Options": null, # ro/rw 확인 가능
            "Scope": "local"
          }
        ]

 

Bind Mounts(Managed By Me)

  • 호스트 머신 상에 매핑될 컨테이너의 경로를 설정
  • 영구적이고 편집 가능한 데이터에 적합
  • 명령어
    • docker run -d -p 3000:80 --rm --name <"이름"> \
      -v <"Volume 이름">:<"Volume 경로"> \
      -v "<'마운트 할 폴더(또는 파일)의 절대 경로':'WORK DIR'>" <"이미지 Name:Tag">
      
      # or
      docker run -d -p 3000:80 --rm --name <"이름"> \
      -v <"Volume 이름">:<"Volume 경로"> \
      -v "%cd%":<"WORK DIR"> <"이미지 Name:Tag">
  • 확인해야 하는 점
    • 도커가 마운트 한 폴더(또는 파일)에 액세스 할 수 있는 지
      1. 이는 도커의 Preferences에 액세스 하여 설정할 수 있음
        • 설정 → Resources → File Sharing
      2. 공유 중인 폴더 또는 상위 폴더의 표시가 있어야 함.
    • 마운트한 경로의 로컬 폴더(또는 파일)는 도커의 마운트 된 경로에 있는 폴더(또는 파일)를 덮어 씌움.
      1. 그렇기에 특정 폴더는 덮어 씌우면 안된다고 설정 해야 함 ⇒ 그게 바로 -v

 

정리

  • 명령어
    • # Anonymous Volume: 익명의 볼륨 생성
      docker run -v /app/data
      
      # Named Volume: 명명된 볼륨 생성
      docker run -v <"data">:/app/data
      
      # Bind Mounts: 실제로 호스트 머신의 폴더를 가리키는 절대 경로
      docker run -v <"HostPath">:/app/data
      docker run -v "%cd%":/app/data
      
      ## Bind Mounts 읽기 전용
      docker run -v <"HostPath">:/app/data:ro
      
      ## Bind Mounts 읽기/쓰기 전용
      docker run -v <"HostPath">:/app/data:rw

'Study > Docker&Kubernetes' 카테고리의 다른 글

[Docker] 컨테이너 통신  (0) 2026.03.04
[Docker] .dockerignore&.env&ARG 작업  (0) 2026.03.03
[Docker] Docker Hub  (0) 2026.02.20
[Docker] 이미지와 컨테이너  (0) 2026.02.12
[Docker] Dockerfile 작성 및 명령어  (1) 2026.02.12