A clean, end-to-end MERN stack setup using Docker and Docker Compose. This repository is designed for first-time Docker users who want a smooth full-stack workflow.
- Run a full MERN stack using Docker
- Understand images, containers, volumes, and networking
- Enable reproducible development environments
- Prepare for production-ready container workflows
- Frontend: React (Vite)
- Backend: Node.js + Express
- Database: MongoDB (containerized)
- DB GUI: Mongo Express
- Containerization: Docker + Docker Compose
mern-docker-app/
β
βββ client/ # React frontend
βββ server/ # Express backend
βββ docker-compose.yml # Multi-container orchestration
βββ .dockerignore
βββ README.md
- Docker installed
- Docker Compose available
- Git installed
Verify:
docker --version
docker compose versionFrom project root:
docker compose up -d --build| Service | URL |
|---|---|
| Frontend | http://localhost:5173 |
| Backend | http://localhost:5000 |
| Mongo Express | http://localhost:8081 |
docker compose downBrowser
β
Frontend Container (Vite)
β
Backend Container (Express)
β
MongoDB Container
β
Mongo Express (GUI)
All services communicate via Docker network.
- Image β blueprint
- Container β running instance
- Volume β persistent storage
- Network β container communication
- Compose β multi-service manager
βWorks on my machineβ issue due to environment differences.
Common causes:
- Node version mismatch
- Missing dependencies
- OS differences
- Library conflicts
Docker packages:
- application
- runtime
- dependencies
- configs
Result:
- portable
- consistent
- reproducible
- Read-only blueprint
- Contains app + runtime
- Built from Dockerfile
- Running instance of image
- Isolated environment
- Ephemeral by default
- Core runtime that manages containers
- Public registry for images
Essential commands:
docker run hello-world
docker ps
docker ps -a
docker stop <id>
docker rm <id>
docker imagesKey learning:
Docker can run software instantly without installing locally.
- Images are layered
- Layers enable caching
- Smaller images deploy faster
- Prefer specific tags (not
latest)
Example:
docker pull node:18-alpine- FROM
- WORKDIR
- COPY
- RUN
- CMD
- EXPOSE
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["node", "server.js"]Copy package.json first to leverage layer caching.
Containers are ephemeral.
Data inside container β lost on removal.
Use Docker volumes.
Example:
docker volume create mongo-data- Databases
- uploads
- persistent state
Inside containers:
localhostrefers to the container itself.
Use service name:
mongodb://mongo-db:27017
Use port mapping:
-p 5000:5000
Run multi-container apps with one command.
docker-compose.yml
docker compose up -d
docker compose down
docker compose ps
docker compose logsCompose runs:
- frontend
- backend
- database
together.
.dockerignore- specific image tags
- environment variables
- named volumes
latesttag- hardcoded secrets
- unnecessary large images
After Dockerfile change:
docker compose up -d --builddocker compose up
β
code
β
test
β
docker compose down
GitHub push
β
CI builds image
β
Server runs container
- containers are stateless
- database is managed (e.g., MongoDB Atlas)
- environment variables used
sudo lsof -i :<port>docker compose logs <service>docker compose up -d --buildAfter completing this setup, you can:
- dockerize Node/React apps
- manage multi-container systems
- debug container issues
- handle volumes and networking
- run MERN stack via Docker
β Entry-level Docker competency achieved
- Production React build + nginx
- MongoDB Atlas integration
- CI/CD pipelines
- Multi-stage Docker builds
- Kubernetes (advanced)
Built as a hands-on Docker learning project for MERN developers.
Consider starring the repo and sharing with fellow developers.
Happy Containerizing! π³