SW/Kubernetes, Docker

Docker Compose로 MongoDB 환경 구성하는 방법 (완전 초보도 가능한 실전 예제)

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

Docker Compose로 MongoDB 세팅하기: 내 경험담을 곁들인 아주 쉬운 이야기

Docker로 MongoDB 돌려보려고 했는데, 명령어도 낯설고 뭔가 복잡해서 머리가 띵했던 적, 있지 않으세요? 저도 처음에 완전 그랬거든요. 뭔가 시도는 해봤는데... 컨테이너는 제대로 돌아가는 건지, 설정은 맞게 했는지 알 수가 없어서 한숨만 나오더라고요. 그래서 이 글에선 제가 직접 써보고 이해한 내용을 기반으로, Docker Compose로 MongoDB를 손쉽게 세팅하는 방법을 하나하나 얘기해볼게요. 최대한 쉽게, 실수 없이, 감정 담아서요!

 


 

왜 docker run보다 Docker Compose가 편할까?

 

왜 docker run보다 Docker Compose가 편할까?

처음엔 그냥 docker run으로 MongoDB 띄워봤죠. 처음에는 그럭저럭 괜찮아요. 근데 서비스가 하나 둘 늘어나니까, 이건 뭐 설정이 정신 없고, 뭔가 건드릴 때마다 다 뜯어고쳐야 하더라고요. Docker Compose는 그냥 한 장의 파일에 모든 게 다 담겨 있어서 진짜 깔끔하고 좋아요. "아, 이게 진짜 개발자 도구구나..." 싶었어요.

 

MongoDB를 Docker로 실행하면 이런 식이에요

docker run -d --rm --network goals-net -v data:/data/db \
  -e MONGO_INITDB_ROOT_USERNAME=max \
  -e MONGO_INITDB_ROOT_PASSWORD=secret \
  mongo

 

이건 딱 봐도 뭔가 많죠? 이게 다:

  • MongoDB를 백그라운드로 실행하고
  • 꺼지면 자동으로 컨테이너 지우고
  • goals-net이라는 네트워크에 붙이고
  • 볼륨을 만들어서 데이터 유지하고
  • 사용자 이름, 비밀번호까지 설정하는 거예요

 

자, 이제 이걸 좀 더 사람답게(?) 관리할 수 있는 Compose 파일로 옮겨볼 거예요.

 


 

docker-compose.yaml? 사실 되게 간단해요

 

docker-compose.yaml? 사실 되게 간단해요

1. MongoDB 이미지 지정하기

services:
  mongodb:
    image: 'mongo'

 

딱 봐도 심플하죠? 그냥 이 MongoDB 이미지를 쓰겠다는 뜻이에요.

🤓 혹시 나중에 직접 만든 이미지나 다른 Registry에서 가져올 게 있으면 그 경로만 바꿔주면 돼요.

 

2. 데이터 저장소 연결하기

    volumes:
      - data:/data/db

 

이건 진짜 필수예요. 안 그러면 MongoDB 데이터가 컨테이너 사라질 때마다 날아가요. 예전에 이거 안 해놨다가 날려먹고 좌절했던 적 있어요. 다시는 그런 일 없도록!

 

3. 환경변수로 접속 정보 넣기

    environment:
      MONGO_INITDB_ROOT_USERNAME: max
      MONGO_INITDB_ROOT_PASSWORD: secret

 

혹은 이렇게 써도 되고요:

    environment:
      - MONGO_INITDB_ROOT_USERNAME=max
      - MONGO_INITDB_ROOT_PASSWORD=secret

 

저는 첫 번째 방식이 눈에 더 잘 들어오더라고요. 익숙한 거 쓰시면 돼요.

 

4. 환경변수 파일로 따로 관리하기 (찝찝할 땐 이걸로!)

비밀번호를 .yaml에 그냥 쓰는 거 좀 꺼림칙할 수 있어요. 그럴 땐 .env 파일 만들어서 분리하면 깔끔하고 안전해요.

 

mongo.env

MONGO_INITDB_ROOT_USERNAME=max
MONGO_INITDB_ROOT_PASSWORD=secret

 

그리고 YAML에선 이렇게:

    env_file:
      - ./env/mongo.env

 

5. 네트워크는... 굳이 설정 안 해도 돼요

Compose는 기본적으로 모든 서비스들을 같은 네트워크에 자동으로 넣어줘요. 아무 설정 안 해도 이름만으로 서로 통신이 돼요. 이거 몰랐을 땐 막 network 설정 따로 해줘야 하는 줄 알고 엄청 고생했거든요. 😅

하지만 특정 네트워크에 꼭 넣고 싶을 땐 이렇게 하면 돼요:

    networks:
      - goals-net

networks:
  goals-net:
    external: true

 

이미 만들어진 네트워크에 붙이고 싶은 경우에 유용해요.

 

6. 볼륨 선언 꼭 해주세요!

volumes:
  data:

 

이거 없으면 Docker가 "data"라는 이름의 볼륨을 만들지 않아요. 그래서 MongoDB 데이터 저장 안 됩니다. 예전엔 이거 빼먹고 왜 안 되지 하면서 몇 시간 날린 기억이 나네요.

 


 

전체 설정 정리해서 보여드릴게요!

version: '3.8'

services:
  mongodb:
    image: 'mongo'
    volumes:
      - data:/data/db
    environment:
      MONGO_INITDB_ROOT_USERNAME: max
      MONGO_INITDB_ROOT_PASSWORD: secret
    # env_file:
    #   - ./env/mongo.env
    # networks:
    #   - goals-net

volumes:
  data:

# networks:
#   goals-net:
#     external: true

 


 

이제 실행해볼까요?

MongoDB 실행:

docker-compose up -d

 

끄고 정리하려면:

docker-compose down

 

진짜 이 두 줄이면 끝이에요. 깔끔하죠?

 


 

왜 이 구성이 진짜 좋은지 말해볼게요

 

왜 이 구성이 진짜 좋은지 말해볼게요

처음엔 Docker가 진입장벽 높아 보였는데, Compose를 알고 나니까 “어? 이거 생각보다 괜찮네?” 싶더라고요. 뭔가 제대로 된 환경을 하나의 파일로 딱 정리해놓고, 필요할 때 한 번에 실행할 수 있다는 게 진짜 매력 있어요.

혼자 공부할 때도 좋고, 동료랑 같이 프로젝트할 때도 훨씬 편해요. 나중에 배포할 때도 요긴하고요. 특히 같은 환경을 계속 반복해서 만들 수 있다는 건 너무 큰 장점이에요.

 


 

마지막으로! 실수 방지 꿀팁 ✨

다른 사람한테 이 Compose 파일 공유할 일이 있을 땐, .env 파일은 .gitignore에 꼭 넣어두세요. 비밀번호 같은 민감한 정보는 Git에 올라가면 안 되잖아요. 저도 한 번 깜빡하고 올렸다가 부랴부랴 지운 적 있어요...

반응형