SW/Kubernetes, Docker

Docker로 Node.js 개발환경 구축하기: 실시간 반영, 로그 보존, 환경변수까지 완벽정리

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

Docker로 Node.js 개발, 이렇게 하니까 진짜 편해졌어요 (로그 보존부터 환경 변수까지)

처음엔 Docker가 그냥 배포용 도구인 줄만 알았어요. 근데 써보니까, 이거 개발에도 엄청 유용하더라고요. 특히 Node.js 프로젝트 할 땐 진짜 신세계예요. 오늘은 제가 직접 해보면서 느꼈던 거랑, 어떻게 설정하면 편한지 찐 경험을 담아서 풀어볼게요. 로그도 잘 남고, 코드 바꾸면 바로 반영되고, 비밀번호 같은 건 안전하게 처리하고요. 다 같이 해봐요.

 


 

🧠 이런 개발 환경, 간절하지 않으세요?

이런 거요:

  • 컨테이너 재시작해도 로그 안 날아가고요.
  • 코드 수정하면 서버도 자동으로 반응하고요.
  • DB 접속 같은 민감한 정보는 코드에 안 박고 안전하게 관리하는 거죠.

이게 처음엔 복잡해 보여도, 하나하나 해보면 별거 없어요. 저도 그랬어요.

 


 

🛠 Step 1: MongoDB 로그 날아가지 않게 하기

일단 MongoDB는 volume 설정해서 데이터 날아가지 않게 만들었고요. 여러 컨테이너가 붙을 수 있게도 해놨어요. 이건 이미 다들 해보셨을 테니까 넘어가고, 이제 Node.js 백엔드에 이걸 적용할 거예요.

 


 

🔄 Step 2: Node.js 컨테이너, 좀 더 유연하게 바꾸기

1. 일단 기존 컨테이너 멈춰줘요

기존에 돌던 거 있으면 꺼주세요:

docker stop goals-backend

 

2. 로그도 남기고, 코드도 실시간 반영되게 volume 추가하기

두 가지 volume 씁니다:

  • 로그는 named volume으로
  • 코드 수정되면 바로 반영되게 bind mount
docker run -d \
  -v logs:/app/logs \
  -v /full/path/to/backend:/app \
  goals-node

 

/app/logs는 로그 저장하는 곳이고요, /app은 그냥 우리 코드 있는 디렉터리라고 생각하면 돼요.

⚠️ 백엔드 폴더 전체 경로 넣으셔야 돼요. 파일 하나 경로 말고!

 

3. node_modules 깨지지 않게 보호막 하나 추가하기

호스트에 node_modules 없으면 컨테이너가 엉망돼요. 그래서 이거 꼭 해주세요:

-v /app/node_modules

 

이거 하나면 갑자기 서버 안 켜지는 일은 안 생겨요. 제가 한 번 겪어봤거든요. 고통이었습니다.

 


 

 

🔃 코드 바꿀 때마다 자동으로 서버 리스타트 되게 하기 (nodemon 최고)

Docker는 기본적으로 코드 수정해도 서버 재시작 안 해줘요. 그래서 Nodemon이라는 친구가 필요해요.

 

Nodemon 설치는 이렇게

package-lock.json은 지워주시고요, package.json은 이렇게 바꿔요:

"devDependencies": {
  "nodemon": "2.0.4"
},
"scripts": {
  "start": "nodemon app.js"
}

 

Dockerfile도 손 좀 봐야 해요

 

Dockerfile도 손 좀 봐야 해요

CMD ["npm", "start"]

 

그다음 이미지 다시 빌드하세요:

docker build -t goals-node .

 

이제 컨테이너 실행:

docker run -d \
  -v logs:/app/logs \
  -v /full/path/to/backend:/app \
  -v /app/node_modules \
  goals-node

 

코드에 한 줄만 바꿔보세요. 로그 확인은 이렇게:

docker logs goals-backend

 

Nodemon이 알아서 서버 다시 켜줍니다. 진짜 감동이에요.

 


 

🔐 비밀번호 같은 거 코드에 박지 말자, 환경 변수 쓰자

진짜 중요한 부분이에요. 코드에 비번이나 계정 정보 넣으면 안 돼요. 나중에 Git에 올라가면 사고 납니다.

 

1. Dockerfile에서 기본값 넣기

ENV MONGODB_USERNAME=max
ENV MONGODB_PASSWORD=secret

 

기본값이긴 하지만, 실행할 때 원하는 값으로 덮을 수 있어요.

 

2. app.js에서 환경 변수 꺼내쓰기

const username = process.env.MONGODB_USERNAME;
const password = process.env.MONGODB_PASSWORD;
const uri = `mongodb://${username}:${password}@mongodb:27017/goals?authSource=admin`;

 

3. 컨테이너 실행할 때 변수 주입하기

docker run -d \
  -v logs:/app/logs \
  -v /full/path/to/backend:/app \
  -v /app/node_modules \
  -e MONGODB_USERNAME=max \
  -e MONGODB_PASSWORD=secret \
  goals-node

 

이제 docker logs goals-backend 하면 DB 연결도 잘 되는 거 확인할 수 있어요.

 


 

🧼 .dockerignore는 깔끔함의 시작이에요

안 써도 되는 파일 굳이 다 컨테이너에 복사하지 말고, 이런 식으로 걸러줘요:

node_modules
Dockerfile
.git

 

빌드 속도 빨라지고, 쓸데없는 파일 덜어내니까 관리도 편해요.

 


 

✅ 마지막 점검 리스트 (이거 체크하세요)

 

✅ 마지막 점검 리스트 (이거 체크하세요)

  • 이미지 새로 빌드했나요?
  • volume 설정 다 했나요?
  • 코드 바꿀 때 nodemon이 반응하나요?
  • DB 연결 테스트는 해봤나요?
  • 프론트엔드도 잘 붙나요?

 


 

❤️ 이 방식, 진심 편합니다

제가 이거 안 하고 개발할 땐 진짜 매번 컨테이너 껐다 켜고 로그는 날아가고... 스트레스였어요. 근데 이렇게 구성해놓고 나니까,

  • 로그도 날아가지 않고
  • 코드 바꾸면 바로 적용되고
  • 민감한 정보도 안전하게 관리되고

정말 하나하나가 삶의 질 향상이에요.

반응형