Docker pour les débutants: qu'est-ce que Docker et comment créer des conteneurs Docker

Si vous avez été en contact avec les derniers développements dans le monde de la programmation au cours des dernières années, vous auriez remarqué le buzz autour des conteneurs Docker et Docker. Cette popularité de docker n'est pas sans raison. L'introduction de Docker a considérablement changé la façon dont les développeurs abordent le développement d'applications.

Qui veut être laissé pour compte lorsqu'une technologie aussi révolutionnaire frappe le monde de la programmation? Donc, aujourd'hui, nous commençons une nouvelle série de tutoriels pour vous apprendre à utiliser Docker pour le développement d'applications. Si vous êtes un débutant absolu dans Docker, cette série de tutoriels est le bon endroit pour commencer.

Dans le premier article de notre série de tutoriels, nous cherchons à comprendre ce qu'est exactement Docker et pourquoi les développeurs aiment tellement Docker. Nous allons également docker une simple application Node.js pour vous familiariser avec les concepts de base de Docker.


Pourquoi attendre plus longtemps? Commençons!



Qu'est-ce que Docker

Docker est un outil utilisé pour créer des applications; c'est-à-dire créer, déployer et exécuter des applications via des conteneurs.


Avec un conteneur, toutes les bibliothèques et autres dépendances requises pour exécuter une application sont regroupées sous la forme d'un package unique pour le déploiement.

L'objectif principal de la conteneurisation d'une application est de l'isoler des autres applications exécutées dans le même système. Cette approche garantit que les applications n'interfèrent pas avec le fonctionnement les unes des autres et facilite grandement la maintenance des applications.

Bien que les conteneurs exécutés dans le même système soient isolés les uns des autres lors de l'exécution, ils partagent le même noyau de système d'exploitation. Par conséquent, les conteneurs sont plus légers que le choix alternatif pour isoler l'exécution des applications, les machines virtuelles.

Une application en conteneur exécutée sur votre système d'exploitation Windows est garantie de s'exécuter sans problème sur la machine Windows d'un autre utilisateur malgré le changement d'environnement.


Bien que les conteneurs soient utilisés depuis longtemps avant Docker, l'introduction de Docker s'est popularisée à l'aide de conteneurs dans la communauté des développeurs. Deux composants sont utilisés lors de l'ancrage d'une application: Dockerfile et Image Docker . Découvrons ce qu’ils sont.

Dockerfile

Dockerfile est un fichier texte qui contient un ensemble de commandes requises pour créer une image Docker. Dockerfile contient des informations sur le système d'exploitation sous-jacent, la langue, l'emplacement du fichier et les ports réseau, entre autres.

Image Docker

Lorsque vous exécutez la commande de construction de Docker avec un fichier docker en place, une image docker est créée en fonction du fichier docker. Ils agissent comme des modèles pour créer le conteneur Docker final. Une fois créées, les images docker sont statiques. Vous pouvez appeler la commande d'exécution de Docker pour créer le conteneur Docker à l'aide d'une image Docker.



Ancrer une application Node.js

Dans ce tutoriel, nous allons ancrer une application Node.js. Nous suivrons une approche étape par étape pour que le conteneur Docker soit opérationnel.


1 - Créer l'application Node.js 2 - Créer le dockerfile 3 - Construire l'image docker 4 - Créer le conteneur d'application

Avant de plonger dans l'ancrage de notre application, vous devez vous assurer que Docker et Node.js sont installés sur votre système.

  • Installez Docker sur votre système - Je ne vais pas expliquer comment installer Docker dans ce didacticiel, mais vous pouvez suivre la documentation Docker et installer Docker sur votre bureau Windows ou Ubuntu.
  • Téléchargez et installez Node.js depuis le site officiel

Créer l'application Node.js

Accédez au nouveau répertoire de projet à partir de la ligne de commande et exécutez la commande suivante pour créer le fichier package.json qui contient des informations sur les dépendances de l'application et lancez le script.

npm init -y


Ensuite, installez et ajoutez Express en tant que dépendance à votre application en exécutant cette commande sur la ligne de commande. Nous utiliserons Express pour créer l'application.

npm install express --save

Cela ajoutera l'express en tant que dépendance à notre package.json déposer.

Nous pouvons maintenant créer une application Node à l'aide d'Express.


Créez un fichier nommé app.js dans le répertoire du projet et ajoutez le code suivant au fichier.

const express = require('express') const app = express() app.get('/', (req, res) => {
res.send('Hello World!') }) app.listen(3000, () => {
console.log('Node server has started running') })

Le code ci-dessus crée un serveur Node qui écoute les demandes entrantes sur le port 3000. Vous pouvez exécuter cette commande sur la ligne de commande pour démarrer le serveur Node.

node app.js

Maintenant, allez dans votre navigateur et suivez l'URL http://localhost:3000 et vous verrez le texte Hello World! sur la page.

Nous avons construit une application Node simple pour notre projet. Passons maintenant à la création du fichier docker.

Créer le Dockerfile

Dans le fichier dockerfile, nous fournissons les informations nécessaires pour créer et exécuter notre application Node dans l'environnement Docker.

Cela inclut la spécification de la langue et sa version utilisées dans l'application, la définition de notre répertoire de projet comme répertoire de travail, la copie de tous les fichiers du répertoire de travail, la définition du port réseau et la spécification du fichier qui est le point d'entrée de l'application. Dans les applications plus complexes, vous devrez également définir des variables d'environnement et l'URL de la base de données dans le fichier docker.

FROM node:latest WORKDIR /dockerTutorial COPY . . RUN npm install EXPOSE 3000 ENTRYPOINT ['node', 'app.js']
  • DE La commande récupère une image du système d'exploitation, pour exécuter notre application sur un système d'exploitation spécifique, à partir de Docker Hub. Docker Hub est un référentiel d'images Docker que nous pouvons extraire dans l'environnement local. Nous récupérons une image basée sur Ubuntu qui a installé Node.js. L'utilisation de «dernière» comme version de Node extrait une image sur laquelle la dernière version de Node est installée.
  • WORKDIR La commande définit le répertoire de travail de l'application.
  • COPIE La commande copie les fichiers du répertoire actuel (sur la ligne de commande) vers le répertoire de travail défini à l'étape précédente. Vous pouvez spécifier un nom de fichier à copier ou utiliser des doubles points pour copier tous les fichiers du répertoire en cours dans le répertoire de travail.
  • COURS La commande installe toutes les dépendances requises pour créer l'application. Cela inclut toutes les dépendances spécifiées dans package.json déposer.
  • EXPOSER La commande ouvre un port du conteneur Docker vers le monde extérieur. Ce port reçoit toutes les demandes que nous envoyons au conteneur Docker. Le port est spécifiquement défini sur 3000 car il s'agit du port utilisé par notre application Node à l'intérieur du conteneur Docker pour écouter les demandes.
  • POINT D'ACCÈS spécifie comment démarrer l'application. Docker rejoint le tableau que nous fournissons à une seule commande pour démarrer l'application. Dans ce cas, node app.js.

Construire l'image Docker

Utilisez la commande suivante pour créer l'image Docker à partir du fichier docker.

docker build -t docker-tutorial .

Docker-tutorial est le nom de l'image Docker. Le point indique le chemin du fichier vers le répertoire du projet, où nous en sommes actuellement dans la ligne de commande.

Si l'image du système d'exploitation spécifiée avec DE commander, nœud: dernier , n'est pas dans votre appareil pour le moment, il sera extrait de Docker Hub lorsque vous exécuterez la commande ci-dessus.

Après avoir extrait l'image, chaque commande du fichier docker sera exécutée une par une.

À la fin de l'exécution, si vous voyez le message construit avec succès , l'image docker de l'application a été créée avec succès. Exécutez cette commande pour voir l'image docker intégrée dans le référentiel d'images local.

docker images

La sortie ressemble à ceci

Création du conteneur

Nous pouvons maintenant utiliser l'image intégrée pour créer notre conteneur Docker. Utilisez la commande docker run pour créer le conteneur.

docker run -p 8080:3000 docker-tutorial

Ici, les nombres 8080 et 3000 indiquent l'extérieur et l'intérieur du conteneur. Le port externe, 8080, est le port que nous utilisons pour nous connecter à l'application via notre navigateur. Le port interne, 3000, est le port que notre application écoute pour les demandes entrantes. Le conteneur Docker mappe le port externe donné au port interne.

Visitez l'URL http://localhost:8080 sur le navigateur et voyez si vous obtenez la page avec Hello World! message que vous avez reçu lors de votre visite http://localhost:3000 avant que. Si oui, votre conteneur Docker est opérationnel.

Vous pouvez utiliser cette commande pour afficher tous les conteneurs Docker en cours d'exécution sur votre appareil.

docker ps

La commande vous donnera une sortie comme celle-ci. Nous pouvons trouver le CONTAINER_ID et le NAME du conteneur en cours d'exécution ici.

Ajout de variables d'environnement à votre application

Rappelez-vous comment j'ai mentionné qu'une application avec des variables environnementales nécessite plus d'instructions dans le fichier dockerfile? La valeur des variables environnementales change avec l'environnement dans lequel elles s'exécutent.

Notez comment nous avons explicitement mentionné le port que notre application Node écoute lorsque le serveur est en cours d'exécution. Cette approche est inflexible et sujette aux erreurs. Si nous exécutons notre application dans un environnement qui n'ouvre pas le port 3000 pour le serveur Node, notre application cesse de fonctionner.

L'implémentation la plus appropriée consiste à retirer le numéro de port de l'application. Au lieu de cela, nous utilisons un nom de variable à la place du numéro de port et définissons une valeur pour cette variable dans l'environnement en cours d'exécution. Dans notre cas, l'environnement en cours d'exécution est le conteneur Docker. Nous devons donc ajouter le numéro de port au dockerfile en tant que variable d'environnement.

Voyons comment nous pouvons y parvenir.

Tout d'abord, ajoutez la variable d'environnement à notre fichier docker avec sa valeur. Nous devons ajouter une nouvelle commande au dockerfile pour accomplir cela.

FROM node:latest WORKDIR /dockerTutorial COPY . . ENV PORT=3000 RUN npm install EXPOSE $PORT ENTRYPOINT ['node', 'app.js']

En utilisant la commande ENV suivie du nom de la variable et de l'affectation de la valeur, nous pouvons ajouter une nouvelle variable d'environnement à notre fichier docker. Avez-vous remarqué comment la commande EXPOSE 3000 a été modifiée pour ne pas mentionner explicitement le numéro de port? Au lieu de cela, il fait référence à la variable PORT créée pour obtenir le numéro de port exact. Avec cette approche, si nous devons changer le numéro de port, nous n'avons qu'à changer un endroit dans notre code, ce qui rend notre application facile à maintenir.

Maintenant que nous avons modifié le fichier dockerfile, l'étape suivante consiste à modifier app.js pour faire référence à la variable d'environnement créée. Pour cela, nous remplaçons le numéro de port 3000 utilisé dans la méthode listen par process.env.PORT.

const express = require('express') const app = express() app.get('/', (req, res) => {
res.send('Hello World!') }) app.listen(process.env.PORT, () => {
console.log('Node server has started running') })

Depuis que nous avons apporté des modifications à nos fichiers d'application et dockerfile, nous devons créer une nouvelle image pour un nouveau conteneur. Mais d'abord, nous devons arrêter le conteneur Docker en cours d'exécution pour y parvenir.

Nous pouvons utiliser la commande docker stop pour arrêter le conteneur.

docker stop f10

La valeur, f10, utilisée dans cette commande correspond aux trois premiers chiffres de l'ID du conteneur.

Nous pouvons utiliser la commande, docker kill, pour arrêter le conteneur en cours d'exécution.

docker kill f10

La différence entre docker kill et docker stop est que docker stop arrête le conteneur plus facilement en libérant l'utilisation des ressources et en enregistrant l'état. docker kill, cependant, arrête le conteneur plus brusquement sans libérer correctement les ressources ou enregistrer l'état. Pour un conteneur s'exécutant dans un environnement de production, l'utilisation de docker stop pour arrêter le conteneur est le meilleur choix.

Après avoir arrêté un conteneur en cours d'exécution, assurez-vous de nettoyer le résidu laissé par le conteneur de l'environnement hôte à l'aide de la commande suivante.

Exécution du conteneur en mode démon

Lorsque vous essayez d'exécuter les commandes ci-dessus pour arrêter le conteneur, vous remarquerez que l'onglet de terminal que nous avons utilisé pour créer le conteneur ne peut pas être utilisé pour exécuter d'autres commandes à moins que nous ne tuions le conteneur. Nous pouvons trouver une solution de contournement pour cela en utilisant un onglet séparé pour exécuter de nouvelles commandes.

Mais il existe une meilleure approche. Nous pouvons exécuter le conteneur en mode démon. Avec le mode démon, le conteneur s'exécute en arrière-plan sans utiliser l'onglet actuel pour afficher les sorties.

Pour démarrer un conteneur en mode démon, il vous suffit d'ajouter un indicateur -d supplémentaire à la commande docker run.

docker run -d -p 8080:3000 docker-tutorial

Exécution du conteneur en mode interactif

Pour exécuter un conteneur en mode interactif, le conteneur doit déjà être en cours d'exécution. Une fois en mode interactif, vous pouvez exécuter des commandes pour ajouter ou supprimer des fichiers dans le conteneur, répertorier des fichiers ou exécuter d'autres commandes bash que nous utilisons habituellement.

Utilisez la commande suivante pour exécuter le conteneur en mode interactif.

docker exec -it e37 bash

Ici, e37 est l'ID du conteneur. Jouez avec le mode interactif en utilisant les commandes bash.



Conclusion

Dans le premier didacticiel de notre série de didacticiels Docker, vous avez appris à créer un conteneur Docker pour une simple application Node.js. Mais vous pouvez faire plus avec Docker et les conteneurs. Dans nos prochains didacticiels, nous verrons comment travailler avec des bases de données, des volumes et travailler avec plusieurs conteneurs utilisés par une application créée avec des microservices.