🔧 DevOps

Docker Containerization Guide

Last updated: 2025-09-25 12:47:03

Docker Containerization

Docker revolutionizes application deployment by packaging applications and their dependencies into lightweight, portable containers.

Basic Docker Commands

# Pull an image from Docker Hub
docker pull nginx:latest

# Run a container
docker run -d -p 8080:80 --name my-nginx nginx

# List running containers
docker ps
docker ps -a  # All containers (including stopped)

# Stop and start containers
docker stop my-nginx
docker start my-nginx
docker restart my-nginx

# Remove containers and images
docker rm my-nginx
docker rmi nginx:latest

# View logs
docker logs my-nginx
docker logs -f my-nginx  # Follow logs

Creating Dockerfiles

# Dockerfile for Node.js application
FROM node:18-alpine

# Set working directory
WORKDIR /app

# Copy package files
COPY package*.json ./

# Install dependencies
RUN npm ci --only=production

# Copy application code
COPY . .

# Expose port
EXPOSE 3000

# Create non-root user
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001
USER nextjs

# Start application
CMD ["npm", "start"]

Docker Compose

# docker-compose.yml
version: '3.8'

services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DATABASE_URL=mysql://user:pass@db:3306/myapp
    depends_on:
      - db
    volumes:
      - ./uploads:/app/uploads

  db:
    image: mysql:8.0
    environment:
      - MYSQL_ROOT_PASSWORD=rootpass
      - MYSQL_DATABASE=myapp
      - MYSQL_USER=user
      - MYSQL_PASSWORD=pass
    volumes:
      - db_data:/var/lib/mysql
    ports:
      - "3306:3306"

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

volumes:
  db_data:

Docker Compose Commands

# Start all services
docker-compose up -d

# View logs
docker-compose logs -f
docker-compose logs web  # Specific service

# Scale services
docker-compose up -d --scale web=3

# Stop services
docker-compose down

# Rebuild and restart
docker-compose up -d --build

# Execute commands in container
docker-compose exec web bash
docker-compose exec db mysql -u root -p