
프론트엔드·백엔드·DB를 하나의 개발·운영 환경으로 통합하는 것이 도커의 강점이다. 이 글은 MongoDB + Node.js API + React SPA를 컨테이너 기반으로 구성하는 전체 흐름을 실무 기준으로 정리한다. “컨테이너 단위로 서비스가 분리되고 네트워크로 연결된다”는 관점이 핵심이다.
도커 기반 풀스택 구조는 크게 세 레이어로 나뉜다.
컨테이너들은 네트워크로 연결되고, 데이터는 볼륨으로 유지하며, 코드 변경은 개발 환경에서 바인드 마운트로 반영한다.
데이터 영속화가 우선이다.
docker volume create mongo-data
docker run -d \
--name db \
--network backend \
-v mongo-data:/data/db \
-p 27017:27017 \
mongo:6
포인트:
backend 네트워크로 다른 서비스와 연결mongo-data 볼륨으로 컨테이너 재생성과 무관하게 데이터 유지mongodb://db:27017 주소로 접근FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
docker build -t api-server .
docker run -d \
--name api \
--network backend \
-e MONGO_URL=mongodb://db:27017 \
-p 3000:3000 \
api-server
구조적 의미:
React는 개발 환경(dev server) 과 운영 환경(static build) 이 완전히 다르다.
docker run -d \
--name frontend \
--network backend \
-p 5173:5173 \
-v $(pwd):/app \
node:18-alpine \
sh -c "cd /app && npm install && npm run dev"
특징:
FROM node:18-alpine AS build
WORKDIR /app
COPY . .
RUN npm install && npm run build
FROM nginx:stable-alpine
COPY --from=build /app/dist /usr/share/nginx/html
EXPOSE 80
실행:
docker build -t frontend-prod .
docker run -d -p 80:80 --name frontend frontend-prod
의미:
전체 컨테이너는 동일 네트워크에 있어야 한다.
docker network create backend
이후 모든 컨테이너 실행 시 --network backend 지정.
Node → MongoDB
mongodb://db:27017
React → Node API
fetch("http://api:3000/todos")
DNS 기반 이름 해석이므로 IP 변경과 무관하게 안정적으로 연결된다.
docker network create backend
docker volume create mongo-data
docker run -d --name db \
--network backend \
-v mongo-data:/data/db \
mongo:6
docker run -d --name api \
--network backend \
-e MONGO_URL=mongodb://db:27017 \
-p 3000:3000 \
api-server
docker run -d --name frontend \
--network backend \
-p 80:80 \
frontend-prod
Compose는 D7에서 별도로 정리한다.