Docker Compose and Docker Swarm: A Complete Guide to Container Orchestration


Introduction

In today's containerized world, managing multiple containers efficiently is crucial for modern application deployment.
In this guide, we’ll explore both tools:

  • Docker Compose: Ideal for defining and managing multi-container applications in development.

  • Docker Swarm: Designed for scaling and orchestrating containers in production environments.

Whether you’re just getting started or looking to refine your skills, this guide is tailored to help you streamline your containerized workflows.


Part 1: Docker Compose - Simplifying Multi-Container Applications

What is Docker Compose?

Docker Compose is a tool for defining and running multi-container Docker applications using a YAML file. With Compose, you can:

  • Deploy multiple services with a single command.

  • Manage service dependencies automatically.

  • Scale services up or down seamlessly.


Getting Started with Docker Compose

Example Setup: The Voting App

Clone the example-voting-app repository to get started:

git clone https://github.com/dockersamples/example-voting-app.git  
cd example-voting-app

Here’s a sample docker-compose.yml file:

version: '3.8'  
services:  
  frontend:  
    image: nginx:latest  
    ports:  
      - "8080:80"  
    volumes:  
      - ./frontend:/usr/share/nginx/html  
    networks:  
      - app-network  

  backend:  
    build: ./backend  
    ports:  
      - "5000:5000"  
    depends_on:  
      - db  
    networks:  
      - app-network  

  db:  
    image: postgres:13  
    environment:  
      POSTGRES_USER: user  
      POSTGRES_PASSWORD: password  
    volumes:  
      - db-data:/var/lib/postgresql/data  
    networks:  
      - app-network  

networks:  
  app-network:  

volumes:  
  db-data:

Key Docker Compose Commands

# Start all services  
docker-compose up -d  

# Check running services  
docker-compose ps  

# View logs  
docker-compose logs -f  

# Stop all services  
docker-compose down  

# Scale a specific service  
docker-compose up -d --scale backend=4

Compose simplifies managing dependencies and streamlines local development workflows, making it an essential tool for any developer.


Here’s the refined version:


Part 2: Docker Swarm - Scaling and Orchestrating Containers

What is Docker Swarm?

Docker Swarm is a native clustering and orchestration tool built into the Docker Engine. It allows you to manage a group of Docker nodes as a single virtual system. Swarm is perfect for:

  • Scaling containers across multiple machines.

  • Ensuring high availability with replica management.

  • Performing rolling updates with zero downtime.


Setting Up a Docker Swarm Cluster

Steps to Initialize Swarm

  1. Initialize Docker Swarm on the Manager Node:
    This step sets up the first node as the manager.

     docker swarm init
    
  2. Join Worker Nodes:
    Use the worker join token provided by the manager node.

     docker swarm join --token <worker-token> <manager-ip>:<manager-port>
    
  3. Join Additional Manager Nodes:
    Use the manager join token to add redundancy.

     docker swarm join --token <manager-token> <manager-ip>:<manager-port>
    
  4. Verify the Setup:
    Check the status of the Swarm and the nodes.

     docker node ls
    
  5. Check Networks in the Swarm:

     docker network ls
    

Deploying Services in Docker Swarm

Steps to Deploy Services

  1. Deploy a Sample Service:
    Create a service with 3 replicas and expose it on port 8000.

     docker service create --name app1 --replicas 3 --publish 8000:80 kiran2361993/rollingupdate:v1
    
  2. Scale the Service Up or Down:
    Adjust the number of replicas for the service.

     # Scale up  
     docker service scale app1=6  
    
     # Scale down  
     docker service scale app1=1
    
  3. Deploy Service Only on Worker Nodes:
    Ensure the service runs exclusively on worker nodes.

     docker service create \  
       --name app1 \  
       --constraint node.role==worker \  
       --replicas 6 \  
       --publish 8000:80 \  
       kiran2361993/rollingupdate:v10
    

Steps to Manage Services and Nodes

  1. Check Service Tasks:

     docker service ps app1
    
  2. Put a Node in Maintenance Mode:
    This prevents the node from running new tasks.

     docker node update <NODE-ID> --availability drain
    
  3. Reactivate a Node:

     docker node update <NODE-ID> --availability active
    

Visualizing the Swarm Cluster

Use Swarm Visualizer to see your cluster visually.

docker run -it -d -p 8080:8080 --name swarm-visualizer \  
  -e HOST=<MANAGER-IP> \  
  -e PORT=2377 \  
  dockersamples/visualizer

Access the visualizer at: http://<MANAGER-IP>:8080.


Example: Web Application Deployment

  1. Deploy a Web Application:

     docker service create \  
       --name webapp \  
       --replicas 3 \  
       --publish 8000:80 \  
       nginx:latest
    
  2. Scale the Service:

     docker service scale webapp=6
    

Conclusion

Docker Swarm simplifies managing a cluster of containers across multiple nodes. With just a few commands, you can set up a cluster, deploy services, and scale your applications seamlessly. By leveraging its powerful features like rolling updates, constraints, and load balancing, Swarm ensures your applications are always highly available and optimized.

Happy clustering! 🐳