Comment installer et utiliser Docker Compose sur Ubuntu 14.04

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:

[[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:

  1. Le client Docker a contacté le démon Docker.

  2. Le démon Docker a extrait l'image «hello-world» du hub Docker.

  3. 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.

  4. 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.

Related