Skillversitas

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

  1. Use alpine: For a smaller image
  2. Multi-stage build: For production
  3. Non-root user: For security
  4. 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.