Comment installer et utiliser Docker Compose sur CentOS 7

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:

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.