Docker Node.js
How to run a Node.js application in Docker.
Node.js Dockerfile
# Stage 1: Build
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
# Stage 2: Production
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/server.js"]
docker-compose.yml
version: '3.8'
services:
api:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DB_HOST=database
volumes:
- ./src:/app/src
networks:
- app-net
database:
image: postgres:15
environment:
POSTGRES_DB: myapp
POSTGRES_PASSWORD: secret
volumes:
- db-data:/var/lib/postgresql/data
networks:
- app-net
networks:
app-net:
volumes:
db-data:
Use Case: Node.js App
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Everyday Use Case
Case: A developer needs to run a Node.js app.
# Build
docker build -t node-app .
# Run
docker run -d -p 3000:3000 node-app
# Development
docker run -d -p 3000:3000 -v $(pwd):/app node:18-alpine npm run dev
Best Practices
- Use alpine: For a smaller image
- Multi-stage build: For production
- Non-root user: For security
- Health check: For monitoring
Conclusion
Node.js in Docker is easy to set up. Use a multi-stage build for production and alpine for a minimal image.