하나의 명령어로 Node.js + MongoDB 컨테이너를 동시에 실행할 수 있다
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하니 잘 실행된다.
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}`));
npm install mongoose
docker-compose up --build
localhost:3000 접속 → 서버 정상 작동 확인
docker run으로 3000번 포트를 점유한 컨테이너를 실행 중에서
docker-compose up --build를 했더니
port is already allocated
라는 오류가 났었다.
docker-compose up으로 만든 컨테이너는
다른 컨테이너지만, 서버(호스트)의 동일한 포트(예: 3000번)를 공유하기 때문에 충돌이 나.
그렇다고 한다.
그리고 추가로
docker-compose는 여러 컨테이너를 하나의 그룹처럼 실행하고 연결하는 도구라서,
가능하면 실습할 땐 docker run은 잠깐 테스트용,
docker-compose로 전체를 구성하는 게 더 깔끔하고 관리도 쉬워.
이것도 알려주었다.
🔧 Dockerfile vs docker-compose.yml
📌 Dockerfile
하나의 이미지(예: Node.js 앱 이미지)를 만드는 “레시피”
보통 FROM, COPY, RUN, CMD 같은 명령이 들어감
📌 docker-compose.yml
여러 개의 컨테이너를 정의하고 한 번에 띄움
예를 들어 Node.js 서버, MongoDB, Nginx가 각각 컨테이너 하나씩 필요할 때
docker-compose는 여러개의 컨테이너를 한번에 정의한다.
컨테이너 한개 = 이미지 한개
컨테이너 한개에 여러개의 이미지 X

한번 실습할때 컨테이너를 생성하고 끝난 후 중지하고 삭제하지 않으면 어느새 이렇게 컨테이너가 많아져있다.
특히 나는 docker run으로 컨테이너 실행 후 내 터미널에서 ctrl+c를 해서 종료했었는데, 사진을 보면 2일 지난 컨테이너도 여전히 살아있는걸 볼 수 있다. 쟤내들을 다 지우고 나니 그제서야 docker-compose up build가 제대로 실행됬다.
docker run에 -d 옵션을 붙이면
ex) docker run -d -p 3000:3000 node-test
백그라운드에서 실행되기 때문에,
Ctrl + C는 단순히 내 터미널에서 연결을 끊는 것일 뿐,
컨테이너는 백그라운드에서 계속 running 상태이다.
앞으로 docker-compose down을 습관처럼 써야겠다..