introduction
Docker est un excellent outil, mais pour vraiment profiter pleinement 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 devint si populaire que l'équipe Docker décida finalement de créer leur propre version basée sur la source Fig. Ils l'ont appeléDocker Compose. En bref, il est très facile de gérer les processus d’orchestration des conteneurs Docker (tels que le démarrage, la fermeture et la configuration de liaisons et de volumes intra-conteneurs).
À la fin de cet article, Docker et Docker Compose seront installés et vous permettront de comprendre le fonctionnement de Docker Compose.
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 par défaut, 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. Inutile de dire que cela rend la configuration et l'utilisation de l'image s'exécutant dans un conteneur Docker difficile par défaut.
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 voulez vous assurer que vos fichiers journaux traînent, 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 partager facilement des fichiers entre le conteneur Docker et la machine hôte, que nous explorerons dans lesDocker data volume article.
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 communiquer entre eux et au 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:
-
Ubuntu 14.04 Droplet
-
Un utilisateur non root avec des privilèges sudo (Initial Server Setup with Ubuntu 14.04 explique comment configurer cela.)
[[step-1 -—- Installing-docker]] == Étape 1 - Installation de Docker
Commencez par installer Docker si vous ne l’avez pas déjà fait. Le moyen le plus rapide d’installer Docker est de télécharger et d’installer son script d’installation (un mot de passe sudo vous sera demandé).
wget -qO- https://get.docker.com/ | sh
La commande ci-dessus télécharge et exécute un petit script d'installation écrit par l'équipe Docker. Si vous ne faites pas confiance aux scripts tiers ou si vous voulez plus de détails sur ce que fait le script, consultez les instructions dans lesDigitalOcean Docker tutorial ou lesinstallation documentation de Docker.
Travailler avec Docker est pénible si votre utilisateur n'est pas configuré correctement, alors ajoutez votre utilisateur au groupedocker
avec la commande suivante.
sudo usermod -aG docker $(whoami)
Déconnectez-vous et connectez-vous à votre serveur pour activer vos nouveaux groupes.
[.note] #Note: Pour en savoir plus sur l'utilisation de Docker, lisez la sectionHow to Use Docker deHow To Install and Use Docker: Getting Started.
#
[[step-2 -—- Installing-docker-compose]] == Étape 2 - Installation de Docker Compose
Maintenant que Docker est installé, commençons par installer Docker Compose. Tout d'abord, installezpython-pip
comme prérequis:
sudo apt-get -y install python-pip
Ensuite, vous pouvez installer Docker Compose:
sudo pip install docker-compose
[[step-3 -—- running-a-container-with-docker-compose]] == Étape 3 - Exécution d'un conteneur avec Docker Compose
Le registre Docker public, Docker Hub, comprend une simple imageHello World. Maintenant que Docker Compose est installé, testons-le avec cet exemple très simple.
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 favori (nous utiliserons nano):
nano docker-compose.yml
Placez le contenu suivant dans le fichier, enregistrez le fichier et quittez l'éditeur de texte:
docker-compose.yml
my-test:
image: hello-world
La première ligne sera utilisée dans le nom du conteneur. La deuxième ligne spécifie quelle image utiliser pour créer le conteneur. L'image sera téléchargée à partir du référentiel officiel de Docker Hub.
Tout en restant dans le répertoire~/hello-world
, exécutez la commande suivante pour créer le conteneur:
docker-compose up
La sortie devrait commencer par ce qui suit:
Output of docker-compose upCreating 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 |
La sortie explique ensuite ce que Docker fait:
-
Le client Docker a contacté le démon Docker.
-
Le démon Docker a extrait l'image «hello-world» du hub Docker.
-
Le démon Docker a créé un nouveau conteneur à partir de cette image, qui exécute le fichier exécutable qui produit la sortie en cours de lecture.
-
Le démon Docker a transmis cette sortie au client Docker, qui l’a envoyé à votre terminal.
Si le processus ne se termine pas de lui-même, appuyez surCTRL-C
.
Ce test 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. Les articles deHow To Install Wordpress and PhpMyAdmin with Docker Compose on Ubuntu 14.04 montrent comment utiliser Docker Compose pour exécuter trois conteneurs en un seul groupe d'applications.
[[step-4-— learning-docker-compose-commands]] == Étape 4 - Apprentissage des commandes Docker Compose
Passons en revue les commandes 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 conteneur dans son répertoire.
Jusqu'à présent, nous avons exécutédocker-compose up
par nous-mêmes et avons utiliséCTRL-C
pour l'arrêter. Cela permet d’afficher les messages de débogage dans la fenêtre du terminal. Ce n’est pas idéal cependant, lors de l’exécution en production, vous souhaiterez quedocker-compose
agisse davantage comme un service. Une façon simple de le faire est d'ajouter simplement 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
Par exemple, ce qui suit montre que le conteneurhelloworld_my-test_1
est arrêté:
Output of `docker-compose ps` Name Command State Ports
-----------------------------------------------
helloworld_my-test_1 /hello Exit 0
Un conteneur en cours d’exécution affichera l’état deUp
:
Output of `docker-compose ps` 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
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 un fichier.yml
, il se plaindra et ne vous montrera pas vos conteneurs:
Output from wrong directory 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, fig.yml, fig.yaml
[[step-5-— access-the-docker-container-filesystem-optional]] == Étape 5 - Accès au système de fichiers Docker Container (facultatif)
Si vous devez travailler sur l'invite de commande à l'intérieur d'un conteneur, vous pouvez utiliser la commandedocker exec
.
L'exemple deHello World! se termine après son exécution, nous devons donc démarrer un conteneur qui continuera à fonctionner afin de pouvoir ensuite utiliserdocker exec
pour accéder au système de fichiers du conteneur. Jetons un coup d'œil auxNginx image de Docker Hub.
Créez un nouveau répertoire et changez-le:
mkdir ~/nginx && cd $_
Créez un fichierdocker-compose.yml
dans notre nouveau répertoire:
nano docker-compose.yml
et collez ce qui suit:
~/nginx/docker-compose.yml
nginx:
image: nginx
Enregistrez le fichier et quittez. Nous devons juste démarrer le conteneur Nginx en tant que processus d’arrière-plan avec la commande suivante:
docker-compose up -d
L'image Nginx sera téléchargée puis le conteneur sera démarré en arrière-plan.
Nous avons maintenant besoin desCONTAINER ID
pour le conteneur. Liste de tous les conteneurs en cours d'exécution:
docker ps
Vous verrez quelque chose de similaire à ce qui suit:
Output of `docker ps`CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e90e12f70418 nginx "nginx -g 'daemon off" 6 minutes ago Up 5 minutes 80/tcp, 443/tcp nginx_nginx_1
[.note] #Note: Seuls les conteneursrunning sont répertoriés avec la commandedocker ps
.
#
Si nous voulions apporter une modification au système de fichiers à l'intérieur de ce conteneur, nous prendrions son ID (dans cet exemplee90e12f70418
) et utiliserionsdocker exec
pour démarrer un shell à l'intérieur du conteneur:
docker exec -it e90e12f70418 /bin/bash
L'option-t
ouvre un terminal, et l'option-i
le rend interactif. Les options/bin/bash
ouvrent un shell bash vers le conteneur en cours d'exécution. Assurez-vous d'utiliser l'ID de votre conteneur.
Vous verrez une invite bash pour le conteneur semblable à:
root@e90e12f70418:/#
À partir de là, vous pouvez travailler à partir de l'invite de commande. 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. Un autre inconvénient est 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
Parfait, cela couvre donc les concepts de base de Docker Compose et comment l’installer et le faire fonctionner. Consultez le tutoriel deDeploying Wordpress and PHPMyAdmin with Docker Compose on Ubuntu 14.04 pour un exemple plus compliqué de déploiement d'une application avec Docker Compose.
Pour une liste complète des options de configuration pour le fichierdocker-compose.yml
, reportez-vous auxCompose file reference.