Docker, qu'est-ce que c'est et quel est le but

111

J'ai entendu parler de Docker il y a quelques jours et je voulais en parler.

Mais en fait, je ne sais pas à quoi sert ce "conteneur"?

Qu'est-ce qu'un conteneur?

Peut-il remplacer une machine virtuelle dédiée au développement?

Quel est le but, en termes simples, d'utiliser Docker dans les entreprises? L'avantage principal?

mfrachet
la source
Je trouve ça plus facile shivab.com/blog/docker/2019/01/10/…
illusionniste

Réponses:

116

VM: À l'aide du logiciel VM, par exemple, Ubuntu peut être installé dans un Windows. Et ils courraient tous les deux en même temps. C'est comme construire un PC, avec ses composants de base comme le CPU, la RAM, les disques, les cartes réseau, etc., dans un système d'exploitation et les assembler pour fonctionner comme s'il s'agissait d'un vrai PC. De cette façon, le PC virtuel devient un "invité" à l'intérieur d'un PC réel qui avec son système d'exploitation, qui est appelé un hôte.

Conteneur: C'est le même que ci-dessus mais au lieu d'utiliser un système d'exploitation entier, il a réduit les composants "inutiles" du système d'exploitation virtuel pour en créer une version minimale. Cela a conduit à la création de LXC (Linux Containers), plus rapide que les machines VM.

Docker: un conteneur Docker , contrairement à une machine virtuelle et à un conteneur, ne nécessite ni n'inclut un système d'exploitation séparé. Au lieu de cela, il s'appuie sur les fonctionnalités du noyau Linux et utilise l'isolation des ressources.
Objectif de Docker: Son objectif principal est d'automatiser le déploiement d'applications à l'intérieur de conteneurs logiciels et l'automatisation de la virtualisation au niveau du système d'exploitation sous Linux. Il est plus léger que les conteneurs standard et démarre en quelques secondes. ggg

(Notez qu'il n'y a pas de système d'exploitation invité requis dans le cas de Docker)

JerryGoyal
la source
1
J'ai essayé de rechercher des ressources concernant le flux de travail de développement-déploiement de docker, mais je ne trouve rien. Donnons par exemple j'ai un environnement de lampe avec laravel + angular4. Dois-je partager un certain fichier avec mes coéquipiers? Comment modifier la source de l'application (php html js / ts) si je la mets dans un conteneur? Pouvons-nous toujours utiliser git / svn sur notre code source?
anaval
13
VM signifie «machine virtuelle». Inutile de l'appeler "VM Machine" car elle devient alors "Virtual machine machine". :)
Dzhuneyt
32

[Notez que cette réponse se concentre sur les conteneurs Linux et peut ne pas s'appliquer entièrement à d'autres systèmes d'exploitation. ]

Qu'est-ce qu'un conteneur?

C'est une application : un conteneur est un moyen d'exécuter des applications isolées les unes des autres. Plutôt que de virtualiser le matériel pour exécuter plusieurs systèmes d'exploitation, les conteneurs reposent sur la virtualisation du système d'exploitation pour exécuter plusieurs applications. Cela signifie que vous pouvez exécuter plus de conteneurs sur le même matériel que les machines virtuelles, car vous n'avez qu'une seule copie du système d'exploitation en cours d'exécution et vous n'avez pas besoin de préallouer la mémoire et les cœurs de processeur pour chaque instance de votre application. Comme toute autre application, lorsqu'un conteneur a besoin du processeur ou de la mémoire, il les alloue, puis les libère une fois terminé, permettant à d'autres applications d'utiliser ces mêmes ressources limitées plus tard.

Ils tirent parti des espaces de noms du noyau : chaque conteneur recevra par défaut un environnement dans lequel les espaces de noms suivants sont:

  • Monter: les systèmes de fichiers, /dans le conteneur seront différents de ceux /de l'hôte.
  • PID: identifiant de processus, pid 1 dans le conteneur est votre application lancée, ce pid sera différent lorsqu'il est visualisé depuis l'hôte.
  • Réseau: les conteneurs fonctionnent avec leur propre interface de bouclage (127.0.0.1) et une adresse IP privée par défaut. Docker utilise des technologies telles que les réseaux de pont Linux pour connecter plusieurs conteneurs ensemble dans leur propre réseau local.
  • IPC: communication interprocessus
  • UTS: cela inclut le nom d'hôte
  • Utilisateur: vous pouvez éventuellement décaler tous les identifiants utilisateur pour qu'ils soient décalés de celui de l'hôte

Chacun de ces espaces de noms empêche également un conteneur de voir des éléments tels que le système de fichiers ou les processus sur l'hôte, ou dans d'autres conteneurs, sauf si vous supprimez explicitement cet isolement.

Et d'autres outils de sécurité Linux : les conteneurs utilisent également d'autres fonctionnalités de sécurité telles que SELinux, AppArmor, Capabilities et Seccomp pour empêcher les utilisateurs à l'intérieur du conteneur, y compris l'utilisateur root, de pouvoir s'échapper du conteneur ou d'avoir un impact négatif sur l'hôte.

Empaquetez vos applications avec leurs dépendances pour la portabilité : l'empaquetage d'une application dans un conteneur implique d'assembler non seulement l'application elle-même, mais toutes les dépendances nécessaires pour exécuter cette application, dans une image portable. Cette image est le système de fichiers de base utilisé pour créer un conteneur. Parce que nous isolons uniquement l'application, ce système de fichiers n'inclut pas le noyau et les autres utilitaires du système d'exploitation nécessaires pour virtualiser un système d'exploitation entier. Par conséquent, une image pour un conteneur doit être nettement plus petite qu'une image pour une machine virtuelle équivalente, ce qui accélère le déploiement sur les nœuds du réseau. En conséquence, les conteneurs sont devenus une option populaire pour le déploiement d'applications dans le cloud et les centres de données distants.

Peut-il remplacer une machine virtuelle dédiée au développement?

Cela dépend : si votre environnement de développement exécute Linux et que vous n'avez pas besoin d'accéder à des périphériques matériels, ou qu'il est acceptable d'avoir un accès direct au matériel physique, vous trouverez une migration vers un conteneur Linux assez simple. La cible idéale pour un conteneur Docker sont des applications telles que les API basées sur le Web (par exemple, une application REST), auxquelles vous accédez via le réseau.

Quel est le but, en termes simples, d'utiliser Docker dans les entreprises? L'avantage principal ?

Dev ou Ops : Docker est généralement introduit dans un environnement selon l'un des deux chemins. Les développeurs recherchant un moyen de développer et de tester localement plus rapidement leur application, et les opérations cherchant à exécuter plus de charge de travail sur moins de matériel que ce qui serait possible avec des machines virtuelles.

Ou Devops : L'une des cibles idéales est de tirer parti de Docker immédiatement à partir de l'outil de déploiement CI / CD, en compilant l'application et en créant immédiatement une image qui est déployée pour le développement, le CI, la production, etc. Les conteneurs réduisent souvent le temps de déplacement de l'application depuis l'enregistrement du code jusqu'à ce qu'il soit disponible pour les tests, ce qui rend les développeurs plus efficaces. Et lorsqu'elle est conçue correctement, la même image qui a été testée et approuvée par les développeurs et les outils CI peut être déployée en production. Étant donné que cette image inclut toutes les dépendances de l'application, le risque de rupture de la production qui a fonctionné en développement est considérablement réduit.

Évolutivité : un dernier avantage clé des conteneurs que je mentionnerai est qu'ils sont conçus pour une évolutivité horizontale à l'esprit. Lorsque vous avez des applications sans état sous une charge importante, les conteneurs sont beaucoup plus faciles et plus rapides à mettre à l'échelle en raison de leur taille d'image plus petite et de leur surcharge réduite. Pour cette raison, vous voyez des conteneurs utilisés par de nombreuses grandes entreprises basées sur le Web, telles que Google et Netflix.

BMitch
la source
2
+1 Je suis entièrement d'accord avec votre réponse, en particulier avec la partie "peut-elle remplacer la ou les machines virtuelles". Je vois beaucoup de commentaires ailleurs soulignant que Docker n'est pas une machine virtuelle, mais, par expérience, pour de nombreux cas d'utilisation, cela fonctionne aussi bien ou même une meilleure alternative. Que voulez-vous dire quand vous dites "acceptable d'avoir un accès direct au matériel physique"?
Tyress
2
@tyress si votre hôte est Linux, vous pouvez monter des périphériques directement dans un conteneur Linux. Je l'ai vu faire avec des périphériques audio, mais tout ce qui se trouve dans / dev peut être ajouté. Cela contourne certains isolements de conteneurs, mais est logique pour des tâches spécifiques telles que les applications de bureau.
BMitch
c'est étonnant. Je n'avais pas pensé à cela.
Tyress
@BMitch: réponse très propre et élégante, merci !! Je pense que je peux maintenant visualiser ce qu'est le conteneur ... Cependant, ce serait formidable si vous pouviez mettre à jour votre réponse avec comment le conteneur est lié à docker? En comparaison du conteneur et de la machine virtuelle, docker est-il équivalent à l'hyperviseur?
rahulaga_dev
1
Docker est un outil qui implémente des conteneurs, tout en fournissant le reste de l'écosystème nécessaire, comme le registre sur le hub docker et les environnements de bureau qui intègrent une machine virtuelle pour exécuter des conteneurs Linux.
BMitch
6

Les mêmes questions me frappaient la tête il y a quelques jours et ce que j'ai trouvé après y être entré, comprenons avec des mots très simples.

Pourquoi penser au docker et aux conteneurs alors que tout semble bien avec le processus actuel d'architecture et de développement d'applications !!

Prenons un exemple que nous développons une application utilisant les services nodeJs, MongoDB, Redis, RabbitMQ etc [vous pouvez penser à tous les autres services].

Maintenant, nous faisons face à ces choses suivantes comme des problèmes dans le développement d'applications et le processus d'expédition si nous oublions l'existence de docker ou d'autres alternatives d'applications de conteneurisation.

  1. Compatibilité des services (nodeJs, mongoDB, Redis, RabbitMQ, etc.) avec le système d'exploitation (même après avoir trouvé des versions compatibles avec le système d'exploitation, si quelque chose d'inattendu se produit lié aux versions, nous devons à nouveau rechercher la compatibilité et corriger cela).

  2. Si deux composants système nécessitent une bibliothèque / dépendance avec différentes versions dans l'application dans le système d'exploitation (cela nécessite un relookage à chaque fois en cas de comportement inattendu de l'application en raison d'un problème de version de bibliothèque et de dépendance).

  3. Plus important encore, si une nouvelle personne rejoint l'équipe, nous trouvons très difficile de configurer le nouvel environnement, la personne doit suivre un grand nombre d'instructions et exécuter des centaines de commandes pour enfin configurer l'environnement Et cela prend du temps et des efforts.

    Les gens doivent s'assurer qu'ils utilisent la bonne version du système d'exploitation et vérifier la compatibilité des services avec le système d'exploitation, et chaque développeur doit le suivre à chaque fois lors de la configuration.

  4. Nous avons également différents environnements comme le développement, le test et la production.Si un développeur est à l'aise avec un système d'exploitation et l'autre est à l'aise avec un autre système d'exploitation Et dans ce cas, nous ne pouvons pas garantir que notre application se comportera de la même manière dans ces deux situations différentes .

Tout cela nous complique la vie dans le processus de développement , de test et d' expédition des applications.

Nous avons donc besoin de quelque chose qui gère les problèmes de compatibilité et nous permet d'apporter des changements et des modifications dans n'importe quel composant du système sans affecter les autres composants.

Maintenant, nous pensons à docker car son but est de conteneuriser les applications et d'automatiser le déploiement des applications et de les expédier très facilement.

entrez la description de l'image ici

Comment docker résout les problèmes ci-dessus

  1. Nous pouvons exécuter chaque composant de service (nodeJs, MongoDB, Redis, RabbitMQ) dans différents conteneurs avec ses propres dépendances et bibliothèques dans le même système d'exploitation mais avec des environnements différents.

  2. Nous devons simplement exécuter la configuration docker une fois, puis tous les développeurs de notre équipe peuvent commencer avec une simple commande docker run, nous avons économisé beaucoup de temps et d'efforts ici :) .

Les conteneurs sont donc des environnements isolés avec toutes les dépendances et bibliothèques regroupées avec leurs propres interfaces et montages de processus et de réseau .

Tous les conteneurs utilisent les mêmes ressources du système d'exploitation, par conséquent, ils prennent moins de temps pour démarrer et utiliser efficacement le processeur avec moins de coûts matériels.

J'espère que ce serait utile.

Siyaram Malav
la source
2

Laissez-moi essayer de fournir des réponses aussi simples que possible:

Mais en fait, je ne sais pas à quoi sert ce "conteneur"?

Qu'est-ce qu'un conteneur?

En termes simples: un package contenant un logiciel . Plus précisément, une application et toutes ses dépendances regroupées. Un environnement d'application standard non dockerisé est directement relié au système d'exploitation, tandis qu'un conteneur Docker est une couche d'abstraction du système d'exploitation.

Et un conteneur diffère d'une image en ce qu'un conteneur est une instance d'exécution d'une image - similaire à la façon dont les objets sont des instances d'exécution de classes au cas où vous seriez familiarisé avec la POO.

Peut-il remplacer une machine virtuelle dédiée au développement?

Les VM et les conteneurs Docker sont des techniques de virtualisation, en ce sens qu'ils fournissent une abstraction en plus de l'infrastructure système.

Une machine virtuelle exécute un système d'exploitation «invité» complet avec un accès virtuel aux ressources hôte via un hyperviseur. Cela signifie que la machine virtuelle fournit souvent à l'environnement plus de ressources qu'il n'en a réellement besoin. En général, les machines virtuelles fournissent un environnement avec plus de ressources que la plupart des applications n'en ont besoin. Par conséquent, les conteneurs sont une technique plus légère. Les deux résolvent des problèmes différents.

Quel est le but, en termes simples, d'utiliser Docker dans les entreprises? L'avantage principal?

La conteneurisation va de pair avec les microservices. Les petits services qui composent la plus grande application sont souvent testés et exécutés dans des conteneurs Docker. Cela facilite les tests continus.

De plus, comme les conteneurs Docker sont en lecture seule, ils appliquent un principe DevOps clé: les services de production doivent rester inchangés

Quelques avantages généraux de leur utilisation:

  • Grand isolement des services
  • Grande facilité de gestion car les conteneurs contiennent tout ce dont l'application a besoin
  • Encapsulation de la technologie de mise en œuvre (dans les conteneurs)
  • Utilisation efficace des ressources (grâce à la virtualisation légère du système d'exploitation) par rapport aux VM
  • Déploiement rapide
Joël H
la source