Connecter des conteneurs avec Link

DockerBeginner
Pratiquer maintenant

Introduction

Docker est un outil puissant pour le déploiement d'applications, mais il peut sembler complexe au premier abord. Ce défi vous guidera dans la liaison de conteneurs Docker afin de créer une application multi-conteneurs. Nous commencerons par des exemples simples pour progresser graduellement vers une application plus complexe. Même si vous êtes novice avec Docker, vous trouverez ce guide facile à suivre. Nous explorerons comment faire communiquer les conteneurs entre eux, ce qui est un aspect fondamental pour construire des applications robustes avec Docker.

Créer une image avec un Dockerfile

Avant de pouvoir lier des conteneurs, nous devons disposer d'au moins une application conteneurisée. Dans cette étape, vous allez créer un Dockerfile pour votre image my-app. Ce Dockerfile définira l'environnement et l'application à exécuter au sein du conteneur.

Tâche

L'objectif de cette étape est de créer un Dockerfile pour votre image my-app.

Prérequis

  • Docker doit être installé sur votre machine.
  • Vous devez disposer d'une application my-app existante que vous souhaitez conteneuriser.

Exemple de résultat

  1. Créez les fichiers nécessaires pour le défi :

    Créez un nouveau fichier nommé Dockerfile dans le répertoire /home/labex/project/ avec le contenu suivant :

    • Utilisez python:3.7-slim comme image de base.
    • Définissez le répertoire de travail sur /app.
    • Copiez le contenu du répertoire actuel dans le conteneur à /app.
    • Installez les paquets requis.
    • Exposez le port 80 vers l'extérieur.
    • Définissez une variable d'environnement (bien que nous ne l'utilisions pas dans cet exemple, conservez l'instruction).
    • Exécutez app.py au démarrage du conteneur.

    Créez un fichier nommé app.py dans votre répertoire de projet /home/labex/project/ avec le contenu suivant :

    import os
    
    os.system("wssh --address='0.0.0.0' --port=80")
    

    Créez un fichier nommé requirements.txt dans votre répertoire de projet /home/labex/project/ avec le contenu suivant :

    webssh==1.6.2
    
    labex:project/ $ pwd
    /home/labex/project
    labex:project/ $ ll
    total 12K
    -rw-r--r-- 1 labex labex 59 Jan 24 15:21 app.py
    -rw-r--r-- 1 labex labex 163 Jan 24 15:19 Dockerfile
    -rw-r--r-- 1 labex labex 14 Jan 24 15:21 requirements.txt
    
  2. Utilisez la commande docker build pour construire l'image my-app.

    labex:project/ $ docker images | grep my-app
    my-app latest 266edf714faf 30 seconds ago 170MB
    
  3. Démarrez un nouveau conteneur en utilisant l'image my-app et notez le mappage des ports.

    labex:project/ $ docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    11f06f08d2d3 my-app "python app.py" 4 seconds ago Up 4 seconds 0.0.0.0:8080- hopeful_elgamal > 80/tcp
    
  4. Ouvrez un navigateur web et accédez à http://localhost:8080 pour vérifier que votre application fonctionne correctement.

    Application web s'exécutant dans le navigateur

Lier deux conteneurs Docker

Maintenant que nous avons une application conteneurisée, passons à la liaison des conteneurs. Dans cette étape, nous apprendrons à lier deux conteneurs Docker, leur permettant ainsi de communiquer entre eux. Ce processus est essentiel pour créer des applications multi-services avec Docker.

Tâche

Lier un conteneur de serveur web Apache avec un conteneur de base de données MySQL.

Prérequis

  • Vous aurez besoin de deux conteneurs Docker : un exécutant Apache et un autre exécutant MySQL.
  • Docker doit être installé sur votre machine.

Astuce

  • N'oubliez pas d'ouvrir un nouveau terminal pour démarrer cette étape afin d'éviter tout conflit avec votre conteneur précédent.

Exemple de résultat

Accéder à MySQL depuis le conteneur Apache :

  1. Lancez un conteneur Apache nommé my_apache basé sur l'image httpd, en mappant le port hôte 80 sur le port conteneur 80.

    labex:project/ $ docker ps | grep my_apache
    a91a93216e84 httpd "httpd-foreground" 52 seconds ago Up 47 seconds 0.0.0.0:80- my_apache > 80/tcp
    
  2. Lancez un conteneur MySQL nommé my_mysql, en définissant la variable d'environnement MYSQL_ROOT_PASSWORD sur password, en utilisant l'image mysql.

    labex:project/ $ docker ps | grep mysql
    0cb864cf97c6 mysql "docker-entrypoint.s…" 42 seconds ago Up 35 seconds 3306/tcp, 33060/tcp my_mysql
    
  3. Liez le conteneur Apache au conteneur MySQL. Note : Pour cette étape, aucune sortie de commande directe n'est attendue, mais le lien sera visible dans les variables d'environnement du conteneur. Vous pouvez inspecter le conteneur avec la commande docker inspect my_apache.

    labex:project/ $ docker ps | grep my_app
    859c201b7267 my-app "python app.py" 53 seconds ago Up 52 seconds 80/tcp my_app
    
  4. Utilisez la commande docker exec pour accéder à l'interface de ligne de commande MySQL depuis le conteneur my_app (vous devrez adapter la commande si vous avez effectué la liaison différemment).

    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MySQL connection id is 8
    Server version: 8.3.0 MySQL Community Server - GPL
    
    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    MySQL [(none)]>
    

Lier plusieurs conteneurs Docker et utiliser des variables d'environnement

En nous appuyant sur l'étape précédente, cette partie ajoute deux nouveaux concepts : un conteneur d'application qui se lie aux deux services, et le conteneur qui reçoit les paramètres de connexion via des variables d'environnement. À l'étape 2, vous avez seulement prouvé que les conteneurs liés peuvent se joindre. Dans cette étape, vous devez démarrer my_app2 avec les deux options --link et les variables d'environnement qui décrivent les hôtes MySQL et Apache.

Tâche

Lancez trois conteneurs : un exécutant Apache, un exécutant MySQL et un exécutant une application personnalisée. L'application personnalisée doit pouvoir accéder à la fois à MySQL et à Apache.

Prérequis

  • Vous aurez besoin de trois conteneurs Docker : Apache, MySQL et une application personnalisée.
  • Démarrez my_app2 avec les deux liens et ces variables d'environnement : DB_HOST=mysql, DB_USER=root, DB_PASSWORD=password et APACHE_HOST=apache.
  • Installez curl à l'intérieur de my_app2 avant de tester la connexion Apache, car l'image my-app ne l'inclut pas par défaut.
  • Docker doit être installé sur votre machine.

Exemple de résultat

  1. Lancez un conteneur Apache et un conteneur MySQL comme décrit à l'étape 2.

  2. Lancez un conteneur d'application personnalisée nommé my_app2 capable d'accéder à la fois à MySQL et à Apache.

    labex:project/ $ docker ps | grep app2
    8945b42659a6 my-app "python app.py" 15 seconds ago Up 15 seconds 80/tcp my_app2
    
  3. Entrez dans my_app2, installez curl et exécutez curl http://apache/ pour confirmer que le conteneur Apache lié est accessible.

    <html>
      <body>
        <h1>It works!</h1>
      </body>
    </html>
    

Résumé

Dans ce défi, vous avez appris à lier des conteneurs Docker entre eux pour créer des applications multi-conteneurs. Nous sommes passés d'un seul conteneur à des paires liées, pour finir par une configuration à trois conteneurs. Vous comprenez désormais comment tirer parti des liens entre conteneurs et de la commande docker exec pour permettre la communication entre différents services, ce qui vous permet de construire des applications plus complexes. Continuez à expérimenter et amusez-vous bien !

✨ Vérifier la solution et pratiquer✨ Vérifier la solution et pratiquer✨ Vérifier la solution et pratiquer