Back to Tutorials

Dockerizing Your API: Containerizing Node.js Applications

What is Docker?

Docker allows you to package your application and its dependencies into containers, ensuring consistent behavior across different environments.

Creating a Dockerfile

# Use Node.js official image
FROM node:18-alpine

# Set working directory
WORKDIR /app

# Copy package files
COPY package*.json ./

# Install dependencies
RUN npm install --production

# Copy application code
COPY . .

# Expose port
EXPOSE 3000

# Start application
CMD ["node", "server.js"]

Docker Commands

# Build Docker image
docker build -t my-api:latest .

# Run container
docker run -p 3000:3000 my-api:latest

# Run in detached mode
docker run -d -p 3000:3000 --name my-api my-api:latest

# View running containers
docker ps

# Stop container
docker stop my-api

# View logs
docker logs my-api

# Remove container
docker rm my-api

Docker Compose

# docker-compose.yml
version: '3.8'

services:
  api:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgresql://user:pass@db:5432/mydb
    depends_on:
      - db
  
  db:
    image: postgres:14
    environment:
      - POSTGRES_DB=mydb
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=pass
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

Running with Docker Compose

# Start all services
docker-compose up

# Start in background
docker-compose up -d

# Stop services
docker-compose down

# View logs
docker-compose logs -f

Best Practices

  • Use multi-stage builds for smaller images
  • Don't run as root user
  • Use .dockerignore to exclude unnecessary files
  • Keep images small with alpine variants
  • Use specific version tags, not 'latest'