본문 바로가기
docker

[Docker] Volume의 정의, 종류, 터미널에서 사용하는 법

by dev여름 2025. 2. 3.
반응형

Volume이란?

  • 호스트머신(로컬 머신)의 폴더. 이미지에 존재하지 않고, 도커 컨테이너와 매핑된다.
  • COPY 명령어와 비슷해 보이지만, copy 명령어는 파일을 복사만 하기 때문에 컨테이너 외부에서는 사용하지 못한다.
  • volume은 실제로 폴더를 연결하기 때문에 컨테이너 외부/호스트머신에서도 사용이 가능하다.
  • 볼륨을 지정하면, Docker는 우리의 로컬머신 어딘가 경로에 컨테이너의 폴더를 매핑하는데, 그 경로는 우리가 알 수 없다.
  • Anonymous volume과 Named volume이 있다.

 

Volume 종류, 예시

예를 들어 고객의 피드백을 받는 웹애플리케이션의 구조가 다음과 같다고 하자.

고객이 어떤 피드백을 입력했을 때 피드백은 텍스트 파일 형태로 feedback이라는 폴더 안에 저장된다.

이 웹 애플리케이션이 돌아가고 있는 컨테이너가 제거되어도 로컬 경로에 파일이 유지되기를 원한다.

현재 Dockerfile은 다음과 같다.

FROM node:14

WORKDIR /app

COPY package.json .

RUN npm install

COPY . .

EXPOSE 80

CMD [ "node", "server.js" ]

우리의 컨테이너 워크디렉토리는 /app에서 시작하고, 우리는 /feedback 폴더에 볼륨을 지정하고 싶으므로 아래와 같이 지정할 수 있다.

Anonymous Volume (익명 볼륨)

익명 볼륨은 우리가 볼륨의 이름을 지정하지 않고, 매핑할 컨테이너의 경로만 지정한다.

docker bulid -t imagename .
docker run -d -p 3000:80 --rm --name containername -v /app/feedback imagename
docker volume ls

DRIVER    VOLUME NAME
local     3f34a5b8ca185ee642bc3a888df76388627a19e9daab84529772ee5e848e3ccb

docker volume ls 명령어를 실행하면, 우리의 로컬머신 어딘가에 있는 볼륨에 대해 알려준다.

그런데 여기서 docker stop 명령어로 컨테이너를 중지(우리는 컨테이너 실행 명령에 —rm 옵션을 넣었기 때문에 컨테이너가 중지되면 삭제까지 한다.)하고 볼륨을 다시 조회해보면, 볼륨이 사라진 것을 확인할 수 있다.

Named Volume (이름 지정 볼륨)

이름 지정 볼륨은 우리가 로컬에 저장될 볼륨의 이름과 함께 매핑할 컨테이너의 경로를 지정한다.

docker run -d -p 3000:80 --rm --name containername -v volumename:/app/feedback imagename
docker volume ls

DRIVER    VOLUME NAME
local     volumename

하지만 이때는 docker stop 명령어로 컨테이너를 중지하고 삭제한 뒤 docker volume ls로 확인해보면 우리가 지정한 볼륨이 그대로 남아있는 것을 확인할 수 있다.

 

컨테이너 실행 시 —rm 옵션을 사용하지 않는 경우 Anonymous Volume

이 경우, 컨테이너를 멈추고 docker rm 명령어로 컨테이너를 삭제해도 익명 볼륨이 로컬머신에서 사라지지 않는 것을 확인할 수 있다.

이유는 모른다….왜 저에게 이런 시련을 주시나요

docker bulid -t imagename .
docker run -d -p 3000:80 --name containername -v /app/feedback imagename
docker volume ls
DRIVER    VOLUME NAME
local     d6e3626727d191ea87bcd608db7d0b8881709bec6322fa753eb10bbc27de75dc

docker stop containername
docker volume ls
DRIVER    VOLUME NAME
local     d6e3626727d191ea87bcd608db7d0b8881709bec6322fa753eb10bbc27de75dc

docker rm contianername
docker volume ls
DRIVER    VOLUME NAME
local     d6e3626727d191ea87bcd608db7d0b8881709bec6322fa753eb10bbc27de75dc

여하튼 그래서 볼륨이 삭제되지 않기 때문에 명시적으로 지워줘야 한다.

docker volume rm 볼륨이름 혹은 docker volume prune 명령어로 지우면 된다.

docker volume prune
WARNING! This will remove anonymous local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
d6e3626727d191ea87bcd608db7d0b8881709bec6322fa753eb10bbc27de75dc

Total reclaimed space: 0B

 

 

함께 보면 좋은 글

2025.02.02 - [docker] - [Docker] Volume과 Bind Mount의 정의, 필요한 이유

 

[Docker] Volume과 Bind Mount의 정의, 필요한 이유

이 글은 Udemy 강의 Docker & Kubernetes: The Practical Guide [2024 Edition]을 수강하며 정리한 내용입니다. Data의 종류불변 & 읽기 전용 데이터소스코드나 운영체제를 포함한 애플리케이션을 docker image로 빌드

dev.hasummer.com

 

반응형