Agence web » Actualités du digital » Comment empaqueter l'infrastructure de votre application avec Docker

Comment empaqueter l'infrastructure de votre application avec Docker

Docker est un moyen de regrouper les applications et toutes leurs dépendances et configurations requises en une seule image. Essentiellement, cela transforme votre configuration de serveur en quelque chose qui peut être géré avec git et synchronisé sur chaque machine.

Qu'est-ce que Docker et pourquoi est-il utile?

Docker facilite la gestion de la configuration de votre serveur de production. Plutôt que de configurer les serveurs manuellement, vous pouvez automatiser l'ensemble du processus à exécuter lorsque vous créez votre image de conteneur.

Cette image sera la même pour tous les membres de votre équipe, vous pourrez donc exécuter instantanément votre application avec toutes les dépendances requises gérées pour vous. Cela corrige également le problème classique «cela ne fonctionne pas sur ma machine», car les images Docker fonctionneront de la même manière partout.

Cette image peut également être facilement distribuée et exécutée sur une flotte de serveurs avec très peu d'impact sur les performances. Étant donné que Docker n'est pas une machine virtuelle, vous n'avez pas à gérer les frais généraux liés à l'exécution d'un système d'exploitation invité pour chaque application. Cela les rend bon marché et assez évolutifs.

Pour plus d'informations sur ce que fait Docker, et si vous devez ou non l'utiliser pour votre application, vous pouvez lire notre ventilation pour savoir si cela en vaut la peine. Pour l'instant, nous supposerons que vous êtes prêt à commencer et à plonger dans les détails techniques.

Créer un Dockerfile

Le point d'entrée pour la construction de votre conteneur est appelé Dockerfile. Créez un nouveau répertoire de projet pour héberger vos fichiers, puis créez un nouveau Dockerfile simplement nommé Dockerfile sans extension:

touch Dockerfile

Ouvrez ce fichier dans votre éditeur de texte préféré.

Vous ne voulez probablement pas tout recommencer à zéro, vous pouvez donc créer une image existante à partir du Docker Hub, comme Ubuntu:

FROM ubuntu

Notez que même si vous le faites, vous devrez le faire FROM scratch.

Pendant le processus de construction, Docker crée une «couche» modifiable que vous pouvez créer par-dessus. Vous êtes autorisé à copier des fichiers et à exécuter des commandes comme s'ils s'exécutaient sur la machine, de la même manière que pour la configuration manuelle d'un serveur. Vous ferez toute la configuration de votre serveur dans ce fichier, en automatisant essentiellement le processus que vous traverseriez si vous avez déclenché une boîte Linux vierge et qu'on vous a dit de la mettre en production. Cela peut prendre du temps.

Vous pouvez exécuter la plupart de ces commandes à partir de la ligne de commande et configurer l'image manuellement. Si vous souhaitez obtenir un shell bash dans un conteneur, vous pouvez exécuter:

docker exec -it  /bin/bash

Et enregistrez vos modifications avec:

docker commit  

Cependant, vous ne devez l'utiliser que pour les tests et effectuer toute votre configuration réelle dans un Dockerfile.

Commandes Dockerfile

Nous allons parcourir la plupart des commandes courantes et expliquer leur utilisation et les meilleures pratiques pour les appliquer. Pour une référence plus détaillée, vous pouvez consulter cette feuille de triche, ou consulter l'entrée de documentation «Meilleures pratiques pour l'écriture de Dockerfiles».

COPIE

le COPY L'instruction est assez simple: elle vous permet de remplir votre image Docker avec des données et une configuration.

COPY  

Par exemple, si vous aviez un dossier dans votre répertoire de projet appelé /config/nginx/ qui contenait votre nginx.conf, sites-available/et d'autres répertoires, vous pouvez copier cela vers l'emplacement de configuration par défaut de nginx dans votre conteneur:

COPY /config/nginx/ /etc/nginx/

De cette façon, vous pouvez conserver tous vos fichiers de configuration nginx dans le même répertoire de projet que tout le reste, ce qui signifie qu'ils seront contrôlés en version avec git à côté du reste de votre code.

COURIR

le RUN exécute une commande dans votre conteneur et enregistre les modifications apportées au système de fichiers du conteneur.

RUN command

Chaque commande d'exécution crée une nouvelle «couche», vous voudrez donc probablement effectuer une configuration compliquée dans un script d'installation. Vous devrez copier ce script sur l'image, puis l'exécuter:

COPY install.sh .
RUN ./install.sh

Dans ce script, vous êtes libre de faire toute configuration dont vous avez besoin, y compris l'installation de programmes à partir de apt.

Si vous souhaitez réduire les temps de construction de votre conteneur, vous pouvez créer un conteneur de base avec tous les programmes dont vous avez déjà besoin, puis créer votre conteneur principal FROM ce conteneur, mais vous devrez ensuite gérer les dépendances et la configuration séparément.

CMD

CMD définit l'exécutable utilisé par votre conteneur au démarrage si rien d'autre n'est spécifié. C'est ainsi que vous chargerez votre application une fois que tout sera terminé.

CMD executable

Seulement le dernier CMD la commande prend effet. Vous pouvez remplacer le CMD au démarrage avec la syntaxe suivante:

docker run container executable (args)

POINT D'ACCÈS

ENTRYPOINT est une version spéciale de CMD qui permet au conteneur de fonctionner comme un exécutable. Par exemple, si tout le conteneur est exécuté nginx, vous pouvez spécifier nginx comme le ENTRYPOINT:

ENTRYPOINT nginx

Et puis exécutez ce conteneur sur la ligne de commande, en passant des arguments comme arguments au point d'entrée:

docker run container (args)

EXPOSER

Expose marque certains ports de conteneur comme ouverts à l'hôte en cours d'exécution. Par exemple, si vous utilisez un serveur Web, vous souhaiterez probablement

EXPOSE 80

Cela ne lie pas automatiquement le port, mais il informe le runtime Docker que le port est disponible. Pour le lier, vous voudrez utiliser le -P flag (majuscule) sans argument pour lier tous les ports exposés.

Exécuter votre application

Tout d'abord, vous devrez créer votre image:

docker build -t container .

Vous pouvez exécuter votre conteneur avec docker run:

docker run container

Cependant, ce n'est pas trop utile en soi, car il n'y a aucun moyen d'interagir avec lui. Pour ce faire, vous devrez lier des ports à l'aide de l'indicateur -p, comme ceci:

docker run -p 3000:80 nginx

Cela exécute la nginx conteneur et lie la sortie HTTP du conteneur au port 3000 sur la machine locale.

Cependant, avec une configuration standard, vous devrez reconstruire le conteneur Docker chaque fois que vous apportez des modifications à votre application. C'est évidemment loin d'être idéal, mais heureusement, il existe des moyens de contourner cela. Une façon consiste à monter un volume dans votre conteneur pour former un lien en temps réel entre votre conteneur et le système d'exploitation hôte (où vous effectuez votre développement). Par exemple, si votre source HTML se trouve dans le src/html/ dossier de votre répertoire de projet Docker, vous pouvez le monter dans /usr/local/nginx/html/ avec:

docker run -p 80:80 -v ./src/html/:/usr/local/nginx/html:ro container

Le "ro»Indique que cette connexion est en lecture seule, de sorte que le conteneur Docker ne peut apporter aucune modification au système d'exploitation hôte. Cela peut également être utilisé pour permettre aux conteneurs Docker d'accéder aux données persistantes stockées sur le système d'exploitation hôte.

★★★★★