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 débutez avec Docker, vous trouverez ces étapes faciles à 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.

Résultat attendu

  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 en cours d'exécution 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

Lancez des conteneurs de service Apache et MySQL, puis démarrez un conteneur my_app lié aux deux services afin de pouvoir tester la connexion MySQL depuis l'intérieur de my_app.

Prérequis

  • Vous aurez besoin de deux conteneurs Docker : un exécutant Apache et un autre exécutant MySQL.
  • Démarrez un conteneur my_app supplémentaire lié aux conteneurs Apache et MySQL.
  • Installez le client MySQL à l'intérieur de my_app avant de tester la connexion à la base de données.
  • 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.

Résultat attendu

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

  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. Démarrez un conteneur my_app lié à la fois aux conteneurs MySQL et Apache. Note : Le lien est visible dans la configuration du conteneur. Vous pouvez l'inspecter 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 de 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 à l'intérieur de 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)]>
    

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 lié aux deux services, et le conteneur recevant les paramètres de connexion via des variables d'environnement. À l'étape 2, vous avez simplement prouvé que des 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.

Résultat attendu

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

  2. Lancez un conteneur d'application personnalisé 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 avec 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 permettra 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