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