Docker: Pour commencer. Attention Déployer

À quelle fréquence avez-vous dû configurer des environnements de serveur pour déployer votre application (par exemple, un site Web)? Sûrement plus souvent que je ne le souhaiterais.

Dans le meilleur des cas, vous aviez un script qui faisait tout cela automatiquement. Dans le pire des cas, cela pourrait ressembler Ă  ceci:

  • installer la base de donnĂ©es D version xxx
  • installer le serveur Web N version xx, etc.

La gestion de l'environnement ainsi configurée devient très gourmande en ressources au fil du temps. Tout changement de configuration, même mineur, signifie au moins:

  • que chaque dĂ©veloppeur doit ĂŞtre au courant de ces changements
  • tous ces changements doivent ĂŞtre ajoutĂ©s en toute sĂ©curitĂ© Ă  l'environnement de production

Il est difficile de suivre ces changements et de les gérer sans outils spéciaux. Quoi qu'il en soit, il y a des problèmes avec la configuration des dépendances d'environnement. Plus le développement évolue, plus il devient difficile de trouver et de résoudre ces problèmes.

Ci-dessus, j'ai décrit ce qu'on appelle le verrouillage des fournisseurs. Pour le développement d'applications, notamment de type serveur, ce phénomène devient un gros problème. Dans cet article, nous considérerons l'une des solutions possibles - Docker . Vous apprendrez à créer, déployer et exécuter une application basée sur celle-ci.



/ Avis de non-responsabilité: / Ce n'est pas une revue du Docker. À la fin de cet article, vous trouverez une liste de documents utiles qui décrivent comment mieux travailler avec Docker. Il s'agit du premier point d'entrée pour les développeurs qui prévoient de déployer des applications node.js à l'aide de conteneurs Docker.

Lors du développement d' un de mes projets , j'ai été confronté à un manque d'articles détaillés, ce qui a donné lieu à un nombre considérable de vélos. Ce billet est un peu en retard pour tenter de corriger le manque d'informations sur le sujet.

Qu'est-ce que c'est et avec quoi mange-t-il?


En termes simples, Docker est une abstraction des conteneurs LXC. Cela signifie que les processus lancés à l'aide de Docker ne verront que eux-mêmes et leurs descendants. Ces processus sont appelés conteneurs Docker.

Afin de pouvoir créer une sorte d'abstraction basée sur de tels conteneurs, une image existe dans Docker (/ docker image /). Sur la base de l'image Docker, vous pouvez configurer et créer des conteneurs.

Il existe des milliers d'images Docker prêtes à l'emploi avec des bases de données préinstallées, des serveurs Web et d'autres éléments importants. Un autre avantage de Docker est qu'il s'agit d'un outil très économique pour la consommation de mémoire, car il n'utilise que les ressources dont il a besoin.

Rapprochez-vous


Nous ne nous attarderons pas sur l' installation pendant longtemps. Le processus des dernières versions a été simplifié en quelques clics / équipes.

Dans cet article, nous analyserons le déploiement d'une application Docker à l'aide de l'exemple d'une application Node.js côté serveur. Voici son code source primitif:

// index const http = require('http'); const server = http.createServer(function(req, res) { res.write('hello world from Docker'); res.end(); }); server.listen(3000, function() { console.log('server in docker container is started on port : 3000'); }); 

Nous avons au moins deux façons de conditionner une application dans un conteneur Docker:

  • crĂ©er et exĂ©cuter un conteneur Ă  partir d'une image existante Ă  l'aide de l'outil d'interface de ligne de commande;
  • crĂ©ez votre propre image sur la base de l'Ă©chantillon fini.

La deuxième méthode est utilisée plus souvent.

Pour commencer, téléchargez l'image officielle de node.js:

 docker pull node 

La commande docker pull télécharge une image Docker. Après cela, vous pouvez exécuter la commande docker run. Cela va créer et exécuter le conteneur basé sur l'image téléchargée.

 docker run -it -d --rm -v "$PWD":/app -w=/app -p 80:3000 node node index.js 

Cette commande lancera le fichier index.js, mappera 3000 ports à 80 et affichera l'ID du conteneur créé. Déjà mieux! Mais sur une seule CLI, vous n'irez pas loin. Créons un Dockerfile pour notre serveur.

 FROM node WORKDIR /app RUN cp . /app CMD ["node", "index.js"] 

Ce Dockerfile décrit l'image à partir de laquelle la version actuelle est héritée, ainsi que le répertoire dans lequel les commandes de conteneur et la commande de copie de fichier démarreront à partir du répertoire dans lequel l'assemblage d'image est lancé. La dernière ligne indique quelle commande sera exécutée dans le conteneur créé.

Ensuite, nous devons construire une image à partir de ce Dockerfile que nous déploierons: docker build -t nom d'utilisateur / helloworld-with-docker: 0.1.0 . Cette commande crée une nouvelle image, la marque avec le nom d' utilisateur / helloworld-with-docker et crée une balise 0.1.0.

Notre conteneur est prêt. Nous pouvons l'exécuter avec la commande docker run. Ainsi, nous résolvons le problème de verrouillage du fournisseur. Le lancement de l'application ne dépend plus de l'environnement. Le code est fourni avec l'image Docker. Ces deux critères nous permettent de déployer l'application à n'importe quel endroit où nous pouvons exécuter Docker.

Déployer


Les 99 premiers% ne sont pas aussi terribles que les 99% restants.

Une fois que nous avons terminé toutes les instructions ci-dessus, le processus de déploiement lui-même devient une question de technologie et d'environnement de développement. Nous considérerons 2 options pour déployer Docker:

  • dĂ©ploiement manuel de l'image Docker;
  • dĂ©ploiement Ă  l'aide de Travis-CI.

Dans chaque cas, nous envisagerons de livrer l'image à un environnement indépendant, par exemple, le serveur de transfert de votre produit.

Déploiement manuel


Cette option est bonne si vous ne disposez d'aucun environnement d'intégration continue. Vous devez d'abord télécharger l'image Docker vers un emplacement accessible par le serveur de transfert. Dans notre cas, ce sera un DockerHub. Pour chaque utilisateur, il fournit gratuitement un référentiel d'images privé et un nombre illimité de référentiels publics.

Connectez-vous pour accéder à notre DockerHub:

 docker login -e username@gmail.com -u username -p userpass 

Nous y chargeons notre image: docker push username / helloworld-with-docker: 0.1.0.

Ensuite, allez sur le serveur de transfert (je vous rappelle que Docker doit déjà y être préinstallé).

Pour déployer notre application sur le serveur, nous devons exécuter une seule commande:

 docker run -d --rm -p 80:3000 username/helloworld-with-docker:0.1.0. 

Et c'est tout! Vérifiez le registre local d'images. Si vous ne trouvez pas le résultat souhaité, entrez nom d'utilisateur / helloworld-with-docker pour vérifier le registre DockerHub. Une image avec ce nom peut être trouvée dans le registre, car nous l'avons déjà téléchargée là-bas. Docker le télécharge, crée un conteneur sur sa base et y lance votre application.

Maintenant, chaque fois que vous devez mettre à jour la version de votre application, vous pouvez pousser avec une nouvelle balise et redémarrer à chaque fois le conteneur sur le serveur.

PS Cette méthode n'est pas recommandée s'il est possible d'utiliser Travis-CI.

Déployer avec Travis-CI


Tout d'abord, ajoutez les données DockerHub à Travis-CI. Ils seront stockés dans des variables d'environnement.

 travis encrypt DOCKER_EMAIL=email@gmail.com travis encrypt DOCKER_USER=username travis encrypt DOCKER_PASS=password 

Ensuite, nous ajoutons les clés reçues au fichier .travis.yml. Nous ajouterons également un commentaire à chaque clé afin de les distinguer à l'avenir.

 env: global: - secure: "UkF2CHX0lUZ...VI/LE=" # DOCKER_EMAIL - secure: "Z3fdBNPt5hR...VI/LE=" # DOCKER_USER - secure: "F4XbD6WybHC...VI/LE=" # DOCKER_PASS 

Ensuite, nous devons nous connecter et télécharger l'image:

 after_success: - docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS - docker build -f Dockerfile -t username/hello-world-with-travis. - docker tag username/hello-world-with-travis 0.1.0 - docker push username/hello-world-with-travis 

De plus, la livraison d'images peut être lancée à partir de Travis-CI de différentes manières:

  • manuellement;
  • via une connexion ssh;
  • services de dĂ©ploiement en ligne (Deploy Bot, deployhq);
  • AWS CLI;
  • Kubernates;
  • Outils de dĂ©ploiement Docker.

Résumé


Dans cet article, nous avons examiné la préparation et le déploiement de Docker à l'aide d'un exemple de serveur node.js simple de deux manières: automatique et automatisée à l'aide de Travis-CI. J'espère que cet article vous a été bénéfique.

Source: https://habr.com/ru/post/fr466493/


All Articles