SW/Kubernetes, Docker

Nodemon으로 Docker 개발환경 자동화하는 법 (Node.js 개발자 필독!)

얇은생각 2025. 9. 5. 07:30
반응형

Docker Volumes랑 Nodemon 써봤더니 생긴 일: 현실적인 개발 이야기

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

 


 

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 + 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, 제대로 알아두면 든든해요

 

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 써보세요. 서버 껐다 켰다 반복하는 시간 줄이면 생산성도, 스트레스도 확 줄어요.

반응형