개요
앞선 포스팅에서 살펴본 것처럼, Docker 컨테이너는 격리성이라는 특징 때문에 컨테이너가 삭제되면 내부의 데이터도 함께 사라지는 문제가 있었습니다.
이는 실제 운영 환경에서 심각한 문제가 될 수 있습니다. 이번 포스팅에서는 이 문제를 해결할 수 있는 Docker Volume에 대해 자세히 알아보겠습니다.
Docker Volume이란❓
Docker Volume은 컨테이너의 데이터를 호스트 시스템에 영구적으로 저장할 수 있게 해주는 메커니즘입니다. 컨테이너가 삭제되어도 볼륨은 독립적으로 유지되어 데이터를 안전하게 보존할 수 있습니다.
볼륨의 종류
1. 익명(Anonymous) 볼륨
VOLUME ["/app/feedback"]
- Dockerfile 내에서 VOLUME 명령어로 정의됩니다
- Docker가 임의의 경로에 자동으로 생성하며, 접근이 어렵습니다
- 컨테이너가 삭제되면 함께 삭제되는 한계가 있습니다
- 컨테이너 생명주기와 연결되어 있어 임시 저장소로 적합합니다.
2. 명명된(Named) 볼륨
-v [볼륨이름]:[컨테이너경로]
- 실행 시 -v 옵션으로 명시적으로 지정합니다.
- 사용자가 이름을 직접 지정하여 관리가 용이합니다.
- 컨테이너가 삭제되어도 볼륨은 유지됩니다.
- 여러 컨테이너에서 재사용이 가능합니다.
익명(Anonymous) Volume 확인해보기 ✅
먼저 Dockerfile에 VOLUME 명령어를 추가하여 익명 볼륨을 설정해보겠습니다. 익명 볼륨은 Docker가 자동으로 생성하고 관리하는 임시 저장 공간입니다.
1. Dockerfile 생성
2. 이미지 빌드
3. 컨테이너 실행
--rm 옵션을 사용하여 컨테이너 중지 시 자동 삭제되도록 설정했습니다.
1. 데이터 저장
- localhost:3000에 접속하여 폼 작성
- 제목: "park", 내용: "ZINU" 입력
- http://localhost:3000/feedback/park.txt로 접속하여 저장된 내용 확인
"http://localhost:3000/feedback/park.txt" 지정한 파일명으로 접속을 해보면 위와 같이 잘 표시가 되었습니다.
이제 본 글에서 중요한 개념인 볼륨을 확인해보겠습니다. 볼륨을 확인하기 위해 컨테이너를 중지하고, 다시 시작하면 파일이 존재해야합니다.
2. 볼륨 동작 확인
동일한 이미지를 기반으로 새로운 컨테이너를 실행하고 접속을 해보면,
파일이 존재하지 않습니다. 이유가 무엇일까요?
VOLUME [ "/app/feedback" ]
현재는 볼륨의 익명(Anonymous) 볼륨을 사용하고 있습니다. Dockerfile의 VOLUME 명령어는 이미지에 익명 볼륨을 추가하고, 그 이미지를 기반으로 실행되는 컨테이너에 데이터를 저장할 공간을 만듭니다.
이름을 지정하지 않았기 때문에 익명의 볼륨이 생성됩니다. 컨테이너를 중지하고 다시 볼륨 리스트를 확인해보면 익명 볼륨이 사라진 것을 확인할 수 있습니다.
익명 볼륨은 Docker가 관리합니다. 따라서 컨테이너가 존재하는 동안에만 실제로 존재하기 때문에, 앞선 포스팅에서 다룬 데이터 영속성 문제를 해결하지 못합니다.
컨테이너에 정의된 경로는 생성된 볼륨에 매핑되어 호스트 머신 상의 경로로 연결됩니다. 예를 들어, 다음 Dockerfile을 보겠습니다:
FROM node:14
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
EXPOSE 80
VOLUME [ "/app/feedback" ]
CMD [ "node", "server.js" ]
여기서 /app/feedback 경로 는 호스트 머신의 어떤 폴더에 매핑됩니다. 하지만 우리는 이 경로를 알 수 없습니다. Docker가 관리하기 때문입니다.
이 경로는 로컬 머신 어딘가에 숨겨져 있으며, 직접 접근할 수도 없습니다.
익명 볼륨의 한계
- 임시성
- 컨테이너의 생명주기와 연결됨
- 컨테이너 삭제 시 볼륨도 함께 삭제
- 접근성
- 호스트 시스템의 어느 위치에 저장되는지
확인 불가 - Docker가 자동으로 관리하여
직접 접근어려움
- 호스트 시스템의 어느 위치에 저장되는지
- 재사용성
- 새 컨테이너에서
이전 데이터 재사용 불가 - 데이터의
영속성 보장되지 않음
- 새 컨테이너에서
이러한 문제점을 해결할 수 있는 개념이 바로 "명명된(named) 볼륨"입니다. 명명된 볼륨을 사용하면 컨테이너가 종료된 후에도 볼륨이 유지됩니다. 즉, 하드 드라이브의 데이터가 그대로 보존됩니다.
따라서 새 컨테이너를 시작하면 볼륨이 다시 연결되어, 이전에 저장했던 모든 데이터를 계속해서 사용할 수 있습니다.
명명된(Named) Volume 확인해보기 ✅
Dockerfile 내부에서는 명명된 볼륨을 직접 생성할 수 없습니다. 따라서 앞서 사용했던 VOLUME 명령어는 제거하고, 대신 컨테이너를 실행할 때 명명된 볼륨을 지정해야 합니다.
먼저 이전 컨테이너와 이미지를 정리하고 새로 시작해보겠습니다:
docker run -d -p 3000:80 --rm --name feedback-app -v feedback:/app/feedback feedback-node:volumes
이전과 달리 -v 옵션을 사용하여 명명된 볼륨을 생성합니다. 문법을 살펴보면:
- feedback
- 볼륨 이름 (사용자가 지정한 이름)
- /app/feedback
- 컨테이너 내부의 마운트 경로
명명된 볼륨을 확인하기위해 3000번에 접속하고 위와 같이 메시지를 추가하고 저장합니다.
정상적으로 저장한 메시지가 표시가되고, 이제 볼륨을 확인해보겠습니다.
저장이 완료되면 볼륨이 제대로 동작하는지 테스트를 해보겠습니다. --rm 옵션으로 실행했기 때문에 컨테이너를 중지하면 자동으로 삭제됩니다. 하지만 볼륨은 그대로 유지되어야 합니다.
docker volume ls 명령어로 확인해보면, 컨테이너가 중지되었음에도 앞서 -v 옵션으로 생성한 'feedback' 볼륨이 그대로 남아있는 것을 볼 수 있습니다.
이제 다시 같은 볼륨을 사용하여 새 컨테이너를 시작해보겠습니다:
docker run -d -p 3000:80 --rm --name feedback-app -v feedback:/app/feedback feedback-node:volumes
동일한 볼륨 이름(feedback)을 지닌 "-v"옵션으로 즉, 이전과 같은 볼륨 이름으로 재실행합니다.
웹 브라우저에서 다시 확인해보면, 컨테이너가 새로 생성되었음에도 이전에 저장했던 데이터가 그대로 유지되어 있는 것을 확인할 수 있습니다. 이것이 바로 명명된 볼륨의 강력한 장점입니다.
결론
Docker Volume은 컨테이너의 데이터를 효과적으로 관리할 수 있는 핵심 기능입니다. 특히 이번 포스팅에서 살펴본 두 가지 볼륨 유형은 각각 다른 용도로 활용될 수 있습니다.
익명 볼륨
- 컨테이너의 임시 데이터 저장에 적합
- 컨테이너의 생명주기와 함께 관리되어 편리
- 테스트나 일회성 데이터 처리에 유용
명명된 볼륨
- 지속적인 데이터 보존이 필요한 운영 환경에 적합
- 여러 컨테이너 간 데이터 공유 가능
- 명시적인 이름으로 관리가 용이
실제 운영 환경에서는 데이터의 영속성이 매우 중요하므로, 명명된 볼륨 사용을 권장 합니다. 이를 통해 컨테이너의 격리성이라는 장점은 유지하면서도, 안정적인 데이터 관리가 가능해집니다.
'DevOps > Docker' 카테고리의 다른 글
[Docker] 도커 바인드 마운트란 무엇일까❓: 데이터 저장과 실시간 공유 (0) | 2025.01.07 |
---|---|
[Docker] 컨테이너의 파일시스템 이해하기: 데이터는 어디에 저장될까❓ (0) | 2025.01.05 |
[Docker] Docker에서 컨테이너와 이미지 식별을 위한 이름 및 태그 활용 알아보기 (0) | 2024.12.30 |
[Docker] Docker cp로 컨테이너 ↔ 로컬 간 파일 복사하기 (0) | 2024.12.29 |
[Docker] Docker 컨테이너의 실행 모드: Attach vs Detach (0) | 2024.12.26 |