Docker Compose로 MongoDB 연동 (Backend + DB)

Atmosphere·2025년 7월 14일

docker

목록 보기
3/5

🎯 목표

하나의 명령어로 Node.js + MongoDB 컨테이너를 동시에 실행할 수 있다

🧩 실습 세부내용

  1. 루트에 docker-compose.yml 파일 만들기:
version: '3'
services:
  backend:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - mongo
    environment:
      - MONGO_URL=mongodb://mongo:27017/test

  mongo:
    image: mongo:6
    ports:
      - "27017:27017"

참고로 yml 파일은 띄어쓰기가 중요한 것 같다.
이 docker-compose.yml을 보고 직접 따라쳤는데 띄어쓰기 문제 때문에
services.ports must be a mapping
이런 오류가 발생했었다.
GPT 가 알려준 코드 그대로 복붙해서 다시 docker-compose up하니 잘 실행된다.

  1. app.js 수정 (Mongo 연결 포함):
const express = require('express');
const mongoose = require('mongoose');
const app = express();
const PORT = 3000;

mongoose.connect(process.env.MONGO_URL)
  .then(() => console.log('MongoDB connected'))
  .catch(err => console.error('DB error:', err));

app.get('/', (req, res) => res.send('Hello with Mongo!'));
app.listen(PORT, () => console.log(`Server on ${PORT}`));
  1. npm install mongoose

  2. docker-compose up --build

  3. localhost:3000 접속 → 서버 정상 작동 확인

잘 모르고 했던 실수 하나

docker run으로 3000번 포트를 점유한 컨테이너를 실행 중에서
docker-compose up --build를 했더니
port is already allocated
라는 오류가 났었다.

docker-compose up으로 만든 컨테이너는
다른 컨테이너지만, 서버(호스트)의 동일한 포트(예: 3000번)를 공유하기 때문에 충돌이 나.

그렇다고 한다.

그리고 추가로

docker-compose는 여러 컨테이너를 하나의 그룹처럼 실행하고 연결하는 도구라서,
가능하면 실습할 땐 docker run은 잠깐 테스트용,
docker-compose로 전체를 구성하는 게 더 깔끔하고 관리도 쉬워.

이것도 알려주었다.

참고1

🔧 Dockerfile vs docker-compose.yml

📌 Dockerfile
하나의 이미지(예: Node.js 앱 이미지)를 만드는 “레시피”

보통 FROM, COPY, RUN, CMD 같은 명령이 들어감

📌 docker-compose.yml
여러 개의 컨테이너를 정의하고 한 번에 띄움

예를 들어 Node.js 서버, MongoDB, Nginx가 각각 컨테이너 하나씩 필요할 때

docker-compose는 여러개의 컨테이너를 한번에 정의한다.
컨테이너 한개 = 이미지 한개
컨테이너 한개에 여러개의 이미지 X

참고 2

한번 실습할때 컨테이너를 생성하고 끝난 후 중지하고 삭제하지 않으면 어느새 이렇게 컨테이너가 많아져있다.

특히 나는 docker run으로 컨테이너 실행 후 내 터미널에서 ctrl+c를 해서 종료했었는데, 사진을 보면 2일 지난 컨테이너도 여전히 살아있는걸 볼 수 있다. 쟤내들을 다 지우고 나니 그제서야 docker-compose up build가 제대로 실행됬다.

docker run에 -d 옵션을 붙이면
ex) docker run -d -p 3000:3000 node-test

백그라운드에서 실행되기 때문에,
Ctrl + C는 단순히 내 터미널에서 연결을 끊는 것일 뿐,
컨테이너는 백그라운드에서 계속 running 상태이다.

  1. docker run으로 실행한 컨테이너는 docker stop으로 꼭 중지, docker kill(rm도 가능)로 삭제해주자
  2. docker-compose up 으로 실행한 컨테이너는 docker-compose down으로 꼭 컨테이너를 말끔히 종료해주자

앞으로 docker-compose down을 습관처럼 써야겠다..

profile
작게, 빠르게, 지속가능하게

0개의 댓글