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-appexistante que vous souhaitez conteneuriser.
Résultat attendu
Créez les fichiers nécessaires pour le défi :
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 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
80vers 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.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 en utilisant l'image
my-appet 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/tcpOuvrez un navigateur web et accédez à
http://localhost:8080pour vérifier que votre application fonctionne correctement.
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_appsupplémentaire lié aux conteneurs Apache et MySQL. - Installez le client MySQL à l'intérieur de
my_appavant 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 :
Lancez un conteneur Apache nommé
my_apachebasé sur l'imagehttpd, en mappant le port hôte80sur le port conteneur80.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, en définissant la variable d'environnementMYSQL_ROOT_PASSWORDsurpassword, en utilisant 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_applié à la fois aux conteneurs MySQL et Apache. Note : Le lien est visible dans la configuration du conteneur. Vous pouvez l'inspecter 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 de 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 à 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_app2avec les deux liens et ces variables d'environnement :DB_HOST=mysql,DB_USER=root,DB_PASSWORD=passwordetAPACHE_HOST=apache. - Installez
curlà l'intérieur demy_app2avant de tester la connexion Apache, car l'imagemy-appne l'inclut pas par défaut. - Docker doit être installé sur votre machine.
Résultat attendu
Lancez un conteneur Apache et un conteneur MySQL comme décrit à l'étape 2.
Lancez un conteneur d'application personnalisé nommé
my_app2capable 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_app2Entrez dans
my_app2, installezcurlet 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 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 !



