Docker Volumes랑 Nodemon 써봤더니 생긴 일: 현실적인 개발 이야기
요즘 개발할 때 Docker 안 쓰는 사람 찾기 어려운 거 아시죠? 저도 마찬가지인데요, 처음엔 "이거 신세계네!" 싶었어요. 작업 속도 빨라지고, 환경 설정도 깔끔하게 정리되고요. 근데 Node.js 앱 만들다 보면 살짝 짜증나는 포인트가 하나 있어요. HTML은 수정하면 바로 반영되는데, JavaScript는 고쳐도 아무 일도 안 일어나는 겁니다. 처음엔 뭐가 문제인지 한참 헤맸어요.

JavaScript 파일 고쳤는데 왜 안 바뀌는 거야?!
- JavaScript 파일을 수정해도 Docker는 이를 감지하지 못해 변경사항이 반영되지 않음
- Node.js는 파일 변경 시 자동으로 서버를 재시작하지 않음
- --rm 옵션을 사용하면 컨테이너가 멈출 때 삭제되므로 매번 재생성이 필요함
- 반복적인 컨테이너 재시작이 개발 생산성을 떨어뜨림
처음엔 분명히 뭔가 잘못한 줄 알았어요. console.log("Test") 넣고 기대에 부풀어 로그를 확인했는데... 텅 비어 있는 거예요. 알고 보니 Docker는 그 파일이 바뀐 줄도 몰라요.
Node.js는 서버 코드를 실행만 해줄 뿐이지, 누가 고쳤는지는 신경 안 씁니다. 바뀐 걸 반영하려면 컨테이너를 껐다 켜야 해요. 거기다 --rm 옵션까지 줬다면? 멈추는 순간 컨테이너가 사라져서 매번 다시 만들어야 하죠. 진짜 너무 귀찮아요.
그래서 등장한 히어로, Nodemon
- Nodemon은 파일 저장 시 서버를 자동으로 재시작해주는 툴
- package.json에 devDependencies와 scripts 설정 필요
- Dockerfile의 CMD 명령어를 npm start로 수정해야 함
- 이미지 재빌드 후 컨테이너를 실행하면 파일 저장만으로도 서버가 자동 재시작됨
개발할 때마다 매번 서버를 껐다 켜는 건 진짜 너무 비효율적이잖아요? 그럴 때 딱 필요한 게 Nodemon이에요. 파일 저장할 때마다 자동으로 서버를 재시작해 주는 완소 도구죠.
일단 package.json에 요렇게 적어주세요:
"devDependencies": {
"nodemon": "2.0.4"
}
그리고 scripts에 이거 하나만 추가하면 끝:
"scripts": {
"start": "nodemon server.js"
}
이제 node server.js 대신 npm start만 치면 돼요. 그리고 Dockerfile도 약간 손 봐야 해요. 기존엔:
CMD ["node", "server.js"]
이랬던 걸:
CMD ["npm", "start"]
이렇게 바꿔주세요.
그리고 이미지 다시 빌드하고 컨테이너 실행하면? 이제부터는 파일 저장만 해도 서버가 자동으로 다시 켜집니다. 로그 보면서 "오~ 잘 된다!" 싶은 기분, 해보시면 아실 거예요.

WSL2 + Windows 조합이라면 꼭 봐주세요!
- WSL2 환경에서 파일 변경이 Docker에 반영되지 않는 경우가 있음
- 원인은 프로젝트가 Windows 파일 시스템에 저장되어 있기 때문
- 해결 방법은 WSL 내 Linux 경로에 프로젝트를 이동시키는 것
- 예: /home/your-name/projects/와 같은 경로로 옮기면 정상 작동함
저처럼 Windows에서 WSL2로 Docker 돌리시는 분들 있죠? 이 경우엔 또 다른 복병이 있어요. 위에서 말한 방식이 안 먹히는 경우가 있거든요. 이유는 간단해요. 프로젝트 파일을 Windows 파일 시스템에 저장해서 그렇습니다.
이럴 땐 프로젝트 폴더를 아예 WSL 안에 있는 Linux 디렉토리로 옮겨야 해요. 예를 들면 /home/your-name/projects/ 같은 곳에 말이죠. 이렇게 하면 파일 변경도 잘 전달되고, nodemon도 잘 작동합니다.

Docker Volumes랑 Bind Mounts, 제대로 알아두면 든든해요
-v 옵션 하나로 여러 가지 데이터를 다룰 수 있다는 거, 알고 계셨나요? 저도 처음엔 뭐가 뭔지 헷갈렸는데, 정리해보니 생각보다 간단하더라고요. 자주 쓰는 세 가지 방식, 소개해드릴게요.
1. Anonymous Volumes
딱히 이름 붙이지 않고 그냥 쓰는 방식이에요:
docker run -v /app/data my-container
요약하자면:
- 컨테이너 켜져 있을 때만 존재해요.
- 꺼지면 같이 사라집니다.
- 다른 컨테이너랑 공유 안 돼요.
- 임시 파일이나 캐시용으로 딱이에요.
2. Named Volumes
이번엔 이름 붙여서 사용하는 방식:
docker run -v feedback:/app/data my-container
요약하자면:
- 이름 있으니까 다시 써먹기 좋아요.
- 컨테이너가 삭제돼도 데이터는 그대로 남아요.
- 여러 컨테이너끼리도 공유 가능해요.
- 중요한 데이터 저장할 때 유용하죠.
3. Bind Mounts
내 컴퓨터에 있는 특정 폴더를 Docker에 연결하는 방식이에요:
docker run -v /path/on/host:/app my-container
요약하자면:
- 로컬에서 고치면 바로 반영돼요.
- 개발할 때 속도감 있게 작업할 수 있어요.
- 컨테이너 꺼져도 데이터는 그대로 남아요.
- 직접 지우지 않는 이상 데이터는 계속 남아 있어요.
결국 어떤 걸 써야 할까?
- 상황에 따라 적절한 volume 방식 선택 필요
- Anonymous Volumes: 임시 파일이나 테스트용으로 적합
- Named Volumes: 중요한 데이터를 지속적으로 저장할 때 유리
- Bind Mounts: 실시간 파일 변경 반영이 필요한 개발 환경에 필수
- Node.js 개발에서는 nodemon을 활용해 서버 재시작을 자동화하면 효율 극대화
상황마다 다르긴 한데, 대충 이렇게 나눠보면 좋아요:
- Anonymous Volumes는 일회성 데이터에.
- Named Volumes는 오래 보관할 데이터에.
- Bind Mounts는 개발 중 실시간 반영이 필요할 때.
그리고 Node.js 개발할 땐 무조건 nodemon 써보세요. 서버 껐다 켰다 반복하는 시간 줄이면 생산성도, 스트레스도 확 줄어요.
'SW > Kubernetes, Docker' 카테고리의 다른 글
| Dockerfile COPY 꼭 써야 할까? Bind Mount만으로 충분할지 완전 정리! (0) | 2025.09.07 |
|---|---|
| Docker에서 read-only mount 설정하는 이유와 실전 적용 팁 (0) | 2025.09.06 |
| Docker bind mount 설정 시 꼭 알아야 할 node_modules 보호법 (0) | 2025.09.04 |
| Docker에서 데이터 사라지는 이유와 해결법: Volume과 Bind Mount 완전 정리 (0) | 2025.09.03 |
| Docker에서 데이터 유지하려면 꼭 알아야 할 Volumes 개념과 실습 방법 (0) | 2025.09.02 |