Connecter des conteneurs avec Link

DockerBeginner
Pratiquer maintenant

Introduction

Docker est un outil puissant pour déployer des applications, mais il peut sembler complexe au début. Ce challenge vous guidera dans la liaison de conteneurs Docker afin de créer une application multi-conteneurs. Nous commencerons par des exemples simples, puis nous progresserons vers une application plus complexe. Même si vous débutez avec Docker, vous devriez pouvoir suivre facilement. Nous verrons comment faire communiquer les conteneurs entre eux, un aspect fondamental de la création d’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 dans le conteneur.

Tâches

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.

Indices

  • Définissez les éléments nécessaires à l’image avant de construire et de lancer le conteneur.

Exemple de résultat

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

    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 /app comme répertoire de travail.
    • Copiez le contenu du répertoire courant dans /app du conteneur.
    • Installez les paquets requis.
    • Exposez le port 80 vers l’extérieur.
    • Définissez une variable d’environnement, même si elle n’est pas utilisée dans cet exemple ; conservez cette 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 avec l’image my-app et notez la correspondance 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 exécutée dans le navigateur

Relier deux conteneurs Docker

Maintenant que nous disposons d’une application conteneurisée, passons à la liaison de conteneurs. Dans cette étape, vous apprendrez à relier deux conteneurs Docker afin qu’ils puissent communiquer entre eux. Ce processus est essentiel pour créer des applications composées de plusieurs services avec Docker.

Tâches

Lancez des conteneurs de services Apache et MySQL, puis démarrez un conteneur my_app relié aux deux services afin de tester la connexion MySQL depuis my_app.

Prérequis

  • Vous aurez besoin de deux conteneurs Docker : l’un exécutant Apache et l’autre exécutant MySQL.
  • Démarrez un conteneur my_app supplémentaire relié aux conteneurs Apache et MySQL.
  • Installez le client MySQL dans my_app avant de tester la connexion à la base de données.
  • Docker doit être installé sur votre machine.

Indices

  • Pensez à ouvrir un nouveau terminal pour commencer cette étape afin d’éviter tout conflit avec votre conteneur précédent.

Exemple de résultat

Accédez à MySQL depuis le conteneur my_app après l’avoir relié aux deux services :

  1. Lancez un conteneur Apache nommé my_apache basé sur l’image httpd, en associant le port 80 de l’hôte au port 80 du conteneur.

    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, définissez la variable d’environnement MYSQL_ROOT_PASSWORD sur password et utilisez 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. Démarrez un conteneur my_app relié aux conteneurs MySQL et Apache.
    Remarque : la liaison apparaît dans la configuration du conteneur. Vous pouvez la consulter avec docker inspect my_app.

    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 en ligne de commande MySQL depuis le conteneur my_app ; vous devrez adapter la commande si vous avez effectué la liaison différemment.

    Installez le client MySQL dans my_app, puis connectez-vous au service MySQL lié :

    labex:project/ $ docker exec -it my_app bash
    root@859c201b7267:/app## apt-get update && apt install -y default-mysql-client
    root@859c201b7267:/app## mysql -h mysql -uroot -ppassword
    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)]>
    

Relier plusieurs conteneurs Docker et utiliser des variables d’environnement

En vous appuyant sur l’étape précédente, cette partie introduit deux nouvelles notions : un conteneur d’application est relié aux deux services, et le conteneur reçoit les paramètres de connexion par l’intermédiaire de variables d’environnement. À l’étape 2, vous avez seulement vérifié que les conteneurs liés pouvaient 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âches

Lancez trois conteneurs : l’un exécutant Apache, l’un exécutant MySQL et l’un exécutant une application personnalisée. L’application personnalisée doit pouvoir accéder à 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 liaisons et les variables d’environnement suivantes : DB_HOST=mysql, DB_USER=root, DB_PASSWORD=password et APACHE_HOST=apache.
  • Installez curl dans 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.

Indices

  • Réutilisez les conteneurs de services de l’étape 2 et inspectez le nouveau conteneur d’application si vous devez confirmer ses liaisons ou son environnement.

Exemple de résultat

  1. Lancez un conteneur Apache et un conteneur MySQL comme indiqué à l’étape 2.

  2. Lancez un conteneur d’application personnalisée nommé my_app2, capable d’accéder à 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, puis 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 challenge, vous avez appris à relier des conteneurs Docker afin de créer des applications multi-conteneurs. Nous sommes passés d’un conteneur unique à des paires de conteneurs liés, puis à une configuration composée de trois conteneurs. Vous comprenez maintenant comment utiliser les liaisons entre conteneurs et la commande docker exec pour permettre la communication entre différents services et créer des applications plus complexes. Continuez à expérimenter et amusez-vous !

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