JavaRush /Blog Java /Random-FR /Première connaissance avec Docker
Viacheslav
Niveau 3

Première connaissance avec Docker

Publié dans le groupe Random-FR
La conteneurisation est un mécanisme souvent utilisé en pratique. Par exemple, lorsque vous effectuez une recherche sur chasseur de têtes, vous trouverez à ce jour 477 postes vacants mentionnant Docker. Ce ne serait donc pas une mauvaise idée de vous familiariser avec ce dont il s’agit. J'espère que cette courte revue vous aidera à vous faire une première idée. Eh bien, il le soutiendra avec du matériel supplémentaire, comme des cours sur Udemy. Première introduction à Docker - 1

Introduction

Dans cette courte revue, je voudrais aborder un sujet tel que la conteneurisation. Et vous devez commencer par comprendre ce qu’est réellement la conteneurisation. Selon Wikipédia, la « conteneurisation » est une virtualisation au niveau du système d'exploitation (c'est-à-dire PAS du matériel) dans laquelle le noyau du système d'exploitation maintient plusieurs instances d'espace utilisateur isolées au lieu d'une seule. " L'espace utilisateur " est l'espace d'adressage de la mémoire virtuelle du système d'exploitation réservé aux programmes utilisateur. Les instances d'espace utilisateur (communément appelées conteneurs) sont complètement identiques à une instance de système d'exploitation unique du point de vue de l'utilisateur. Le noyau garantit une isolation complète des conteneurs, de sorte que les programmes de différents conteneurs ne peuvent pas s'influencer mutuellement. Il s'avère que la conteneurisation est une virtualisation logicielle, c'est-à-dire une virtualisation au niveau du système d'exploitation, dont le noyau du système d'exploitation est responsable. L'une des caractéristiques de cette approche est que tous les conteneurs utilisent un noyau commun, le même que le système d'exploitation hôte (c'est-à-dire celui sur lequel se trouvent les conteneurs). Cela vous permet de vous débarrasser de la surcharge liée à l'émulation du matériel virtuel et au lancement d'une instance à part entière du système d'exploitation. On peut dire qu’il s’agit d’une virtualisation « légère ». Le noyau est la partie centrale du système d'exploitation qui fournit aux applications un accès coordonné aux ressources informatiques, telles que le temps processeur, la mémoire, le matériel externe et les périphériques d'entrée et de sortie externes. Le noyau fournit également généralement des services de système de fichiers et de protocole réseau. En général, c'est le cœur de tout le système. Pour plus d'informations, il peut être utile de consulter le matériel " Informations générales sur les conteneurs ". Et quelques mots supplémentaires pour compléter l’introduction. Nous comprenons maintenant qu'un système d'exploitation possède un noyau. Il fournit une isolation pour les instances de l'espace utilisateur. Dans ce contexte, vous rencontrerez peut-être le terme « cgroups ». C'est le nom du mécanisme même du noyau Linux qui vous permet d'y parvenir. Par conséquent, nous pouvons dire que le chemin de la conteneurisation a commencé avec les systèmes Linux. Cependant, à partir de Windows 10, la prise en charge de la conteneurisation est également apparue. Pour travailler avec la virtualisation, vous devez configurer la prise en charge de la virtualisation dans le BIOS de votre ordinateur. La manière de procéder dépend de l'ordinateur. Par exemple, cela pourrait ressembler à ceci :
Première introduction à Docker - 2
Sous Windows, vous pouvez vérifier cela de différentes manières. Par exemple, vous pouvez télécharger un utilitaire spécial sur le site Web de Microsoft : Hardware-Assisted Virtualization Detection Tool . Eh bien, il convient de mentionner un autre concept important : l'hyperviseur. Hypervisor est un moniteur de machine virtuelle, un programme permettant d'assurer l'exécution parallèle de plusieurs systèmes d'exploitation sur le même ordinateur. L'hyperviseur garantit que les systèmes d'exploitation sont isolés les uns des autres et partage les ressources entre les systèmes d'exploitation en cours d'exécution. L'un de ces hyperviseurs est Oracle VirtualBox .
Première introduction à Docker - 3

Docker

Ainsi, ce qu’est la virtualisation est clair. Mais comment l'utiliser ? Et ici Docker vient à notre aide. Docker est un logiciel permettant d'automatiser le déploiement et la gestion d'applications dans des environnements conteneurisés. Cela vaut la peine de commencer par le fait que Docker est représenté par un concept tel que Docker Enginge. Et vous devriez commencer par le site officiel de Docker et la section « Docker Overview ».
Première introduction à Docker - 4
La documentation indique que Docker se compose de :
  • Serveur Docker appelé processus Docker Daemon (dockerd).
  • Interface de ligne de commande, également connue sous le nom de CLI (docker).
  • Une API REST qui décrit comment les programmes peuvent « parler » au démon et lui dire quoi faire.
Avant d'aller plus loin, installons Docker, c'est-à-dire installons le démon Docker. Le site Web Docker contient des instructions pour installer « Docker pour Windows ». Fait intéressant, Docker a sa propre configuration système requise. Et si, comme moi, vous possédez un ancien Windows, par exemple Windows 7, alors vous devez utiliser Docker Toolbox.
Première introduction à Docker - 5

Boîte à outils Docker

Pour installer Docker sur d'anciennes machines qui ne répondent pas à la configuration système requise. Le site Web le dit : « Legacy Desktop Solution ». Allons sur la page " Docker Toolbox " et téléchargeons-la. Cet ensemble pèse environ 211 mégaoctets. Nous l'installerons par défaut, c'est-à-dire que nous serons simplement d'accord avec tout sans réorganiser les drapeaux. Après l'installation, nous vérifierons que tout va bien. À l’avenir, notre champ de bataille sera la ligne de commande. Je recommande de ne pas utiliser la ligne de commande Windows, car elle peut entraîner des problèmes non évidents. Il est préférable d'utiliser le shell bash. Sous Windows, le moyen le plus recommandé de l'obtenir est d'installer le système de contrôle de version git , cela sera toujours utile. Parce que « groupé » avec cela sera la fête dont nous avons besoin. Pour cette revue, j'utiliserai git bash. Vous pouvez également installer bash avec CYGWIN . Lançons bash ou git bash. Assurons-nous que nous avons installé la Docker Machine, également appelée Docker Machine : docker-machine -version Qu'est-ce que cette Docker Machine ? Docker Machine est un utilitaire de gestion des hôtes dockerisés (il s'agit d'hôtes sur lesquels Docker Engine est installé). Si nous visualisons les machines Docker immédiatement après l'installation de Docket Toolbox à l'aide de la commande docker-machine ls, nous verrons une liste vide :
Première introduction à Docker - 6
Créons une nouvelle machine. Pour ce faire, nous devons exécuter la commande create :docker-machine create -- driver virtualbox javarush : Nous verrons le journal de création de la machine docker :
Première introduction à Docker - 7
Ce qui nous intéresse ici est le suivant. Qu’est-ce que Boot2Docker ? Il s'agit d'une distribution Linux minimaliste pour exécuter le moteur Docker (nous comprenons que Docker fonctionne grâce aux outils de virtualisation Linux, et dans Windows, le mécanisme nécessaire n'est apparu qu'à partir de Windows 10). Cette distribution est basée sur la distribution " Tiny Core Linux ". Également mentionné à propos de VirtualBox VM. C'est parce que nous l'avons précisé --driver virtualbox. Une nouvelle machine virtuelle a été créée dans VirtualBox à partir de l'image Boot2Docker. Après la création, nous pouvons lancer VirtualBox (puisque VirtualBox est installé avec Docker Toolbox) et voir la machine virtuelle créée pour la machine docker :
Première introduction à Docker - 8
Après la création, nous serons invités à exécuter la commande « docker-machine env » pour obtenir les variables d'environnement qui doivent être configurées pour se connecter à la machine docker :
Première introduction à Docker - 9
Après avoir exécuté cette commande à l'aide de docker-machine, nous nous connectons à un hôte dockerisé distant (dans ce cas, un hôte virtuel hébergé sur Virtual Box) et pouvons exécuter des commandes docker localement comme si nous les exécutions sur un hôte distant. Pour vérifier, nous pouvons exécuter la commande " docker info ". Si la connexion à la machine Docker n'est pas établie, nous recevrons une erreur. Et si tout va bien, des informations sur le docker sur la machine docker. Il est maintenant temps de comprendre comment fonctionne généralement Docker et comment l'utiliser.
Première introduction à Docker - 10

Conteneurs Docker

Nous avons donc Docker. C'est quoi ce docker d'ailleurs ? La documentation Docker et la section « Commencer » nous aideront à comprendre cela . La partie introductive de cette section présente Docker Concepts . Il indique que Docker est une plate-forme permettant de développer, de déboguer et d'exécuter des applications dans des conteneurs. Par conséquent, l’essentiel pour Docker, ce sont les conteneurs. Même si vous regardez le logo du docker, c'est une baleine qui tient des conteneurs sur son dos. Mais qu’est-ce qu’un conteneur ? Ensuite, dans la section " Images et conteneurs ", il est indiqué qu'un conteneur est une instance en cours d'exécution d'Image. Et Image est un « package » qui contient tout le nécessaire à l’application (code, environnement, bibliothèques, paramètres, etc.). Maintenant, essayons nous-mêmes. Le site Web Docker comporte une section intitulée « Exemples Docker » qui comprend « Docker pour les débutants ». Les exemples d'ici me semblent plus intéressants. Nous avons donc soudainement eu envie de nous familiariser avec Alpine Linux et nous pouvons le faire en utilisant des conteneurs Docker. Pour obtenir une image, il faut la « tirer » ou la « retirer ». Par conséquent, nous exécutons la commande docker pull :docker pull apline
Première introduction à Docker - 11
Comme nous pouvons le voir, nous téléchargeons depuis quelque part. Par défaut, Docker consulte son référentiel sur le réseau https://hub.docker.com . Après avoir récupéré avec succès l'image, nous pouvons vérifier la liste des images disponibles en exécutant la commande docker images :
Première introduction à Docker - 12
Nous avons maintenant une image apline. Puisque le conteneur est une instance d’image en cours d’exécution, lançons cette même image. Lançons le conteneur à l'aide de la commande docker run alpine. Comme on le voit, rien ne s'est passé. Si nous exécutons la commande docker pspour afficher tous les conteneurs actifs, nous n'obtiendrons rien non plus. Mais si nous exécutons, docker ps -anous verrons tous les conteneurs :
Première connaissance avec Docker - 13
Le fait est que nous n'avons pas lancé Docker en mode interactif. Par conséquent, il a exécuté l’ordre et s’est arrêté. La commande était d'ouvrir le terminal. Faisons la même chose, mais en mode interactif (avec l' option -it ) :
Première introduction à Docker - 14
Comme vous pouvez le voir, après avoir surmonté une erreur et utilisé l'indice, nous sommes arrivés au conteneur et pouvons y travailler ! Pour quitter le conteneur sans arrêter son fonctionnement, vous pouvez appuyer sur Ctrl + p + q. Si nous exécutons maintenant docker ps, nous verrons un conteneur actif. Pour entrer dans un conteneur déjà en cours d'exécution, exécutez la commande docker exec :
Première connaissance avec Docker - 15
Je recommande de lire la description de l'exemple Docker pour une excellente description de la façon dont tout cela se produit : « 1.0 Exécuter votre premier conteneur ». J'aime ça car tout y est écrit de manière très accessible et compréhensible. Pour reformuler brièvement, nous sommes connectés à l'aide de docker-machine à une machine virtuelle exécutant Docker Daemon. En utilisant la CLI sur l'API REST, nous demandons de lancer l'image alpine. Docker le trouve et ne le télécharge donc pas. Docker crée un nouveau conteneur et exécute la commande que nous avons spécifiée dans ce conteneur. Et tout cela, bien sûr, est bien. Mais pourquoi avons-nous besoin de tout cela ? Et ici, nous devons comprendre comment Docker crée une image. Et il les crée sur la base du fichier docker.
Première introduction à Docker - 16

Fichier Docker

Comme indiqué dans la référence Dockerfile , un dockerfile est un fichier texte qui contient toutes les commandes permettant d'obtenir une image. En fait, toutes les images que nous recevons (même Alpine, de l'exemple ci-dessus) ont été créées à partir d'un fichier docker. Construisons notre image avec une application Java. Et nous avons d’abord besoin de cette application Java. Je suggère d'utiliser le système de construction Gradle, sur lequel vous pouvez en savoir plus dans cette courte revue : « Une brève introduction à Gradle ». Cela nous aidera à créer le projet " Plugin d'initialisation Gradle Build ". Créons une nouvelle application Java à l'aide de Gradle : gradle init --type java-application cette commande crée un modèle de projet Java. Il s'agit d'une application autonome, mais nous aimerions créer une application Web. Supprimons les classes App et AppTest (elles ont été générées automatiquement par Gradle Build Init Plugin). Pour créer rapidement une application web, nous utiliserons le tutoriel de Gradle : « Building Java Web Applications ». D'après le tutoriel, faisons : Il faut être prudent ici. Comme toujours, il peut y avoir des erreurs dans les exemples. C'est ici:
Première introduction à Docker - 17
Maintenant, pour le tester, ajoutons le plugin gretty à build.gradle, comme indiqué dans la section " Ajouter le plugin gretty et exécuter l'application " :
plugins {
    id 'war'
    id 'org.gretty' version '2.2.0'
}
Il est intéressant de noter que Gretty ne voit pas l'erreur dans HelloServlet, décrite ci-dessus. Cela prouve qu'une application peut se comporter différemment dans différents environnements. Gretty peut travailler là où un serveur autonome classique générerait une erreur. Il ne reste plus qu'à vérifier que l'application fonctionne correctement. Faisons:gradle appRun
Première connaissance avec Docker - 18
Si tout va bien, utilisez la commande gradle warpour collecter une archive avec l'extension war (archive Web). Par défaut, Gradle le construit dans le fichier \build\libs. Maintenant, nous sommes prêts à écrire notre fichier docker. En utilisant la « référence Dockerfile », nous allons créer un Dockerfile. Créons un fichier appelé "Dockerfile" à la racine de notre projet Java (au même endroit que le script de build). Ouvrons-le pour l'éditer. Ce fichier possède son propre format, décrit dans la section « Référence Dockerfile : Format ». Tout fichier docker commence par une instruction FROM, indiquant "l'image de base". On peut dire qu'il s'agit de l'image mère à partir de laquelle nous construisons notre image. Il est très simple pour nous de choisir une image parent. Une application Web a besoin d'un serveur Web. Par exemple, nous pouvons utiliser le serveur Web Tomcat. Nous allons au référentiel Docker officiel, appelé docker hub . Nous regardons là-bas pour voir si l'image dont nous avons besoin est là :
Première connaissance avec Docker - 19
Il convient également de comprendre comment s'appelle l'image Tomcat. Mais à part le nom, il y a une étiquette. Une balise est comme une version. Les images Tomcat de différentes versions diffèrent selon la version de Tomcat utilisée, la version de jre et l'image de base. Par exemple, nous pouvons obtenir une image. docker pull tomcat:9-jre8-alpine Elle utilise la version 9 de Tomcat, la version 8 de JRE et l'image alpine comme base. Cela peut être important pour réduire la taille de notre image :
Première introduction à Docker - 20
Comme nous pouvons le constater, la différence est énorme. Si nous construisons notre image basée sur Tomcata Alpine, nous commencerons avec seulement 100 mégaoctets, et non avec 600. En conséquence, nous ajouterons le contenu suivant au fichier docker créé précédemment :
# Базовый образ, "наследуемся" от него
FROM tomcat:9-jre8-alpine
# Копируем из Build Context'а собранный web archive в каталог томката
COPY build/libs/docker.war /usr/local/tomcat/webapps/docker.war
# Меняем рабочий каталог на томкатовский
WORKDIR /usr/local/tomcat
# Открываем порт 8080 для контейнера, т.к. его слушает томкат
EXPOSE 8080
Et maintenant exécutons la commande pour construire l'image : docker build -t jrdocker ..
Première connaissance avec Docker - 21
-t- c'est une balise, c'est-à-dire comment appeler l'image assemblée. Le point à la fin signifie que nous ajoutons le répertoire actuel (le répertoire où se trouve le fichier docker et à partir duquel nous avons exécuté la commande) à Build context. Build context- c'est le contexte de ces fichiers disponibles lors de la création d'un fichier docker. Comme vous pouvez le constater, grâce à cela nous avons pu copier le fichier war assemblé dans notre image, dans le répertoire du serveur web. Maintenant, exécutons notre image :docker run -d --rm -p 8888:8080 jrdocker
Première connaissance avec Docker - 22
Pour comprendre si le serveur a démarré, vous pouvez consulter le journal du conteneur. Le journal peut être obtenu à l'aide de la commande docker logs, en spécifiant le conteneur par son ID ou son nom. Par exemple:
Première connaissance avec Docker - 23
Eh bien, n'oubliez pas que nous pouvons toujours accéder à un conteneur en cours d'exécution par son nom avec la commande : winpty docker exec -it NameКонтейнера sh Il ne reste plus qu'à se connecter. Auparavant, nous spécifiions EXPOSE , c'est-à-dire que nous autorisions l'accès au port 8080 depuis l'intérieur du conteneur. Lorsque nous avons lancé le conteneur lui-même, nous avons spécifié la balise -p ( ports entrants ), corrélant ainsi le port 8080 sur le conteneur (le serveur Web Tomcat y attend les connexions) avec le port 8888 sur une machine avec un démon docker. Si nous nous en souvenons, nous avons lancé le démon docker non pas directement, mais via docker-machine. Par conséquent, demandons à nouveau des données sur nos machines docker à l'aide de la commande docker-machine ls et contactons le serveur dans le conteneur :
Première introduction à Docker - 24
Ainsi, vous et moi venons de lancer notre application web dans un conteneur Docker ! ) Je voudrais également souligner ce qui suit. En cas de problèmes d’accès, rappelez-vous que la machine Docker est avant tout une machine virtuelle Virtual BOx. Il peut y avoir des problèmes avec les paramètres réseau de la machine virtuelle. Une configuration VMBox fonctionnelle pourrait ressembler à ceci :
Première connaissance avec Docker - 25
Première connaissance avec Docker - 26

Couches

Nous avons déjà compris que les images sont créées à partir de fichiers docker et que les fichiers docker sont un ensemble de commandes. Nous avons également découvert qu'un fichier docker avait un parent. Et que la taille des images est différente. Fait intéressant, vous pouvez voir l'historique de la façon dont l'image a été créée à l'aide de la commande docker history . Par exemple:
Première connaissance avec Docker - 27
Il est important de dire cela pour comprendre que, par essence, chaque image est un ensemble d’images. Chaque changement d'image (chaque nouvelle commande dans le fichier docker) crée un nouveau calque qui possède son propre ID. Vous pouvez en savoir plus sur les calques dans la documentation « Docker : Images et calques ». Je recommande également fortement de lire l'article sur Habré : « Images Docker et conteneurs en images ».

Conclusion

J'espère que ce bref aperçu aura suffi à vous intéresser à la conteneurisation. Vous trouverez ci-dessous des liens vers du matériel supplémentaire qui peut être utile : #Viacheslav
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION