Dans ce tutoriel, nous allons examiner l'historique de la conteneurisation, de Docker, de ses composants et comment commencer à l'utiliser dans notre travail quotidien. Mais avant de plonger trop profondément dans le didacticiel, examinons ce qu'est Docker afin de bien comprendre ce avec quoi nous allons travailler..
Docker est une plateforme ouverte permettant de créer, d’expédier et d’exécuter des applications distribuées. Il fournit aux programmeurs, aux équipes de développement et aux ingénieurs d’exploitation la boîte à outils commune dont ils ont besoin pour tirer parti de la nature distribuée et en réseau des applications modernes..
Comme indiqué dans la définition officielle de Docker ci-dessus, il aide les développeurs ou les ingénieurs d'exploitation à automatiser l'environnement d'infrastructure dont les applications ont besoin..
Supposons que vous avez une application écrite dans Node.js qui utilise Express pour le service RESTful et MongoDB pour la persistance des données. Rendons les choses plus complexes et ajoutons plusieurs instances de Node.js et Nginx Load Balancer devant les instances de Node.js..
Ne serait-il pas préférable que j'écrive les étapes d'installation dans un fichier texte et laisse quelqu'un installer tout l'environnement pour moi? Docker vous aide à conteneuriser tous les composants de l’architecture (instance Node.js, serveur Web Nginx, base de données MongoDB, etc.) très facilement..
Cependant, qu'est-ce que la conteneurisation de toute façon? Regardons l'histoire de la technologie de conteneurisation.
Le premier projet de conteneurisation dont je me souvienne est OpenVZ, une virtualisation basée sur le conteneur pour Linux publiée en 2005. OpenVZ vous permet de créer plusieurs conteneurs Linux isolés et sécurisés afin de les exécuter sur le même serveur physique sans aucun conflit entre les applications..
Au même moment, un autre projet de FreeBSD, Jails, est apparu. Cela vous permet de mettre des applications et des services dans une prison (nous pouvons appeler cela un conteneur) en utilisant chroot.
Il y avait d'autres projets comme Solaris Containers, mais pourquoi Docker est-il devenu populaire alors que tous les projets de conteneurisation ci-dessus ont huit ans de plus que Docker? Poursuivez votre lecture pour améliorer vos connaissances sur Docker.
Avant d’expliquer le fonctionnement de Docker, laissez-moi vous expliquer le fonctionnement des conteneurs. Un conteneur est un élément lié à la virtualisation au niveau du système d'exploitation qui nous permet de créer plusieurs espaces utilisateur isolés au lieu d'un seul. Cet isolement est fait en utilisant le chroot
.
La principale différence entre les conteneurs et les ordinateurs virtuels est la suivante. Lorsque vous créez plusieurs machines virtuelles à l'aide de VM, les systèmes d'exploitation et les matériels virtualisés sont dupliqués pour chaque invité. Toutefois, si vous créez plusieurs conteneurs, seuls les dossiers liés à la distribution du système d'exploitation sont créés à partir de zéro, tandis que les parties liées au noyau Linux sont partagées entre les conteneurs. Vous pouvez regarder l'image ci-dessous pour voir la différence de manière visuelle.
Comme vous pouvez également le voir dans le schéma, si vous créez des invités Ubuntu et Mint à l'aide de VM, leur système d'exploitation invité sera dupliqué même s'ils utilisent le même noyau Linux. En réalité, distribution signifie différenciation des bacs et libs dossiers, et le noyau Linux est le même.
Si vous regardez la deuxième image ci-dessus, vous verrez que toute l’architecture de niveau de système d’exploitation est partagée par plusieurs conteneurs, et que seul le bacs et libs sont créés à partir de zéro pour différents conteneurs. Docker Engine a des espaces de noms, groupes de discussion
, et SELinux, et vous aide à organiser les conteneurs. Si vous avez besoin d'informations supplémentaires sur Docker Engine, vous pouvez consulter le site Web de Docker..
Avant de commencer à expliquer les composants, vous pouvez installer Docker sur votre ordinateur. Il a de jolies étapes élémentaires à installer.
Docker a principalement deux composants: Docker Engine et Docker Hub. Comme je l'ai dit plus haut, Docker Engine sert à orchestrer des conteneurs, et Docker Hub est un service SaaS permettant de gérer et de partager des piles d'applications. Par exemple, si vous souhaitez utiliser Redis avec Docker, vous pouvez le récupérer sur votre ordinateur local en exécutant la commande suivante:
docker pull redis
Cela va récupérer toutes les couches de l'image du conteneur et sera prêt à être exécuté sur votre environnement. Vous pouvez consulter Docker Hub pour de nombreux référentiels.
Docker dispose également d’un système de fichiers spécial appelé AUFS (UNEavancé multi-couches Unification File System). Avec ce système, chaque modification de validation est conservée dans des couches, comme le contrôle de version. Si vous apportez une modification à votre image Docker, elle sera conservée dans un commit différent et ne sera pas complètement reconstruite lors de l'opération de génération. Toutes les autres couches sont construites avant.
De plus, lorsque vous extrayez un référentiel sur votre ordinateur local, vous constaterez que l'opération de récupération s'effectue couche par couche. Disons que vous avez apporté une modification et que vous testez votre nouveau conteneur, mais cela échoue. Aucun problème, vous pouvez annuler vos modifications et reconstruire comme vous le faites toujours dans Git.
En supposant que Docker soit déjà installé sur votre ordinateur, nous pouvons commencer avec quelques commandes Docker plutôt chouettes..
docker pull ubuntu docker run -it ubuntu bash
Comme vous pouvez le deviner, la commande ci-dessus va extraire l'image Ubuntu de Docker Hub et l'exécuter suivie de la commande bash.
Vous verrez que vous êtes dans le conteneur après avoir exécuté la commande ci-dessus. Vous êtes maintenant dans le shell Ubuntu et libre d’effectuer des commandes * nix. Vous pouvez créer quelque chose, supprimer quelque chose, voir les processus, etc..
Cependant, soyez prudent, car chaque fois que vous quitterez le conteneur, vos données seront perdues. Pourquoi? Parce que vous devez concevoir vos conteneurs comme immuables.
Commencez par définir quels packages seront inclus, quelles applications seront clonées dans le conteneur, etc., puis exécutez votre conteneur. Chaque fois que vous échouez sur quelque chose, vous devez pouvoir modifier la configuration et exécuter à nouveau. Ne jamais conserver l'état dans vos conteneurs.
Pour exécuter le conteneur, vous pouvez utiliser le format suivant.
exécution du menu fixe [OPTIONS] IMAGE [: TAG | @DIGEST] [COMMAND] [ARG…]
De nombreux paramètres sont disponibles dans Docker pour l'opération d'exécution. Vous pouvez vous reporter à la documentation pour connaître toutes les options, mais je vais vous donner quelques exemples d'utilisation réelle..
docker run -d redis
Cette commande exécutera une image Redis en mode détaché. Cela signifie que toutes les E / S se feront via des connexions réseau ou partagées. Vous pouvez supposer qu'il fonctionne en mode démon. Nous avons dit redis
ici, mais vous pouvez spécifier l'auteur et le tag de l'image en utilisant une commande comme celle ci-dessous.
docker run -d huseyinbabal / mongodb: 1.0
Nous courons un Mongodb
image qui appartient à Huseyinbabal
avec version spécifique 1,0
.
Vous pouvez également exécuter votre image de manière interactive de la manière suivante:
docker run -it huseyinbabal / ubuntu: 1.2 bash
Lorsque vous exécutez la commande ci-dessus, il sera exécuté Ubuntu 1.2
et ensuite exécuter un frapper
commande pour mettre votre invite dans le terminal à l'intérieur du conteneur.
Nous avons exécuté des images extraites du référentiel Docker Hub. Qu'en est-il de construire notre propre image? Nous pouvons le faire en utilisant la commande Docker build, mais nous devons spécifier un Dockerfile
laisser Docker exécuter toutes les instructions définies dans Dockerfile.
D'Ubuntu MAINTAINER Huseyin BABAL RUN apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10 RUN echo "deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen" | tee -a /etc/apt/sources.list.d/10gen.list RUN apt-get update RUN apt-get -y installer apt-utils RUN apt-get -y installer mongodb-10gen RUN echo "certaines configurations" >> /etc/mongodb.conf CMD ["/ usr / bin / mongod", "--config", "/etc/mongodb.conf"]
C'est une définition très simple de Dockerfile qui nous aidera à construire notre image. Dans cette définition de Dockerfile, nous disons tout d'abord que nous hériterons de toutes les propriétés de l'image ubuntu. Cette image sera d'abord récupérée à partir de votre serveur local. S'il ne peut pas être trouvé, sera récupéré à partir de Docker Hub.
Sur la deuxième ligne, nous définissons l'auteur ou le responsable de l'image. Dans les fichiers suivants, nous exécutons simplement certaines commandes * nix avec la commande RUN afin d’installer les packages essentiels et les packages liés à MongoDB. Afin de démarrer MongoDB, nous écrivons mongodb.conf
, et dans la dernière étape, nous exécutons la commande en utilisant CMD
.
Afin d'exécuter notre image, nous devrions construire l'image en utilisant ce fichier Docker. Vous pouvez utiliser ce qui suit pour construire l'image.
docker build -t huseyinbabal / mongodb: 1,0 .
Simplement, cela va construire une image avec une balise huseyinbabal / mongodb: 1,0
et utilisera Dockerfile dans le dossier actuel (voir le point à la fin de la commande). Afin de tester s'il est créé ou non, vous pouvez utiliser la commande suivante.
images de docker
Ceci listera toutes les images qui existent sur votre ordinateur comme ci-dessous.
Si vous souhaitez exécuter une image construite, vous pouvez simplement exécuter:
docker run -d huseyinbabal / mongodb: 1.0
Mais attendez! C'est un noeud démon. Alors, comment puis-je entrer dans ce conteneur? C'est très simple. Commencez par obtenir le nom du nom du conteneur mongodb en utilisant la commande suivante.
docker ps
Vous verrez une sortie comme ci-dessous.
Vous pouvez voir le nom dans la colonne NOMS. Maintenant il est temps d'aller dans le conteneur avec la commande suivante.
docker exec -i -tfrapper
Vous pouvez voir les processus en cours dans ce conteneur.
Comme je l'ai dit précédemment, si vous fermez le conteneur en cours d'exécution, toutes les données relatives à ce conteneur seront perdues. C'est normal dans le monde Docker.
Par exemple, dans notre conteneur, MongoDB écrit toutes les données d’un chemin spécifié dans le fichier mongodb.conf. Ce dossier existe dans le conteneur et si vous le fermez, toutes les données seront perdues. Si vous conservez les données dans un dossier partagé avec un ordinateur hôte exécuté par Docker, vous pouvez utiliser le -v
option à l'intérieur du courir
commander. Par exemple:
docker run -d -v / host / mongo_data_path: / conteneur / mongo_data_path huseyinbabal / mongodb: 1.0
Cela va cartographier /host / mongo_db_path
qui est dans votre machine hôte à /container / mongo_data_path
qui est dans le conteneur. Chaque fois que mongo écrit des données sur le chemin à l'intérieur du conteneur, elles seront automatiquement accessibles à l'intérieur de la machine hôte. Même si vous fermez le conteneur, les données resteront dans le chemin à l'intérieur de la machine hôte..
Disons que MongoDB s'exécute à l'intérieur du conteneur. Vous pouvez exposer le port MongoDB en dehors du conteneur sur le port 27017 et utiliser la commande suivante pour accéder de l'extérieur au conteneur avec le port 5000..
docker run -d -P 5000: 27017 -v / host / mongo_data_path: / conteneur / mongo_data_path huseyinbabal / mongodb: 1.0
Vous pouvez donc vous connecter à MongoDB à l'intérieur du conteneur de l'extérieur en utilisant le port 5000.
Supposons que vous ayez besoin des informations réseau du conteneur spécifié. Vous pouvez saisir ce détail en utilisant le docker inspecter
commander. Cette commande imprimera beaucoup de métadonnées sur le conteneur..
est la partie qui existe dans CONTENANT ID
dans le docker ps
sortie. La sortie de l'inspection sera au format JSON. Pour obtenir l'adresse IP du conteneur, vous pouvez utiliser:
docker inspect --format '.NetworkSettings.IPAddress'
Les commandes ci-dessus sont les commandes de base pendant que vous effectuez des tâches Docker. Si vous souhaitez en savoir plus sur les commandes Docker, veuillez vous reporter à la documentation..
Il est recommandé d’accorder une seule responsabilité à chaque conteneur. Ce que je veux dire, c’est que vous ne devriez pas installer d’applications MongoDB et Spring Boot dans un seul conteneur pour servir les couches DB et Application dans un seul conteneur. Au lieu de cela, vous pouvez mettre une application dans un conteneur. Chaque instance d'application, membre de base de données, file de messages, etc., ne doit indiquer qu'un seul conteneur..
Disons que vous mettez les couches d'application et de base de données dans un conteneur. Il sera très difficile de mesurer les performances ou les diagnostics de l’application ou de la base de données. De la même manière, si vous souhaitez redimensionner votre application, vous ne pourrez pas redimensionner ce conteneur, car une application de base de données est également installée dans ce conteneur..
Lorsque vous exécutez votre conteneur, ne jamais ssh dans ce conteneur pour mettre à jour ou supprimer quelque chose. La principale raison d'utiliser Docker est de conserver l'historique de vos modifications dans Dockerfile. Si vous souhaitez modifier quelque chose, changez Dockerfile, générez l'image et exécutez le conteneur. Même si vous modifiez manuellement quelque chose dans le conteneur, il sera supprimé si ce conteneur est réexécuté..
Normalement, vous pouvez écrire chaque commande sur des lignes séparées, comme ci-dessous.
DE ubuntu MAINTAINER Huseyin BABAL Exécuter apt-get update Exécuter apt-get installer -y build-essential Exécuter apt-get installer -y php5 Exécuter apt-get installer -y nginx CMD ["nginx", "g", "démon désactivé; "] EXPOSE 80
Cela signifie un calque pour chaque ligne. Ce n'est pas une façon suggérée de construire Dockerfile. Vous pouvez séparer vos commandes avec une barre oblique inverse (\) pour chaque groupe de tâches, comme ci-dessous:
DE Ubuntu: 15.04 ENTRETIEN Huseyin BABAL RUN apt-get update \ -y build-essential -y php5 \ -y nginx = 1.7.9 \ apt-get clean CMD ["nginx", "g", "démon éteint;"] EXPOSE 80
Dans le fichier Docker ci-dessus, nous avons prévu d’installer les packages requis sur une ligne et avons effectué une nettoyer
opération pour rendre l'environnement propre. En faisant cela, nous n'avons pas créé de couches séparées pour chaque commande..
Construire et gérer un conteneur est très simple. Après deux mois, vous pouvez vous retrouver avec 50 conteneurs pour votre architecture d'application! Il sera très difficile de trouver la cause première d’un problème si une erreur se produit dans vos conteneurs..
Le moyen le plus simple consiste à consigner vos activités de conteneur dans un système de journalisation central. Par exemple, redirigez vos journaux stdout vers un fichier journal à l'intérieur de chaque conteneur. Et un agent peut transmettre le contenu de ces journaux à un système de gestion des journaux central tel que ELK ou Splunk. Si vous envoyez des données spécifiques au conteneur dans les journaux, par exemple l'ID du conteneur, il sera très facile de filtrer les erreurs sur le tableau de bord de gestion des journaux..
Vous voudrez peut-être surveiller le conteneur lui-même. Cette fois, vous pouvez jeter un oeil à Google cadvisor. Cela vous permet de surveiller votre conteneur via un service REST. Par exemple, pour voir les informations sur le conteneur, vous pouvez envoyer une requête GET à http: // nom_hôte
/api/v1.0/containers/
.
Si vous appliquez des procédures standard à votre cycle de vie de conteneur, il sera très facile de contrôler votre architecture globale. Par exemple, vous pouvez créer un conteneur de base pour hériter de certaines opérations à l'intérieur d'autres conteneurs. D'autre part, vous pouvez utiliser des emplacements standard pour les fichiers de configuration, les fichiers journaux et les fichiers source. Veillez à utiliser un fichier Dockerfile distinct pour chaque conteneur. Enfin, appliquez le contrôle de version à tous vos conteneurs pour séparer les fonctionnalités et utilisez différentes versions en fonction de vos besoins..
La sécurité est un sujet très important dans le cas des conteneurs. Toujours exécuter vos conteneurs en mode non privilégié. Je vous suggère d'utiliser Apparmor pour protéger votre conteneur contre les threads externes, même les attaques du jour zéro. Je suggère également à SELinux pour vos conteneurs d’appliquer des politiques de sécurité du contrôle d’accès en fonction de vos besoins. Suivez également les mises à jour des images que vous utilisez dans les conteneurs pour appliquer les derniers correctifs au conteneur. Ce faisant, n'oubliez pas d'épingler votre image sur une version stable.
Modulus est une plate-forme de déploiement et d'orchestration d'entreprise entièrement prise en charge. Ils ont commencé par utiliser une PaaS centrée sur Node.js au-dessus de LXC, puis ont décidé de passer à Docker, ce qui leur a permis de prendre en charge plusieurs langages différents de Node.js, à savoir PHP, Java, Python et Static..
En prenant en charge les langues, je veux dire que vous pouvez déployer votre application écrite dans les langues ci-dessus sur Modulus avec une seule commande avec des propriétés prédéfinies. Disons que vous allez déployer une application Node.js sur Modulus et que la seule chose à faire est d’exécuter module déployer
dans le dossier racine de votre projet. Le module comprend les composants suivants.
Modulus CLI est destiné à l’opération de déploiement de votre application à partir de la ligne de commande et peut être installé simplement avec npm install -g module
. Vous pouvez créer des projets, déployer des projets, créer des journaux de flux et effectuer certaines opérations liées à la base de données avec Modulus CLI. Alternativement, vous pouvez déployer votre projet en téléchargeant via le panneau d'administration.
Vous pouvez créer et déployer votre application en quelques étapes simples. Vous pouvez sélectionner la langue, la taille du servo et l'emplacement. Alors préparez-vous à déployer votre projet.
Vous pouvez également créer un projet sur la ligne de commande avec projet de module créer
et alors module déployer
.
Vous souhaiterez peut-être stocker des données dans votre application. Modulus vous permet également d'ajouter une base de données à votre application. MongoDB est utilisé dans les coulisses. Vous pouvez créer une base de données dans le tableau de bord et créer une base de données sur la ligne de commande. Vous pouvez voir l'écran de base de données ci-dessous.
Vous pouvez saisir l'URL de la base de données sur l'écran de détail et l'utiliser dans vos applications..
Vous pouvez afficher les journaux d’application à partir de la ligne de commande avec module de journalisation queue
, ou vous pouvez diffuser des journaux sur le tableau de bord comme ci-dessous.
Lorsque vous cliquez sur le COURANT bouton, vous pouvez voir les journaux en temps réel.
Ce sont les composants principaux de Modulus. Vous pouvez jeter un oeil à d'autres composants comme Métrique, Mise à l'échelle automatique, Addons, Les notifications, et Administration sur le tableau de bord du module.
Nous avons discuté des conteneurs et donné un bref historique. Comparé aux ordinateurs virtuels, Docker offre de nombreuses alternatives pour gérer votre infrastructure applicative..
Si vous utilisez Docker pour votre architecture, vous devez faire attention à certains concepts, tels que la responsabilité unique, les serveurs immuables, la sécurité, la surveillance des applications et des conteneurs..
Lorsque votre système s'agrandit, il sera très facile à contrôler. Modulus est l'une des sociétés qui utilise Docker pour son système PaaS. En utilisant la puissance de Docker, Modulus a conçu un excellent système pour aider les utilisateurs à déployer très facilement leurs applications écrites en Node.js, PHP, Java et Python..