introduction
Docker est un excellent outil pour automatiser le déploiement d'applications Linux dans des conteneurs logiciels, mais pour vraiment tirer pleinement parti de son potentiel, il est préférable que chaque composant de votre application s'exécute dans son propre conteneur. Orchestrer tous les conteneurs pour qu'ils démarrent et s'arrêtent ensemble (sans parler de parler) pour les applications complexes comportant de nombreux composants peut rapidement devenir difficile à manier.
La communauté Docker a proposé une solution populaire appeléeFig, qui vous permettait d'utiliser un seul fichier YAML pour orchestrer tous vos conteneurs et configurations Docker. Cela est devenu si populaire que l'équipe Docker a décidé de créer desDocker Compose basés sur la source Fig, qui est maintenant obsolète. Docker Compose permet aux utilisateurs d'orchestrer plus facilement les processus des conteneurs Docker, notamment le démarrage, l'arrêt et la configuration des liaisons et des volumes intra-conteneur.
Dans ce didacticiel, vous allez installer la dernière version de Docker Compose pour vous aider à gérer des applications multi-conteneurs, et vous explorerez les commandes de base du logiciel.
Concepts de docker et docker
Pour utiliser Docker Compose, vous devez combiner plusieurs concepts Docker. Avant de commencer, prenons une minute pour passer en revue les différents concepts en question. Si vous connaissez déjà les concepts de Docker tels que les volumes, les liens et la redirection de port, vous pouvez aller de l'avant et passer à la section suivante.
Images Docker
Chaque conteneur Docker est une instance locale d'une image Docker. Vous pouvez considérer une image Docker comme une installation complète de Linux. Généralement, une installation minimale ne contient que le strict minimum de packages nécessaires à l’exécution de l’image. Ces images utilisent le noyau du système hôte, mais comme elles s’exécutent dans un conteneur Docker et ne voient que leur propre système de fichiers, il est parfaitement possible d’exécuter une distribution telle que CentOS sur un hôte Ubuntu (ou inversement).
La plupart des images Docker sont distribuées via leDocker Hub, qui est maintenu par l'équipe Docker. La plupart des projets Open Source populaires ont une image correspondante téléchargée dans le registre Docker, que vous pouvez utiliser pour déployer le logiciel. Dans la mesure du possible, il est préférable de saisir des images «officielles», car elles sont garanties par l’équipe Docker de suivre les meilleures pratiques de Docker.
Communication entre les images Docker
Les conteneurs Docker sont isolés de la machine hôte, ce qui signifie que par défaut, la machine hôte n'a pas accès au système de fichiers à l'intérieur du conteneur Docker, ni aucun moyen de communiquer avec lui via le réseau. Cela peut rendre difficile la configuration et l'utilisation de l'image s'exécutant dans un conteneur Docker.
Docker dispose de trois méthodes principales pour résoudre ce problème. La première et la plus courante consiste à demander à Docker de spécifier les variables d'environnement qui seront définies dans le conteneur Docker. Le code exécuté dans le conteneur Docker vérifie ensuite les valeurs de ces variables d'environnement au démarrage et les utilise pour se configurer correctement.
Une autre méthode couramment utilisée est unDocker data volume. Les volumes Docker sont disponibles en deux versions: interne et partagée.
La spécification d'un volume interne signifie simplement que, pour un dossier que vous spécifiez pour un conteneur Docker particulier, les données seront conservées lors de la suppression du conteneur. Par exemple, si vous souhaitez vous assurer que vos fichiers journaux persistent, vous pouvez spécifier un volume/var/log
interne.
Un volume partagé mappe un dossier d'un conteneur Docker sur un dossier de la machine hôte. Cela vous permet de facilementshare files entre le conteneur Docker et la machine hôte.
Le troisième moyen de communiquer avec un conteneur Docker est via le réseau. Docker permet la communication entre différents conteneurs Docker vialinks
, ainsi que la redirection de port, vous permettant de transférer les ports de l'intérieur du conteneur Docker vers les ports du serveur hôte. Par exemple, vous pouvez créer un lien pour permettre à vos conteneurs WordPress et MariaDB Docker de se parler et utiliser le transfert de port pour exposer WordPress au monde extérieur afin que les utilisateurs puissent s'y connecter.
Conditions préalables
Pour suivre cet article, vous aurez besoin des éléments suivants:
-
Serveur CentOS 7, configuré avec un utilisateur non root avec des privilèges sudo (voirInitial Server Setup on CentOS 7 pour plus de détails)
-
Docker installé avec les instructions des étapes 1 et 2 deHow To Install and Use Docker on CentOS 7
Une fois que ceux-ci sont en place, vous serez prêt à suivre.
[[step-1 -—- Installing-docker-compose]] == Étape 1 - Installation de Docker Compose
Pour obtenir la dernière version, prenez la tête desDocker docs et installez Docker Compose à partir du binaire du référentiel GitHub de Docker.
Vérifiez lescurrent release et si nécessaire, mettez-les à jour dans la commande ci-dessous:
sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Ensuite, définissez les autorisations pour rendre le binaire exécutable:
sudo chmod +x /usr/local/bin/docker-compose
Ensuite, vérifiez que l'installation a réussi en vérifiant la version:
docker-compose --version
Ceci imprimera la version que vous avez installée:
Outputdocker-compose version 1.23.2, build 1110ad01
Maintenant que Docker Compose est installé, vous êtes prêt à exécuter un exemple «Hello World».
[[step-2 -—- running-a-container-with-docker-compose]] == Étape 2 - Exécution d'un conteneur avec Docker Compose
Le registre public de Docker, Docker Hub, comprend une image simple «Hello World» à des fins de démonstration et de test. Il illustre la configuration minimale requise pour exécuter un conteneur à l'aide de Docker Compose: un fichier YAML qui appelle une seule image.
Tout d’abord, créez un répertoire pour notre fichier YAML:
mkdir hello-world
Puis changez dans le répertoire:
cd hello-world
Créez maintenant le fichier YAML en utilisant votre éditeur de texte préféré. Ce tutoriel utilisera Vi:
vi docker-compose.yml
Entrez en mode insertion, en appuyant suri
, puis mettez le contenu suivant dans le fichier:
docker-compose.yml
my-test:
image: hello-world
La première ligne fera partie du nom du conteneur. La deuxième ligne spécifie quelle image utiliser pour créer le conteneur. Lorsque vous exécutez la commandedocker-compose up
, il recherchera une image locale sous le nom spécifié,hello-world
.
Avec ceci en place, appuyez surESC
pour quitter le mode insertion. Entrez:x
puisENTER
pour enregistrer et quitter le fichier.
Pour regarder manuellement les images sur votre système, utilisez la commandedocker images
:
docker images
Lorsqu'il n'y a aucune image locale, seuls les en-têtes de colonne affichent:
OutputREPOSITORY TAG IMAGE ID CREATED SIZE
Maintenant, tout en restant dans le répertoire~/hello-world
, exécutez la commande suivante pour créer le conteneur:
docker-compose up
La première fois que nous exécutons la commande, s'il n'y a pas d'image locale nomméehello-world
, Docker Compose la récupérera du référentiel public Docker Hub:
OutputPulling my-test (hello-world:)...
latest: Pulling from library/hello-world
1b930d010525: Pull complete
. . .
Après avoir extrait l'image,docker-compose
crée un conteneur, attache et exécute le programmehello, qui à son tour confirme que l'installation semble fonctionner:
Output. . .
Creating helloworld_my-test_1...
Attaching to helloworld_my-test_1
my-test_1 |
my-test_1 | Hello from Docker.
my-test_1 | This message shows that your installation appears to be working correctly.
my-test_1 |
. . .
Il imprimera ensuite une explication de ce qu'il a fait:
Output. . .
my-test_1 | To generate this message, Docker took the following steps:
my-test_1 | 1. The Docker client contacted the Docker daemon.
my-test_1 | 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
my-test_1 | (amd64)
my-test_1 | 3. The Docker daemon created a new container from that image which runs the
my-test_1 | executable that produces the output you are currently reading.
my-test_1 | 4. The Docker daemon streamed that output to the Docker client, which sent it
my-test_1 | to your terminal.
. . .
Les conteneurs Docker ne s'exécutent que tant que la commande est active, donc une fois quehello
est terminé, le conteneur s'arrête. Par conséquent, lorsque vous examinez les processus actifs, les en-têtes de colonne s'affichent, mais le conteneurhello-world
ne sera pas répertorié car il n'est pas en cours d'exécution:
docker ps
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Utilisez l'indicateur-a
pour afficher tous les conteneurs, pas seulement ceux actifs:
docker ps -a
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
50a99a0beebd hello-world "/hello" 3 minutes ago Exited (0) 3 minutes ago hello-world_my-test_1
Maintenant que vous avez testé l'exécution d'un conteneur, vous pouvez explorer certaines des commandes de base de Docker Compose.
[[step-3-— learning-docker-compose-commands]] == Étape 3 - Apprentissage des commandes Docker Compose
Pour vous familiariser avec Docker Compose, cette section passera en revue les commandes générales prises en charge par l'outildocker-compose
.
La commandedocker-compose
fonctionne sur une base par répertoire. Vous pouvez avoir plusieurs groupes de conteneurs Docker s'exécutant sur une machine - créez simplement un répertoire pour chaque conteneur et un fichierdocker-compose.yml
pour chaque répertoire.
Jusqu'à présent, vous avez exécutédocker-compose up
vous-même, à partir duquel vous pouvez utiliserCTRL-C
pour fermer le conteneur. Cela permet d’afficher les messages de débogage dans la fenêtre du terminal. Ce n’est cependant pas idéal; lors de l'exécution en production, il est plus robuste de faire en sorte quedocker-compose
agisse plus comme un service. Une façon simple de le faire est d'ajouter l'option-d
lorsque vousup
votre session:
docker-compose up -d
docker-compose
va maintenant bifurquer vers l'arrière-plan.
Pour afficher votre groupe de conteneurs Docker (à la fois arrêté et en cours d'exécution), utilisez la commande suivante:
docker-compose ps -a
Si un conteneur est arrêté, lesState
seront répertoriés commeExited
, comme illustré dans l'exemple suivant:
Output Name Command State Ports
------------------------------------------------
hello-world_my-test_1 /hello Exit 0
Un conteneur en cours d’exécution afficheraUp
:
Output Name Command State Ports
---------------------------------------------------------------
nginx_nginx_1 nginx -g daemon off; Up 443/tcp, 80/tcp
Pour arrêter tous les conteneurs Docker en cours d'exécution pour un groupe d'applications, exécutez la commande suivante dans le même répertoire que le fichierdocker-compose.yml
que vous avez utilisé pour démarrer le groupe Docker:
docker-compose stop
[.note] #Note:docker-compose kill
est également disponible si vous avez besoin d'arrêter les choses avec plus de force.
#
Dans certains cas, les conteneurs Docker stockent leurs anciennes informations dans un volume interne. Si vous souhaitez partir de zéro, vous pouvez utiliser la commanderm
pour supprimer complètement tous les conteneurs qui composent votre groupe de conteneurs:
docker-compose rm
Si vous essayez l'une de ces commandes à partir d'un répertoire autre que le répertoire qui contient un conteneur Docker et le fichier.yml
, cela renverra une erreur:
OutputERROR:
Can't find a suitable configuration file in this directory or any
parent. Are you in the right directory?
Supported filenames: docker-compose.yml, docker-compose.yaml
Cette section présente les bases de la manipulation des conteneurs avec Docker Compose. Si vous souhaitez mieux contrôler vos conteneurs, vous pouvez accéder au système de fichiers du conteneur Docker et travailler à partir d'une invite de commande dans votre conteneur, processus décrit dans la section suivante.
[[step-4-— access-the-docker-container-filesystem]] == Étape 4 - Accès au système de fichiers Docker Container
Pour travailler sur l'invite de commande à l'intérieur d'un conteneur et accéder à son système de fichiers, vous pouvez utiliser la commandedocker exec
.
L'exemple «Hello World» se termine après son exécution, donc pour testerdocker exec
, démarrez un conteneur qui continuera à fonctionner. Pour les besoins de ce didacticiel, utilisez lesNginx image de Docker Hub.
Créez un nouveau répertoire nomménginx
et accédez-y:
mkdir ~/nginx
cd ~/nginx
Ensuite, créez un fichierdocker-compose.yml
dans votre nouveau répertoire et ouvrez-le dans un éditeur de texte:
vi docker-compose.yml
Ensuite, ajoutez les lignes suivantes au fichier:
~/nginx/docker-compose.yml
nginx:
image: nginx
Enregistrez le fichier et quittez. Démarrez le conteneur Nginx en tant que processus d'arrière-plan avec la commande suivante:
docker-compose up -d
Docker Compose téléchargera l'image Nginx et le conteneur démarrera en arrière-plan.
Vous aurez maintenant besoin desCONTAINER ID
pour le conteneur. Répertoriez tous les conteneurs en cours d'exécution avec la commande suivante:
docker ps
Vous verrez quelque chose de similaire à ce qui suit:
Output of `docker ps`CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b86b6699714c nginx "nginx -g 'daemon of…" 20 seconds ago Up 19 seconds 80/tcp nginx_nginx_1
Si vous souhaitez apporter une modification au système de fichiers à l'intérieur de ce conteneur, vous devez prendre son ID (dans cet exempleb86b6699714c
) et utiliserdocker exec
pour démarrer un shell à l'intérieur du conteneur:
docker exec -it b86b6699714c /bin/bash
L'option-t
ouvre un terminal, et l'option-i
le rend interactif. /bin/bash
ouvre un shell bash sur le conteneur en cours d'exécution.
Vous verrez alors une invite bash pour le conteneur semblable à:
root@b86b6699714c:/#
À partir de là, vous pouvez travailler à partir de l'invite de commande dans votre conteneur. Gardez toutefois à l'esprit que, sauf si vous vous trouvez dans un répertoire enregistré en tant que partie d'un volume de données, vos modifications disparaîtront dès le redémarrage du conteneur. N'oubliez pas non plus que la plupart des images Docker sont créées avec des installations très minimes de Linux. Par conséquent, certains utilitaires et outils de ligne de commande auxquels vous êtes habitué peuvent ne pas être présents.
Conclusion
Vous avez maintenant installé Docker Compose, testé votre installation en exécutant un exemple «Hello World» et exploré quelques commandes de base.
Alors que l'exemple «Hello World» a confirmé votre installation, la configuration simple ne montre pas l'un des principaux avantages de Docker Compose - être capable de monter et descendre un groupe de conteneurs Docker en même temps. Pour voir la puissance de Docker Compose en action, consultezHow To Secure a Containerized Node.js Application with Nginx, Let’s Encrypt, and Docker Compose etHow To Configure a Continuous Integration Testing Environment with Docker and Docker Compose on Ubuntu 16.04. Bien que ces tutoriels soient destinés à Ubuntu 16.04 et 18.04, les étapes peuvent être adaptées à CentOS 7.