← Back to homedocker-compose

Docker Compose: Managing Multi-Container Applications

← All writing

Docker Compose is a powerful tool that simplifies the management of multi-container Docker applications. It allows developers to define and run multi-container applications using a YAML file, making it easier to deploy, scale, and maintain complex systems. This article explores the key aspects of Docker Compose, including its setup, essential commands, and best practices.

What is Docker Compose?

Docker Compose is a tool for defining and managing multi-container Docker applications. Instead of running multiple docker run commands for different services, Docker Compose allows you to define all services, networks, and volumes in a single docker-compose.yml file. This approach streamlines development, testing, and deployment.

Key Features:

  • Simplified Configuration: Uses a YAML file to define services, networks, and volumes.
  • Multi-Container Support: Manages multiple services in one configuration.
  • Service Dependencies: Allows services to depend on each other, ensuring proper startup order.
  • Scaling: Easily scales services up or down.
  • Environment Management: Supports environment variables for different configurations.

GitHub Repository

You can find all the code examples used in this guide in my GitHub repository:

🔗 GitHub Repo

Setting up Docker Compose for Multi-Service Applications

To get started with Docker Compose, follow these steps:

Step 1: Install Docker and Docker Compose

Ensure Docker is installed on your system. Docker Compose is included in Docker Desktop, but for Linux, you may need to install it separately:

sudo apt update && sudo apt install docker-compose -y

Step 2: Define a docker-compose.yml File

Create a docker-compose.yml file in your project directory and define the services. For example, a simple web application with a database:

version: '3.8'  
services:
web:
build: ./web
ports:
- "8080:80"
depends_on:
- db
db:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: app_db
volumes:
- db_data:/var/lib/mysql

volumes:
db_data:

Step 3: Define Web Service Files

Create a Dockerfile inside the web/ directory:

FROM nginx:alpine  
COPY index.html /usr/share/nginx/html/index.html

Also, create an index.html file inside the web/ directory:

<!DOCTYPE html>  
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Docker Compose Example</title>
</head>
<body>
<h1>Welcome to Docker Compose!</h1>
</body>
</html>

Step 4: Start the Application

Run the following command to start all services:

docker-compose up -d

The -d flag runs the containers in detached mode.

Step 5: Verify Running Containers

Check the status of the running containers:

docker-compose ps

Step 6: Stop and Remove Containers

To stop and remove containers, networks, and volumes:

docker-compose down

Docker Compose Commands

Here are some commonly used Docker Compose commands:

  • Start Services: docker-compose up -d
  • Stop Services: docker-compose down
  • View Running Containers: docker-compose ps
  • Restart Services: docker-compose restart
  • View Logs: docker-compose logs -f
  • Scale Services: docker-compose up --scale web=3 -d
  • Execute Commands in a Container: docker-compose exec web bash

Docker Compose Best Practices

To ensure efficiency and reliability when using Docker Compose, consider the following best practices:

1. Use .env Files for Configuration

Store environment variables in a .env file instead of hardcoding them in docker-compose.yml.

environment:  
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}

2. Keep Services Stateless

Persist data using Docker Volumes to prevent data loss when containers restart.

volumes:  
db_data:

3. Use Named Volumes and Networks

Defining custom networks and volumes makes services more resilient and portable.

networks:  
app_network:
volumes:
db_data:

4. Use Health Checks

Ensure services are ready before they start receiving traffic.

healthcheck:  
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
retries: 3

5. Optimize Image Usage

Use smaller, optimized images such as Alpine-based images (nginx:alpine) to reduce container size.

6. Define Restart Policies

Ensure containers restart automatically in case of failure.

restart: always

Conclusion

Docker Compose simplifies multi-container application management by providing a declarative way to define services, networks, and volumes. By following best practices, developers can build scalable and maintainable applications with ease. Whether you’re working on development, testing, or production environments, Docker Compose is a must-have tool for managing complex Docker applications.

🚀 Let’s Connect!

If you found this guide helpful, follow me for more DevOps and Cloud Engineering content:

🔗 GitHubgithub.com/Dhanika-Kumarasiri

🔗 Mediummedium.com/@dhanika-kumarasiri

Have questions? Drop them in the comments! Let’s automate AWS the smart way! 🚀

Originally published on Medium.

Read on Medium