Docker, k8s sortira dans le sujet de 42tokyo, alors je l'ai étudié et résumé.
Il n'y a pas d'explication sur le concept de base, donc c'est bien d'avoir un peu touché docker.
Logiciel de conteneur open source développé par Docker.
L'idée de base est la même que celle du "package" Linux.
À l'origine, lorsque Linux apportait un logiciel open source, il installait le code source, le compilait localement et l'utilisait. C'est comme apporter du code comme celui sur github maintenant, le créer et l'utiliser. (Référence: https://eng-entrance.com/linux-package-apt-2)
Le noyau Linux lui-même est également publié en tant que code source et doit être compilé. En outre, diverses bibliothèques sont nécessaires pour faire fonctionner les programmes d'application tels que les serveurs, les applications et les systèmes de fenêtres. Cependant, le travail de construction et d'exploitation d'un tel environnement à partir de zéro est extrêmement compliqué, il n'est donc pas réaliste pour les utilisateurs qui souhaitent utiliser Linux de l'exécuter un par un.
Pour cette raison, de nombreuses distributions Linux ont été créées. Une distribution Linux est une collection de noyaux Linux, de bibliothèques, de logiciels système, de logiciels d'application, etc. sous forme de «packages».
** distribution linux = noyau linux + diverses bibliothèques **
De cette manière, l'idée d'un "package" qui peut être utilisé immédiatement après l'installation de l'état compilé avec les dépendances, s'est répandue. La commande linux apt est une commande du système de gestion de paquets
L'image du conteneur est empaquetée au niveau du système d'exploitation. Si vous apportez une image et construisez (créez un conteneur), vous pouvez créer un environnement dans lequel l'application que vous souhaitez exécuter s'exécutera immédiatement.
Jusque-là, des problèmes s'étaient produits dans les environnements de développement, les environnements de test et les environnements de production en raison de petites différences telles que des différences dans les versions d'environnement, mais maintenant l'environnement peut être empaqueté et partagé au niveau du système d'exploitation. C'est devenu plus facile.
Étant donné que l'environnement (système d'exploitation et bibliothèques dépendantes) dans lequel l'application s'exécute est empaqueté, il est pratique qu'il n'y ait pas de dépendances et qu'il n'y ait pas besoin de l'installer ailleurs.
Il existe également un service appelé Dockerhub comme github qui partage des images.
La "virtualisation" divise le processeur et la mémoire installés dans le matériel en petits morceaux et les fait fonctionner comme plusieurs serveurs indépendants individuels. Le serveur apparent créé de cette manière est appelé une "machine virtuelle". Il devient un environnement d'exécution d'application complètement isolé.
Il existe deux types de virtualisation: la virtualisation de type OS hôte, la virtualisation de type hyperpaiser effectuée à l'aide d'un logiciel appelé hyperviseur et la virtualisation de type conteneur.
L'avantage de la virtualisation basée sur des conteneurs est qu'elle partage le noyau du système d'exploitation, mais les processus et les ressources sont complètement isolés. Il semble que les fonctions suivantes soient utilisées dans le moteur de conteneur.
--namelary ・ ・ ・ Une fonction fournie par le noyau Linux qui divise logiquement les ressources système. --cgroup ・ ・ ・ Technologie pour contrôler l'utilisation des ressources du processus --chroot ・ ・ ・ Une fonction qui sépare les fichiers en modifiant le répertoire racine afin que les répertoires de niveaux supérieurs ne puissent pas être utilisés.
Référence: Docker à comprendre en principe
En premier lieu, la seule image du système d'exploitation que docker peut apporter est la distribution Linux.
Contrairement à VM, il n'y a pas de système d'exploitation invité dans le conteneur. Alors comment réaliser cet OS? ??
En fait, cela fonctionne comme ça tout en utilisant le noyau du système d'exploitation hôte. Référence: https://thinkit.co.jp/article/17301
Le système inux a le même noyau, la seule différence est la bibliothèque (= compatibilité linux) Ainsi, en installant simplement la bibliothèque, vous pouvez la faire fonctionner comme si le système d'exploitation était installé. ** ** Les systèmes d'exploitation qui sont complètement différents, tels que Unix et Windows, ont des parties de noyau complètement différentes, vous ne pouvez donc pas apporter d'image.
À partir de la méthode de fabrication ci-dessus
e? Mais vous pouvez développer avec docker même sur Mac ou Windows, non? Tu ne penses pas Vous pouvez l'utiliser en installant une application appelée Docker pour mac ou Docker pour Windows.
En fait, il semble que ce soit ** un moteur docker au-dessus de ** Linux VM **. Donc, inévitablement, l'environnement de production sera Linux.
Vous pouvez désormais transporter un environnement basé sur Linux dans n'importe quel environnement et développer et tester dans n'importe quel environnement.
Un conteneur est juste un ** processus contrôlé par un moteur de conteneur sur le système d'exploitation hôte **. (Un processus est un programme en cours d'exécution.)
Par conséquent, il sera terminé dès que le travail sera terminé. C'est pourquoi le démon est désactivé ou continue de fonctionner dans une boucle infinie, tout comme le conteneur continue de fonctionner.
Comme il ne s'agit que d'un processus, il est très léger et peut gérer plusieurs conteneurs (= processus) en même temps comme un processus Unix.
C'est pourquoi la commande est ps ou kill.
Il a été réalisé comme un processus en séparant et en gérant les processus, les ressources système, les privilèges, etc. en utilisant pleinement les fonctions de Linux, et il n'a pas utilisé autant de nouvelles technologies.
Depuis que j'ai expliqué le mécanisme du conteneur, le mécanisme de l'image est également facile.
L'image est un concept abstrait avec seulement la définition de «se comporter comme ça». En termes de programmation, la relation entre une image et un conteneur est similaire à une classe et une instance. Lorsque vous exécutez l'image, un conteneur est créé et en partageant l'image, vous pouvez créer le même environnement à différents endroits.
Les images ne sont pas constituées de fichiers, mais ** d'une structure en couches d'images avec de multiples «différences» **.
Il semble que UFS (Union File System), une technologie qui empile plusieurs fichiers et répertoires sous forme de couches et les traite pratiquement comme un seul système de fichiers, est utilisée.
La commande docker history
est facile à comprendre pour comprendre la structure de l'image.
À titre de test, apportons l'image de centos, réécrivons-la et voyons-la avec deux changements (couches) ajoutés.
J'essaye d'imaginer le chiffre ci-dessus. J'ai apporté des modifications telles que la saisie de centos et la création d'un fichier, la saisie et la création d'un fichier, et je les ai sauvegardées sous forme d'image. (Commande omise)
Vérifiez la structure des calques de l'image avec la commande docker history
!
Certes, on peut voir que ceux qui partagent le calque d'image et apportent des modifications deux fois ont un calque de plus.
$ docker image history centos-1
IMAGE CREATED CREATED BY SIZE COMMENT
f83fd832b2b7 21 minutes ago bash 13B
0d120b6ccaa8 3 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 3 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 3 months ago /bin/sh -c #(nop) ADD file:538afc0c5c964ce0d… 215MB
$ docker image history centos-2
IMAGE CREATED CREATED BY SIZE COMMENT
7318feb4e1e5 20 minutes ago bash 26B
f83fd832b2b7 21 minutes ago bash 13B
0d120b6ccaa8 3 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 3 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 3 months ago /bin/sh -c #(nop) ADD file:538afc0c5c964ce0d… 215MB
Vous pouvez voir comment le registre gère l'image en la poussant vers dockerhub.
Je l'ai changé parce que je dois changer le nom comme username / image-name: tag
pour pousser.
De cette façon, vous pouvez voir que seules les informations citées à partir d'autres référentiels et la différence entre eux sont transmises.
$ docker image push momokahori124/mycentos
d61c8d8ef622: Pushed
e955d24fd305: Pushed
291f6e44771a: Mounted from library/centos
v1: digest: sha256:ae16ff8c612176dd9314c61cb906d9d6ebaa29ce0aff49fbc090f57b1c8af1dc size: 943
Le bon point est que vous pouvez enregistrer beaucoup de données en faisant de l'image une structure en couches de différences. J'ai l'impression que git a également été géré par la différence, mais est-ce la même méthode?
Référence: Tutoriel visant à comprendre les images Docker
Expliquez les avantages de Docker et créez une image qui ne compromet pas les avantages.
J'ai expliqué le mécanisme du conteneur et le mécanisme de l'image. Ensuite, nous résumerons de l'opération docker à docker-compose et k8s.
Il existe trois façons de créer une image Docker.
Une fois que vous avez une image de votre application en cours d'exécution pendant le développement, vous pouvez la pousser vers Dockerhub et la partager. À ce stade, il est important de créer une image afin de ne pas nuire aux avantages de docker.
** L'environnement peut être emballé ** L'avantage est que l'environnement peut être emballé et peut être utilisé dans n'importe quel environnement. Veillez donc à ne pas utiliser de variables dépendantes de l'environnement et à créer des images / Dockerfiles indépendants de l'environnement.
** L'infrastructure peut être codée **
L'avantage est que l'infrastructure devient visible. Par conséquent, vous devez ** adopter activement le Dockerfile ** et éviter de créer et de partager une image dont la façon dont elle a été créée est inconnue, telle que l'image créée par la commande commit. Il est recommandé de travailler à l'intérieur du conteneur et de remplir le Dockerfile lorsque vous êtes à mi-chemin → créer un nouveau conteneur. Fondamentalement, il semble que le conteneur créé est essentiellement rejeté lorsqu'il est épuisé.
Si vous ajoutez l'option --rm
à la exécution du conteneur docker
, elle sera détruite immédiatement lorsque le conteneur sera arrêté.
** Le micro service facilite le changement et la maintenance ** Si vous créez une image volumineuse, les ** dépendances qu'elle contient deviendront floues ** et il sera difficile de la modifier. En configurant plusieurs conteneurs, il est possible de créer un service résistant aux modifications. En gros, créez un conteneur et un processus (il est préférable de le gérer comme une application multi-conteneur avec docker-compose).
En résumé, partagez-le dans un Dockerfile, rendez le conteneur jetable et utilisez autant que possible des conteneurs séparés.
Il est important de bien utiliser les variables d'environnement et de créer une image qui ne dépend pas de l'environnement.
continue...
Recommended Posts