Docker 101 - Comment passer de la création au déploiement

Docker change la donne et a beaucoup changé le monde du développement d'applications. Apprenez les compétences essentielles nécessaires pour travailler avec cette technologie de conteneur aujourd'hui.

Qu'est-ce que Docker?

En termes simples, Docker est un outil qui permet aux développeurs de créer, déployer et exécuter des applications dans des conteneurs. La conteneurisation est l'utilisation de conteneurs Linux pour déployer des applications.

Alors pourquoi Docker est-il si génial et pourquoi devrions-nous en tant que développeurs prendre la peine de l'apprendre?

RaisonExplication
SoupleMême les applications les plus complexes peuvent être conteneurisées.
Poids légerLes conteneurs exploitent et partagent le noyau hôte.
InterchangeableVous pouvez déployer des mises à jour et des mises à niveau à la volée.
PortableVous pouvez créer localement, déployer sur le cloud et exécuter n'importe où.
ÉvolutifVous pouvez augmenter et distribuer automatiquement les réplicas de conteneurs.
EmpilableVous pouvez empiler les services verticalement et à la volée.

Maintenant que nous savons pourquoi Docker est si important, faisons-le installer sur notre machine locale.

Créez un compte sur Docker Hub et téléchargez l'application gratuite Docker Desktop.

En quoi Docker est-il différent des machines virtuelles traditionnelles?

Un conteneur s'exécute nativement sur Linux et partage le noyau de la machine hôte avec d'autres conteneurs. Il fonctionne comme un processus discret, ne prenant pas plus de mémoire que tout autre exécutable, ce qui signifie qu'il est très léger.

En revanche, une machine virtuelle (VM) exécute un système d'exploitation «invité» à part entière avec un accès virtuel aux ressources hôtes via un hyperviseur. En général, les machines virtuelles fournissent un environnement avec plus de ressources que la plupart des applications n'en ont besoin.

Lorsque vous travaillez avec Docker, un `Dockerfile` définit ce qui se passe dans l'environnement à l'intérieur de votre conteneur. L'accès aux ressources telles que les interfaces réseau et les lecteurs de disque est virtualisé dans cet environnement, qui est isolé du reste de votre système. Cela signifie que vous devez mapper les ports sur le monde extérieur et être précis sur les fichiers que vous souhaitez «copier» dans cet environnement. Cependant, après cela, vous pouvez vous attendre à ce que la construction de votre application définie dans ce `Dockerfile` se comporte exactement de la même manière partout où elle s'exécute.

Commandes Docker

Pour vérifier que vous disposez d'une version en cours d'exécution de Docker, exécutez la commande suivante:

docker --version

Pour vérifier que votre installation fonctionne parfaitement, essayez d'exécuter la simple image Docker hello-world :

docker run hello-world

Si tout est configuré correctement, vous devriez voir une sortie similaire à ce qui suit:

Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world ca4f61b1923c: Pull complete Digest: sha256:ca0eeb6fb05351dfc8759c20733c91def84cb8007aa89a5bf606bc8b315b9fc7 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. ... 

Pour voir l' image Docker hello-world qui a été téléchargée sur votre ordinateur, utilisez la commande de liste d'images Docker:

docker image ls

Impressionnant! Vous avez déjà commencé à développer des applications conteneurisées avec Docker. Voici quelques commandes de base utiles de Docker:

## List Docker CLI commands docker docker container --help ## Display Docker version and info docker --version docker version docker info ## Execute Docker image docker run hello-world ## List Docker images docker image ls ## List Docker containers (running, all, all in quiet mode) docker container ls docker container ls --all docker container ls -aq 
La conteneurisation rend CI / CD transparente. Par exemple:
  • les applications n'ont pas de dépendances système
  • les mises à jour peuvent être transmises à n'importe quelle partie d'une application distribuée
  • la densité des ressources peut être optimisée.
  • Avec Docker, la mise à l'échelle de votre application consiste à créer de nouveaux exécutables, et non à exécuter des hôtes VM lourds.

Créons une application Web Node.js à l'aide de Docker

La première chose que nous faisons est de créer un package.jsonfichier. Nous pouvons le faire rapidement en exécutant simplement la commande suivante:

npm init -y 

Cela crée le fichier ci-dessus avec certains champs essentiels déjà remplis ou laissés vides.

Votre fichier doit ressembler à ceci:

{ "name": "app-name", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC" } 

Ensuite, nous installons express.js, qui selon le site officiel, est un " framework web rapide, sans opinion et minimaliste pour Node.js ".

Nous faisons cela en exécutant la commande suivante dans un terminal:

npm install express --save 

La commande ci-dessus ajoute le express.jscadre à notre application, avec l' indicateur --save agissant comme une instruction à l'application à utiliser express.jscomme dépendance.

Maintenant, allez dans votre package.jsonet changez la "main": "index.js"paire clé-valeur comme suit:

"main": "app.js" 

Ensuite, créez un .gitignorefichier à l'aide de la commande suivante:

touch .gitignore 

Ajoutez ensuite la ligne suivante:

node_modules/ 

Cela empêche le dossier node_modules qui est essentiel au node.jsdéveloppement d'être suivi par git.

Ajoutez maintenant le code suivant au app.jsfichier:

const express = require('express'); const app = express(); const PORT = 8080; const HOST = '0.0.0.0'; app.get('/', (req, res) => { res.send( ` 

Home

Docker is awesome!

Next Page ` ) }); app.get('/more', (req, res) => { res.send( `

Page Two

Node.js is pretty great too!!

Back Home ` ) }); app.listen(PORT, HOST); console.log(`Running on //${HOST}:${PORT}`);

Pour exécuter cette opération sur votre ordinateur local, exécutez la commande suivante dans le dossier de l'application:

npm start 

Vous trouverez l'application en cours d'exécution sur //0.0.0.0:8080/

Impressionnant!

Toutes nos félicitations

Félicitations pour être arrivé aussi loin

Dans le Dockerverse

Créez maintenant un Dockerfileavec la commande suivante:

touch Dockerfile 

Ajoutez ensuite le code suivant:

# An official Docker image for Node.js FROM node:10-alpine # Working directory for the containerised application WORKDIR /src/app # This copies significant package.json files to the current directory COPY package*.json ./ # Install essential Node.js dependencies RUN npm install COPY . . # Opens up this port on the Docker container EXPOSE 8080 # This starts the Docker application CMD [ "npm", "start" ] 

Les commentaires ci-dessus tentent d'expliquer ce que fait chaque Dockerfilecommande.

Ajoutez également un dockerignorefichier pour éviter la conteneurisation de certains composants de l'application.

Placez ceci à l'intérieur du dockerignorefichier:

node_modules npm-debug.log Dockerfile* docker-compose* .dockerignore .git .gitignore README.md LICENSE 

Comment déployer

Le est le nom que vous attribuez à votre application Docker et n'est essentiellement qu'un indicateur de version pour votre image Docker.

  • docker build -t image-name:tag .

Exécutez ceci pour accéder à votre compte Docker depuis votre terminal.

  • docker login

Créez un référentiel sur Docker Hub.

Balise pour téléchargement dans le registre.

  • docker tag username/repository:tag

Téléchargez l'image balisée dans le registre.

  • docker push username/repository:tag

Exécutez le conteneur Docker déployé sur votre machine locale en connectant ses PORTS. Ciblez le port 8080 exposé et attribuez-le au port 10203 de votre machine.

  • docker run -p 10203:8080 username/repository:tag

C'est ça! Vous avez créé et déployé une application Web Node.js en conteneur.

Tout le code ci-dessus se trouve dans ce référentiel Github.

Publié à l'origine ici sur blog.ninte.dev