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-appexistante 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
Créez les fichiers nécessaires pour le challenge :
Créez un nouveau fichier nommé
Dockerfiledans le répertoire/home/labex/project/avec le contenu suivant :- Utilisez
python:3.7-slimcomme image de base. - Définissez
/appcomme répertoire de travail. - Copiez le contenu du répertoire courant dans
/appdu conteneur. - Installez les paquets requis.
- Exposez le port
80vers 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.pyau démarrage du conteneur.
Créez un fichier nommé
app.pydans 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.txtdans votre répertoire de projet/home/labex/project/avec le contenu suivant :webssh==1.6.2labex: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- Utilisez
Utilisez la commande
docker buildpour construire l’imagemy-app.labex:project/ $ docker images | grep my-app my-app latest 266edf714faf 30 seconds ago 170MBDémarrez un nouveau conteneur avec l’image
my-appet 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/tcpOuvrez un navigateur Web et accédez à
http://localhost:8080pour vérifier que votre application fonctionne correctement.
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_appsupplémentaire relié aux conteneurs Apache et MySQL. - Installez le client MySQL dans
my_appavant 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 :
Lancez un conteneur Apache nommé
my_apachebasé sur l’imagehttpd, en associant le port80de l’hôte au port80du 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/tcpLancez un conteneur MySQL nommé
my_mysql, définissez la variable d’environnementMYSQL_ROOT_PASSWORDsurpasswordet utilisez l’imagemysql.labex:project/ $ docker ps | grep mysql 0cb864cf97c6 mysql "docker-entrypoint.s…" 42 seconds ago Up 35 seconds 3306/tcp, 33060/tcp my_mysqlDémarrez un conteneur
my_apprelié aux conteneurs MySQL et Apache.
Remarque : la liaison apparaît dans la configuration du conteneur. Vous pouvez la consulter avecdocker 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_appUtilisez la commande
docker execpour accéder à l’interface en ligne de commande MySQL depuis le conteneurmy_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_app2avec les deux liaisons et les variables d’environnement suivantes :DB_HOST=mysql,DB_USER=root,DB_PASSWORD=passwordetAPACHE_HOST=apache. - Installez
curldansmy_app2avant de tester la connexion à Apache, car l’imagemy-appne 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
Lancez un conteneur Apache et un conteneur MySQL comme indiqué à l’étape 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_app2Entrez dans
my_app2, installezcurl, puis exécutezcurl 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 !



