⚠️ Traduction non officielle - Cette documentation est une traduction communautaire non officielle de Docker.

Connexion des services avec Docker Compose

Maintenant que vous avez conteneurisé l'application Golang, vous allez utiliser Docker Compose pour connecter vos services ensemble. Vous connecterez les services de l'application Golang, Prometheus et Grafana pour surveiller l'application Golang avec Prometheus et Grafana.

Création d'un fichier Docker Compose

Créez un nouveau fichier nommé compose.yml à la racine de votre application Golang. Le fichier Docker Compose contient des instructions pour exécuter plusieurs services et les connecter ensemble.

Voici un fichier Docker Compose pour un projet qui utilise Golang, Prometheus et Grafana. Vous trouverez également ce fichier dans le répertoire go-prometheus-monitoring.

services:
  api:
    container_name: go-api
    build:
      context: .
      dockerfile: Dockerfile
    image: go-api:latest
    ports:
      - 8000:8000
    networks:
      - go-network
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
      interval: 30s
      timeout: 10s
      retries: 5
    develop:
      watch:
        - path: .
          action: rebuild
      
  prometheus:
    container_name: prometheus
    image: prom/prometheus:v2.55.0
    volumes:
      - ./Docker/prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - 9090:9090
    networks:
      - go-network
  
  grafana:
    container_name: grafana
    image: grafana/grafana:11.3.0
    volumes:
      - ./Docker/grafana.yml:/etc/grafana/provisioning/datasources/datasource.yaml
      - grafana-data:/var/lib/grafana
    ports:
      - 3000:3000
    networks:
      - go-network
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=password

volumes:
  grafana-data:

networks:
  go-network:
    driver: bridge

Comprendre le fichier Docker Compose

Le fichier Docker Compose se compose de trois services :

  • Service d'application Golang: Ce service construit l'application Golang à l'aide du Dockerfile et l'exécute dans un conteneur. Il expose le port 8000 de l'application et se connecte au réseau go-network. Il définit également une vérification de santé pour surveiller la santé de l'application. Vous avez également utilisé healthcheck pour surveiller la santé de l'application. La vérification de santé s'exécute toutes les 30 secondes et réessaye 5 fois si la vérification de santé échoue. La vérification de santé utilise la commande curl pour vérifier le point de terminaison /health de l'application. En plus de la vérification de santé, vous avez également ajouté une section develop pour surveiller les modifications dans le code source de l'application et reconstruire l'application à l'aide de la fonctionnalité Docker Compose Watch.

  • Service Prometheus: Ce service exécute le serveur Prometheus dans un conteneur. Il utilise l'image officielle de Prometheus prom/prometheus:v2.55.0. Il expose le serveur Prometheus sur le port 9090 et se connecte au réseau go-network. Vous avez également monté le fichier prometheus.yml du répertoire Docker qui est présent à la racine de votre projet. Le fichier prometheus.yml contient la configuration de Prometheus pour récupérer les métriques de l'application Golang. C'est ainsi que vous connectez le serveur Prometheus à l'application Golang.

    global:
      scrape_interval: 10s
      evaluation_interval: 10s
    
    scrape_configs:
      - job_name: myapp
        static_configs:
          - targets: ["api:8000"]

    Dans le fichier prometheus.yml, vous avez défini une tâche nommée myapp pour récupérer les métriques de l'application Golang. Le champ targets spécifie la cible à partir de laquelle récupérer les métriques. Dans ce cas, la cible est l'application Golang s'exécutant sur le port 8000. api est le nom du service de l'application Golang dans le fichier Docker Compose. Le serveur Prometheus récupérera les métriques de l'application Golang toutes les 10 secondes.

  • Service Grafana: Ce service exécute le serveur Grafana dans un conteneur. Il utilise l'image officielle de Grafana grafana/grafana:11.3.0. Il expose le serveur Grafana sur le port 3000 et se connecte au réseau go-network. Vous avez également monté le fichier grafana.yml du répertoire Docker qui est présent à la racine de votre projet. Le fichier grafana.yml contient la configuration de Grafana pour ajouter la source de données Prometheus. C'est ainsi que vous connectez le serveur Grafana au serveur Prometheus. Dans les variables d'environnement, vous avez défini l'utilisateur et le mot de passe administrateur de Grafana, qui seront utilisés pour vous connecter au tableau de bord Grafana.

    apiVersion: 1
    datasources:
    - name: Prometheus (Main)
      type: prometheus
      url: http://prometheus:9090
      isDefault: true

    Dans le fichier grafana.yml, vous avez défini une source de données Prometheus nommée Prometheus (Main). Le champ type spécifie le type de la source de données, qui est prometheus. Le champ url spécifie l'URL du serveur Prometheus à partir duquel récupérer les métriques. Dans ce cas, l'URL est http://prometheus:9090. prometheus est le nom du service du serveur Prometheus dans le fichier Docker Compose. Le champ isDefault spécifie si la source de données est la source de données par défaut dans Grafana.

Outre les services, le fichier Docker Compose définit également un volume nommé grafana-data pour persister les données de Grafana et un réseau nommé go-network pour connecter les services ensemble. Vous avez créé un réseau personnalisé go-network pour connecter les services ensemble. Le champ driver: bridge spécifie le pilote de réseau à utiliser pour le réseau.

Construire et exécuter les services

Maintenant que vous avez le fichier Docker Compose, vous pouvez construire les services et les exécuter ensemble à l'aide de Docker Compose.

Pour construire et exécuter les services, exécutez la commande suivante dans le terminal :

$ docker compose up

La commande docker compose up construit les services définis dans le fichier Docker Compose et les exécute ensemble. Vous verrez une sortie similaire dans le terminal :

 ✔ Network go-prometheus-monitoring_go-network  Created                                                           0.0s 
 ✔ Container grafana                            Created                                                           0.3s 
 ✔ Container go-api                             Created                                                           0.2s 
 ✔ Container prometheus                         Created                                                           0.3s 
Attaching to go-api, grafana, prometheus
go-api      | [GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
go-api      | 
go-api      | [GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
go-api      |  - using env:     export GIN_MODE=release
go-api      |  - using code:    gin.SetMode(gin.ReleaseMode)
go-api      | 
go-api      | [GIN-debug] GET    /metrics                  --> main.PrometheusHandler.func1 (3 handlers)
go-api      | [GIN-debug] GET    /health                   --> main.main.func1 (4 handlers)
go-api      | [GIN-debug] GET    /v1/users                 --> main.main.func2 (4 handlers)
go-api      | [GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
go-api      | Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
go-api      | [GIN-debug] Listening and serving HTTP on :8000
prometheus  | ts=2025-03-15T05:57:06.676Z caller=main.go:627 level=info msg="No time or size retention was set so using the default time retention" duration=15d
prometheus  | ts=2025-03-15T05:57:06.678Z caller=main.go:671 level=info msg="Starting Prometheus Server" mode=server version="(version=2.55.0, branch=HEAD, revision=91d80252c3e528728b0f88d254dd720f6be07cb8)"
grafana     | logger=settings t=2025-03-15T05:57:06.865335506Z level=info msg="Config overridden from command line" arg="default.log.mode=console"
grafana     | logger=settings t=2025-03-15T05:57:06.865337131Z level=info msg="Config overridden from Environment variable" var="GF_PATHS_DATA=/var/lib/grafana"
grafana     | logger=ngalert.state.manager t=2025-03-15T05:57:07.088956839Z level=info msg="State
.
.
grafana     | logger=plugin.angulardetectorsprovider.dynamic t=2025-03-15T05:57:07.530317298Z level=info msg="Patterns update finished" duration=440.489125ms

Les services commenceront à s'exécuter et vous pourrez accéder à l'application Golang à l'adresse http://localhost:8000, à Prometheus à l'adresse http://localhost:9090/health et à Grafana à l'adresse http://localhost:3000. Vous pouvez également vérifier les conteneurs en cours d'exécution à l'aide de la commande docker ps.

$ docker ps

Résumé

Dans cette section, vous avez appris à connecter des services ensemble à l'aide de Docker Compose. Vous avez créé un fichier Docker Compose pour exécuter plusieurs services ensemble et les connecter à l'aide de réseaux. Vous avez également appris à construire et à exécuter les services à l'aide de Docker Compose.

Informations connexes :

Ensuite, vous apprendrez comment développer l'application Golang avec Docker Compose et la surveiller avec Prometheus et Grafana.

Prochaines étapes

Dans la section suivante, vous apprendrez à développer l'application Golang avec Docker. Vous apprendrez également à utiliser Docker Compose Watch pour reconstruire l'image chaque fois que vous apportez des modifications au code. Enfin, vous testerez l'application et visualiserez les métriques dans Grafana en utilisant Prometheus comme source de données.