Création d'applications multi-conteneurs évolutives avec Docker Compose

Docker Compose simplifie le développement d'applications multi-conteneurs évolutives en définissant des services, des réseaux et des volumes dans un seul fichier YAML, ce qui rationalise le déploiement et la gestion à travers les environnements.
Table of Contents
Création d'applications multi-conteneurs évolutives avec Docker Compose 2

Création d'applications multi-conteneurs avec Docker Compose

Alors que le développement logiciel adopte de plus en plus l'architecture microservices, la nécessité de gérer des applications complexes impliquant plusieurs services est devenue primordiale. Docker Compose s'impose comme un outil indispensable qui simplifie l'orchestration des applications multi-conteneurs. Cet article vise à explorer les fonctionnalités avancées de Docker Compose, en offrant un aperçu de ses capacités tout en fournissant des exemples pratiques pour illustrer son utilisation.

Understanding Docker Compose

Docker Compose est un outil conçu pour définir et gérer des applications Docker multi-conteneurs. Il permet aux développeurs de spécifier les services, les réseaux et les volumes dont leur application a besoin dans un seul fichier YAML, généralement nommé docker-compose.yml. Avec quelques commandes, les développeurs peuvent construire, démarrer, mettre à l'échelle et arrêter plusieurs conteneurs, facilitant un flux de travail optimisé.

Concepts de base

Before diving into Docker Compose, it’s essential to understand some core concepts:

  • Services: Un service est défini dans le docker-compose.yml fichier et représente un seul conteneur ou un groupe de conteneurs exécutant la même image.

  • Les réseaux: Docker Compose allows you to create custom networks for better communication between services. Each service can communicate over a private network, enhancing security and reducing complexity.

  • Volumes: Volumes are used to persist data generated by and used by Docker containers. Docker Compose makes it easy to define and manage volumes for your services.

Setting Up Docker Compose

To kick-start our exploration of Docker Compose, we’ll begin by setting up the environment. Ensure that you have Docker installed on your machine. Docker Compose is included with Docker Desktop; however, if you are using a Linux distribution, you may need to install it separately.

Installation

Sur Ubuntu, par exemple, vous pouvez installer Docker Compose à l'aide des commandes suivantes :

sudo apt-get mise à jour
sudo apt-get installation docker-compose

Once installed, you can verify the installation by checking the version:

docker-compose --version

Creating a Simple Application

Créons une application multi-conteneurs simple en utilisant Docker Compose. Pour notre exemple, nous allons construire une pile d'applications web qui se compose d'une API Flask, d'un cache Redis et d'une base de données PostgreSQL.

Project Structure

Tout d'abord, créez la structure de répertoires suivante :

myapp/
├── Dockerfile
├── app.py
├── requirements.txt
└── docker-compose.yml

Écriture du code de l'application

In requirements.txt, nous allons définir les dépendances requises par notre application Flask :

Flask==2.0.2
redis==4.0.2
psycopg2==2.9.1

In app.py, nous allons écrire une application Flask simple qui interagit avec Redis et PostgreSQL :

from flask import Flask
import redis
import psycopg2

app = Flask(__name__)

# Configure Redis
redis_client = redis.StrictRedis(host='redis', port=6379, decode_responses=True)

# Configure PostgreSQL
def get_db_connection():
    conn = psycopg2.connect(host='db', database='mydb', user='myuser', password='mypassword')
    return conn

@app.route('/')
def index():
    redis_client.incr('hits')
    return f'Hello World! This page has been viewed {redis_client.get("hits")} times.'

@app.route('/db')
def db():
    conn = get_db_connection()
    cur = conn.cursor()
    cur.execute('SELECT message FROM messages;')
    message = cur.fetchone()
    cur.close()
    conn.close()
    return message[0] if message else 'No messages found.'

if __name__ == '__main__':
    app.run(host='0.0.0.0')

Écrire le Dockerfile

Maintenant, nous allons créer un Dockerfile for our Flask application:

# Use the official Python image from the Docker Hub
FROM python:3.9-slim

# Set the working directory
WORKDIR /app

# Copy the requirements file and install dependencies
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

# Copy the application code
COPY app.py ./

# Expose the application port
EXPOSE 5000

# Command to run the application
CMD ["python", "app.py"]

Création de la configuration Docker Compose

Now, let’s define the services in the docker-compose.yml:

version: '3.8'

services:
  web:
    build: .
    ports:
      - "5000:5000"
    depends_on:
      - redis
      - db
    environment:
      REDIS_HOST: redis
      POSTGRES_HOST: db

  redis:
    image: redis:alpine

  db:
    image: postgres:13
    restart: always
    environment:
      POSTGRES_DB: mydb
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword
    volumes:
      - db_data:/var/lib/postgresql/data

volumes:
  db_data:

Explication de la configuration

In the docker-compose.yml fichier, nous avons défini trois services : web, Redis, and db.

  • web: This service builds from the Dockerfile located in the current directory. It exposes port 5000 to allow access to the Flask application. The dépend_de directive ensures that the Redis and db services are started before the web service.

  • Redis: Ce service utilise l'image officielle Redis de Docker Hub.

  • db: Ce service exécute une base de données PostgreSQL. Il utilise des variables d'environnement pour configurer la base de données, l'utilisateur et le mot de passe. Un volume (db_data) is defined to persist the database data.

Exécution de l'application

With everything set up, you can start your multi-container application by running:

docker-compose up

Cette commande construira les services et démarrera l'application. Une fois l'application en cours d'exécution, vous pouvez y accéder à http://localhost:5000. You should see the message indicating how many times the page has been viewed.

Scaling the Services

One of the powerful features of Docker Compose is the ability to scale services. For instance, to scale the web service to 3 instances, you can run the following command:

docker-compose up --scale web=3

Cette commande démarrera trois instances de la web service, allowing load balancing between them.

Configuration avancée

As your application grows in complexity, you may want to incorporate more advanced features of Docker Compose.

Custom Networks

Par défaut, Docker Compose crée un seul réseau pour votre application. Vous pouvez définir plusieurs réseaux dans votre docker-compose.yml file:

réseaux:
  frontend:
  backend:

You can assign services to specific networks:

services:
  web:
    réseaux:
      - frontend
  redis:
    réseaux:
      - backend
  db:
    réseaux:
      - backend

Contrôles de santé

Defining health checks is crucial for ensuring that your services are running correctly. You can add health checks using the vérification de l'état de santé propriété

services:
  web:
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:5000/"]
      interval: 30s
      timeout: 10s
      retries: 5

Environment Variables and Secrets

You can pass environment variables for configuration using the environnement clé

environnement:
  - FLASK_ENV=production

Pour les informations sensibles, Docker Compose prend en charge les secrets, qui peuvent être définis et utilisés de manière sécurisée au sein de vos services.

secrets:
  mot_de_passe_db:
    fichier: ./secrets/mot_de_passe_db.txt

services:
  db:
    environment:
      POSTGRES_PASSWORD_FILE: /run/secrets/mot_de_passe_db
    secrets:
      - mot_de_passe_db

Utilisation de volumes externes

Instead of defining volumes within docker-compose.yml, vous pouvez utiliser des volumes externes, qui sont gérés en dehors de votre application Compose :

volumes:
  db_data:
    external: true

Débogage et journalisation

Docker Compose s'intègre parfaitement aux logs Docker, vous permettant de consulter les logs de tous les services. Vous pouvez afficher les logs avec :

docker-compose journaux -f

Cette commande suit les journaux et affiche la sortie de tous les services, ce qui est inestimable pour le débogage.

Conclusion

Docker Compose est un outil puissant pour gérer les applications multi-conteneurs, offrant simplicité et flexibilité grâce à sa configuration en YAML. En permettant aux développeurs de définir les services, réseaux et volumes dans un seul fichier, Docker Compose simplifie et rationalise le processus de développement et de déploiement.

As applications become more complex, the advanced features discussed—such as custom networks, health checks, environment variables, and logging—become essential for maintaining robust and reliable applications. Whether you’re building microservices or simple web applications, understanding Docker Compose is a crucial skill in the modern development landscape.

En maîtrisant ces fonctionnalités avancées de Docker Compose, vous serez bien armé pour répondre aux exigences du déploiement et de la gestion efficace d'applications complexes. Bon développement !