Container Orchestration

    Docker Compose, Stack & Engine

    Master professional-grade container orchestration by combining Docker's powerful toolset with RamNode's robust VPS hosting. Learn Docker Engine, Compose, and Stack for reliable, scalable containerized applications.

    Ubuntu 22.04/24.04
    Docker Compose & Stack
    ⏱️ 45-60 minutes

    Prerequisites

    Before starting, ensure you have:

    Server Requirements

    • • RamNode VPS (2GB+ RAM recommended)
    • • Ubuntu 22.04/24.04 or Debian 11
    • • SSD storage for optimal performance
    • • Root access to server

    Knowledge Requirements

    • • Docker fundamentals
    • • YAML syntax knowledge
    • • Basic Linux administration
    • • Container networking concepts
    2

    Why Choose RamNode for Docker Deployments?

    RamNode has built a solid reputation in the VPS hosting space, offering several advantages for Docker deployments:

    ⚡ High-Performance SSD Storage

    Significantly improves container startup times and I/O operations, crucial for multi-container applications.

    🔒 Reliable Network Infrastructure

    Excellent uptime records ensure your containerized applications remain accessible to users.

    📈 Flexible Resource Allocation

    Scale resources as your containerized applications grow, perfect for both development and production workloads.

    💰 Competitive Pricing

    Makes professional-grade container orchestration accessible for projects of all sizes.

    3

    Initial VPS Configuration

    Start by selecting an appropriate RamNode VPS plan:

    Minimum 2GB RAM for basic multi-container setups

    4GB+ RAM for production workloads or resource-intensive applications

    SSD storage for optimal container performance

    Once your VPS is provisioned, connect and update your system:

    System Update
    sudo apt update && sudo apt upgrade -y sudo apt install curl wget gnupg lsb-release

    💡 Tip: Choose Ubuntu 22.04 LTS or Debian 11 for the best Docker compatibility and long-term support.

    4

    Installing Docker Engine

    Docker Engine is the core runtime that manages your containers. Install it using Docker's official repository:

    Add Docker's Official GPG Key
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    Set Up Docker Repository
    echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    Install Docker Engine
    sudo apt update sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    Add User to Docker Group
    sudo usermod -aG docker $USER

    Log out and back in for the group changes to take effect, then verify your installation:

    Verify Installation
    docker --version docker run hello-world

    ✅ Docker Engine is now installed with the latest Compose plugin for orchestration!

    5

    Docker Compose: Multi-Container Applications

    Docker Compose simplifies the management of multi-container applications by allowing you to define your entire application stack in a single YAML file.

    Basic Compose Setup

    Create a project directory and compose file:

    Create Project Directory
    mkdir my-app && cd my-app nano docker-compose.yml

    Here's a practical example combining a web application with a database:

    docker-compose.yml - Basic Setup
    version: '3.8'
    
    services:
      web:
        image: nginx:alpine
        ports:
          - "80:80"
        volumes:
          - ./html:/usr/share/nginx/html
        depends_on:
          - db
        networks:
          - app-network
    
      db:
        image: postgres:13
        environment:
          POSTGRES_DB: myapp
          POSTGRES_USER: appuser
          POSTGRES_PASSWORD: securepassword
        volumes:
          - postgres_data:/var/lib/postgresql/data
        networks:
          - app-network
    
      redis:
        image: redis:alpine
        networks:
          - app-network
    
    volumes:
      postgres_data:
    
    networks:
      app-network:
        driver: bridge
    6

    Managing Your Application Stack

    Use these essential Docker Compose commands to manage your application stack:

    Essential Compose Commands
    # Start all services
    docker compose up -d
    
    # View running services
    docker compose ps
    
    # View logs
    docker compose logs -f web
    
    # Scale a service
    docker compose up -d --scale web=3
    
    # Stop and remove all services
    docker compose down
    
    # Update and restart services
    docker compose pull && docker compose up -d

    📝 Note: Use docker compose (with space) for the modern plugin version, not the legacy docker-compose command.

    7

    Production-Ready Compose Configuration

    For production deployments on your RamNode VPS, enhance your configuration with health checks, resource limits, and proper logging:

    docker-compose.yml - Production Ready
    version: '3.8'
    
    services:
      web:
        image: nginx:alpine
        ports:
          - "80:80"
          - "443:443"
        volumes:
          - ./html:/usr/share/nginx/html
          - ./nginx.conf:/etc/nginx/nginx.conf:ro
          - ./ssl:/etc/ssl/certs
        restart: unless-stopped
        deploy:
          resources:
            limits:
              memory: 512M
            reservations:
              memory: 256M
        logging:
          driver: "json-file"
          options:
            max-size: "10m"
            max-file: "3"
        healthcheck:
          test: ["CMD", "curl", "-f", "http://localhost"]
          interval: 30s
          timeout: 10s
          retries: 3
    
      app:
        build: .
        environment:
          - NODE_ENV=production
          - DATABASE_URL=postgresql://appuser:securepassword@db:5432/myapp
        restart: unless-stopped
        depends_on:
          db:
            condition: service_healthy
        deploy:
          replicas: 2
          resources:
            limits:
              memory: 1G
              cpus: '0.5'
    
      db:
        image: postgres:13
        environment:
          POSTGRES_DB: myapp
          POSTGRES_USER: appuser
          POSTGRES_PASSWORD_FILE: /run/secrets/db_password
        volumes:
          - postgres_data:/var/lib/postgresql/data
        restart: unless-stopped
        secrets:
          - db_password
        healthcheck:
          test: ["CMD-SHELL", "pg_isready -U appuser -d myapp"]
          interval: 30s
          timeout: 5s
          retries: 3
    
    secrets:
      db_password:
        file: ./secrets/db_password.txt
    
    volumes:
      postgres_data:
    8

    Docker Stack: Swarm Mode for High Availability

    Docker Stack provides orchestration capabilities for multi-node deployments, perfect for scaling beyond a single VPS.

    What is Docker Stack?

    Docker Stack is a higher-level abstraction that runs on Docker Swarm mode, providing features like rolling updates, service discovery, load balancing, and declarative service management across multiple nodes.

    9

    Initialize Docker Swarm

    Transform your RamNode VPS into a swarm manager:

    Initialize Swarm Mode
    # Initialize swarm mode
    docker swarm init --advertise-addr YOUR_VPS_IP
    
    # View swarm status
    docker node ls

    💡 Tip: Replace YOUR_VPS_IP with your actual RamNode VPS IP address. This command will output a token to join worker nodes if you plan to add more VPS instances later.

    10

    Deploying with Docker Stack

    Convert your Compose file to work with Docker Stack by adding deploy configurations:

    docker-compose.yml - Stack Configuration
    version: '3.8'
    
    services:
      web:
        image: nginx:alpine
        ports:
          - target: 80
            published: 80
            mode: ingress
        volumes:
          - ./html:/usr/share/nginx/html
        deploy:
          replicas: 3
          restart_policy:
            condition: on-failure
            delay: 5s
            max_attempts: 3
          update_config:
            parallelism: 1
            delay: 10s
            failure_action: rollback
          placement:
            constraints:
              - node.role == worker
    
      app:
        image: myapp:latest
        deploy:
          replicas: 5
          restart_policy:
            condition: on-failure
          resources:
            limits:
              memory: 512M
            reservations:
              memory: 256M
          update_config:
            parallelism: 2
            delay: 10s
    
    networks:
      default:
        driver: overlay
        attachable: true

    Deploy and manage your stack:

    Stack Management Commands
    # Deploy the stack
    docker stack deploy -c docker-compose.yml myapp
    
    # List running stacks
    docker stack ls
    
    # View stack services
    docker stack services myapp
    
    # Remove the stack
    docker stack rm myapp
    11

    Best Practices & Monitoring

    Monitor your containerized applications to ensure optimal performance on your VPS:

    Resource Monitoring

    System Monitoring Commands
    # Monitor container resource usage
    docker stats
    
    # View system resource usage
    htop
    df -h
    free -m
    
    # Clean up unused resources
    docker system prune -a
    docker volume prune

    Performance Tuning

    Optimize Docker performance on your RamNode VPS:

    Docker Daemon Configuration
    sudo nano /etc/docker/daemon.json
    /etc/docker/daemon.json
    {
      "storage-driver": "overlay2",
      "log-driver": "json-file",
      "log-opts": {
        "max-size": "10m",
        "max-file": "3"
      },
      "live-restore": true,
      "userland-proxy": false,
      "experimental": false
    }
    12

    Security Best Practices

    Implement security best practices for your Docker deployment:

    User Security

    Create Dedicated Docker User
    # Create a dedicated docker user
    sudo useradd -r -s /bin/false dockeruser
    
    # Run containers with non-root users
    # In your Dockerfile:
    USER dockeruser

    Firewall Configuration

    Configure UFW Firewall
    sudo ufw enable
    sudo ufw allow ssh
    sudo ufw allow 80
    sudo ufw allow 443
    sudo ufw deny 2376  # Secure Docker daemon socket

    Backup Strategy

    Backup Commands
    # Backup volumes
    docker run --rm -v myapp_postgres_data:/data -v $(pwd):/backup alpine tar czf /backup/postgres_backup.tar.gz -C /data .
    
    # Backup entire compose project
    tar czf myapp_backup.tar.gz docker-compose.yml .env secrets/ volumes/
    13

    Troubleshooting Common Issues

    Debug and resolve common Docker deployment issues:

    🎉 Congratulations!

    You've mastered Docker Engine, Compose, and Stack on RamNode! Your containerized applications now have professional-grade orchestration, monitoring, and high availability capabilities.