Docker Volumes, 진짜 써보니까 이런 느낌이에요
처음 Docker 시작했을 때, volume이 뭐냐고요? 저도 뭔가 파일이 저장되긴 한다는데 그게 도대체 어디에 저장되는지도 모르겠고, 뭘 설정해야 할지도 막막했어요. 근데 한 번 실무에서 제대로 써보고 나니까 아~ 이래서 사람들이 volume, volume 하는구나 싶더라고요.
오늘은 제가 직접 써보면서 느낀 내용을 바탕으로, 너무 어렵지 않게 volume 이야기를 풀어볼게요. read-only mount가 왜 필요한지, 익명 볼륨이 어떻게 작동하는지, 컨테이너가 내 파일을 어떻게 망칠 수 있는지도 얘기해볼게요.
자, 그럼 중요한 얘기부터 들어가 봅시다: read-only bind mount!

왜 굳이 read-only로 만들어요?
제가 한창 feedback 앱을 Docker로 돌리고 있을 때였어요. 매번 docker run으로 실행하고, 그 앱은 의존성도 많고 여러 파일들이 막 생기더라고요. 근데 어느 날, 컨테이너 안에서 내 소스 파일이 바뀌어 있더라고요... 순간 헉! 했죠.
그래서 깨달았어요. 바인드 마운트가 있다고 해도 꼭 다 쓸 수 있게 열어둘 필요는 없다는 걸요. 그냥 읽기만 되게 하면, 적어도 코드가 망가질 일은 없겠구나 싶었죠.
설정은 간단해요:
docker run -v $(pwd):/app:ro my-feedback-app
:ro만 붙이면 진짜로 못 건드려요. 이거 하나로 마음이 좀 편해졌습니다.

근데 앱도 뭔가 저장은 해야 하잖아요
맞아요, 코드만 읽으면 되는 게 아니라, 앱은 뭔가 저장도 해야 하잖아요. Node.js는 예를 들어 로그나 파일을 /app/temp나 /app/feedback 같은 데에 저장하려고 하거든요.
그래서 저는 이 폴더들만 따로 쓰기 가능한 volume으로 설정했어요. Docker는 디렉토리 경로가 더 구체적이면 그걸 우선하니까, 이렇게 하면 메인 코드는 read-only로 두면서 필요한 폴더는 writable하게 만들 수 있어요:
docker run \
-v $(pwd):/app:ro \
-v feedback-data:/app/feedback \
-v /app/temp \
my-feedback-app
이렇게 하고 나니까 앱도 잘 돌아가고, 제 소중한 코드도 안전하고... 한결 마음이 편했죠.
Bind Mount vs Volume, 뭔 차이냐고요?
딱 정리해드릴게요.
- Bind mount는 내 컴퓨터에 있는 폴더를 그대로 컨테이너에 연결하는 거예요. 수정하면 바로 반영돼요. 편하지만 위험하죠.
- Volume은 Docker가 알아서 관리하는 공간이에요. 내 컴퓨터 어딘가엔 있는데 직접 보기 어려워요. 대신 깔끔하게 유지되죠.
궁금하면 이거 쳐보세요:
docker volume ls
bind mount는 안 보이고, Docker가 직접 관리하는 것만 리스트로 나옵니다.

Docker는 Volume을 어떻게 다룰까?
어떤 volume이 없는데도 docker run 할 때 -v 옵션으로 지정하면요, Docker가 알아서 만들어줘요. 기특하죠?
자세히 알고 싶다면 이 명령어 추천:
docker volume inspect feedback-data
여기서 생성 시점이나 저장 경로 같은 것도 볼 수 있어요. 근데 그 경로는 Docker 시스템 안에 있어서 우리가 직접 접근하긴 좀 어려워요. 뭔가 ‘숨어 있는 저장소’ 느낌이에요.
직접 Volume을 만들어야 하나요?
음, 꼭 그런 건 아닌데요. 저는 가끔 이름 붙여서 관리하고 싶을 때 만들어요:
docker volume create my-volume
깔끔하게 이름 붙여놓으면 정리할 때도 좋아요. 안 쓰는 거 정리하고 싶을 땐:
docker volume prune
특정한 것만 지우고 싶으면:
docker volume rm my-volume
주의! 현재 컨테이너가 쓰고 있는 볼륨은 못 지워요. 그럴 땐 컨테이너부터 종료해야 돼요.
익명 볼륨은 뭐예요? 이름 없는 친구
가끔 그냥 한 번 쓰고 말 데이터 저장소가 필요할 때가 있잖아요. 그럴 때는 익명 볼륨을 씁니다. --rm 옵션과 같이 쓰면 컨테이너 꺼지면서 같이 사라져요:
docker run --rm -v /app/temp my-app
근데 데이터를 계속 보존하고 싶다면? 이름 붙여야죠:
docker run -v feedback-data:/app/feedback my-app
코드를 안전하게 지키는 작은 습관
진짜 이거 한 번 써보세요. read-only bind mount 설정해두면 코드 날릴 걱정 확 줄어요. 꼭 보안 때문이 아니라, 실수로 수정하는 것도 막아주니까요.
예전에 제가 실수로 index.js 내용 날려서 다시 쓰느라 고생한 기억이 있거든요. 그 이후로는 읽기 전용 mount가 기본 세팅이 됐어요.
'SW > Kubernetes, Docker' 카테고리의 다른 글
| Docker ARG와 ENV 차이점 완벽 정리: 실무에서 바로 써먹는 설정 팁 (0) | 2025.09.08 |
|---|---|
| Dockerfile COPY 꼭 써야 할까? Bind Mount만으로 충분할지 완전 정리! (0) | 2025.09.07 |
| Nodemon으로 Docker 개발환경 자동화하는 법 (Node.js 개발자 필독!) (0) | 2025.09.05 |
| Docker bind mount 설정 시 꼭 알아야 할 node_modules 보호법 (0) | 2025.09.04 |
| Docker에서 데이터 사라지는 이유와 해결법: Volume과 Bind Mount 완전 정리 (0) | 2025.09.03 |