Docker에서 MongoDB 데이터 날아가는 걸 막고, 접속도 똑똑하게 관리하는 이야기
앱 만들다가 진짜 당황한 적 있어요. 딱 제 얘긴데요—Docker로 MongoDB 띄우고, 열심히 목표 같은 데이터 저장해놨는데, 컨테이너 한 번 껐다 켜니까… 헉, 아무것도 없더라고요. 말 그대로 싹 사라졌습니다. 마치 기억상실에 걸린 것처럼요.
이게 Docker의 묘한 특징이더라고요. 아무 말 없이 컨테이너 멈추면 내부 데이터까지 같이 정리해버리는 거죠. 처음엔 진짜 허탈했어요. 근데 알고 보니 방법이 있더라고요. 이 글에서는 제가 겪었던 시행착오를 바탕으로, 어떻게 하면 MongoDB 데이터를 날리지 않고 잘 보관할 수 있는지, 또 외부 접속은 어떻게 막을 수 있는지를 천천히 풀어볼게요.

🤯 왜 MongoDB는 자꾸 까먹는 걸까요?
예전엔 이렇게만 실행했어요:
docker run --name mongodb mongo
작업 다 끝내고 나서, 컨테이너를 중지했죠:
docker stop mongodb
그런데 다시 실행하니까, 앱은 멀쩡히 돌아가는데… 데이터가 통째로 사라졌어요. 아무리 눈 비벼봐도 없더라고요.
Docker가 컨테이너 정지하면서 내부 파일도 같이 정리해버리기 때문이에요. MongoDB도 거기 저장돼 있다 보니, 당연히 날아가는 거죠. 처음엔 이 사실을 모르고 몇 번이나 같은 삽질을 반복했어요.

🛟 해결책: Volume으로 MongoDB 데이터 구출하기
제가 배운 건 이거예요—MongoDB 데이터를 Docker 밖으로 빼야 해요. 호스트 컴퓨터의 안전한 공간에 따로 보관하는 거죠.
그 방법이 바로 Docker volume이에요. 어렵지 않아요.
- 우선 컨테이너 멈춰주세요:
docker stop mongodb
- 그리고 volume을 써서 다시 실행해봅시다:
docker run --name mongodb -v data:/data/db mongo
여기서 핵심은 /data/db예요. MongoDB가 데이터 저장하는 기본 경로인데, 그걸 data라는 volume에 연결한 거죠.
이렇게 해두면, 컨테이너를 지워도 volume은 살아 있어요. 새 컨테이너로 다시 띄워도 이전 데이터가 그대로 복원됩니다. 저처럼 '헉, 내 데이터 어디 갔어?' 하는 일은 이제 없을 거예요.
🔒 MongoDB, 누구나 접속 가능? No thanks!
데이터는 이제 안전하게 저장되지만, 또 하나 중요한 게 있어요. 보안이에요. 처음 MongoDB 띄우면 누구든 접속할 수 있게 되어 있어요. 생각만 해도 아찔하죠.
그래서 환경 변수로 사용자 인증을 설정해줘야 해요.
- MONGO_INITDB_ROOT_USERNAME
- MONGO_INITDB_ROOT_PASSWORD
- 기존 컨테이너를 완전히 정리합니다:
docker stop mongodb
docker rm mongodb
- 그리고 인증 설정을 추가해 다시 실행합니다:
docker run --name mongodb \
-e MONGO_INITDB_ROOT_USERNAME=max \
-e MONGO_INITDB_ROOT_PASSWORD=secret \
-v data:/data/db \
mongo
이제부터는 max라는 사용자 이름과 secret이라는 비밀번호 없이는 접속이 불가능합니다. 저도 처음 이 설정을 하고 앱을 실행했더니 바로 에러 나더라고요. 알고 보니 앱 코드가 여전히 인증 없이 MongoDB에 접근하려고 했던 거죠.
🔧 앱도 바뀐 설정에 맞춰야죠!
Node.js 백엔드 코드를 수정해야 합니다. 예전에는 이렇게 단순하게 연결했는데:
mongoose.connect('mongodb://mongodb:27017/goals')
이제는 로그인 정보와 인증 경로까지 추가해줘야 합니다:
mongoose.connect('mongodb://max:secret@mongodb:27017/goals?authSource=admin')
설명하자면:
- max:secret@mongodb는 MongoDB에 접속할 사용자 계정,
- ?authSource=admin은 어떤 데이터베이스에서 인증할 건지 알려주는 부분이에요.
- 이 코드를 바꿨다면, 도커 이미지도 다시 빌드합니다:
docker build -t goals-node .
- 그리고 다시 실행:
docker run --name goals-backend --network=goals-network goals-node
다시 돌아온 앱! 그리고 살아있는 데이터! 감격이죠.

🙌 이제 마음 편하게 개발하자!
- 컨테이너가 꺼져도 데이터는 날아가지 않아요.
- 외부 접근은 계정 없으면 불가능해요.
- 앱도 인증 정보를 이용해 문제없이 MongoDB에 연결돼요.
이제야 좀 '믿고 쓸 수 있는 시스템'이 된 것 같아요.
😊 개발자의 마음으로
사소해 보일 수 있지만, 이런 설정 하나하나가 결국 사용자 데이터를 지켜주고, 내 서비스의 신뢰도를 만들어줘요. 처음엔 volume 설정 하나에도 손이 떨렸지만, 지금은 기본으로 넣고 있죠.
여러분도 한 번 따라 해보세요. 지금 당장은 별 거 아닌 것 같아도, 나중에 큰 사고 막아줍니다. 진심입니다.
'SW > Kubernetes, Docker' 카테고리의 다른 글
| Docker + React 실시간 반영 환경 설정법 (윈도우 WSL2 완벽 대응) (0) | 2025.09.15 |
|---|---|
| Docker로 Node.js 개발환경 구축하기: 실시간 반영, 로그 보존, 환경변수까지 완벽정리 (0) | 2025.09.14 |
| Docker Networking 제대로 이해하기: 컨테이너 간 통신과 호스트 연결 완전 정리 (0) | 2025.09.12 |
| Docker 컨테이너 간 네트워크 연결 실습 가이드 (초보자도 가능) (0) | 2025.09.11 |
| Docker로 Node.js와 MongoDB 연결하는 법 (초보자도 가능한 실습 가이드) (0) | 2025.09.10 |