Les conteneurs Docker sont à la hausse en tant que pratique recommandée pour le déploiement et la gestion de systèmes répartis en nuage. Les conteneurs sont des instances d'images Docker. Il s'avère qu'il y a beaucoup de choses à savoir et à comprendre sur les images.
Dans ce didacticiel en deux parties, je vais couvrir les images Docker en profondeur. Dans la première partie, j'ai abordé les principes de base, les considérations de conception et l'inspection des éléments internes de l'image. Dans cette partie, je traite de la création de vos propres images, du dépannage et de l’utilisation des référentiels d’images..
Lorsque vous vous présenterez de l'autre côté, vous aurez une solide compréhension de ce que sont exactement les images Docker et de la manière de les utiliser efficacement dans vos propres applications et systèmes..
Il y a deux façons de construire des images. Vous pouvez modifier un conteneur existant, puis le valider en tant que nouvelle image. Vous pouvez également écrire un fichier Docker et le construire en une image. Nous allons passer en revue les deux et expliquer les avantages et les inconvénients.
Avec les constructions manuelles, vous traitez votre conteneur comme un ordinateur ordinaire. Vous installez des packages, vous écrivez des fichiers et, une fois que tout est dit, vous le validez et vous vous retrouvez avec une nouvelle image que vous utilisez comme modèle pour créer beaucoup plus de conteneurs identiques ou même pour baser d'autres images..
Commençons par l'image alpine, qui est une image très petite et spartiate basée sur Alpine Linux. Nous pouvons l'exécuter en mode interactif pour entrer dans un shell. Notre objectif est d’ajouter un fichier appelé "yeah" qui contient le texte "ça marche!" dans le répertoire racine, puis créez une nouvelle image appelée "yeah-alpine".
Et c'est parti. Nice, nous sommes déjà dans le répertoire racine. Voyons ce qu'il y a.
> docker run -it alpine / bin / sh / # ls bin dev, etc, accueil lib linuxrc média mnt proc racine exécuter sbin srv sys tmp usr var
Quel éditeur est disponible? Pas de vim, pas de nano?
/ # vim / bin / sh: vim: non trouvé / # nano / bin / sh: nano: non trouvé
Tant pis. Nous voulons juste créer un fichier:
/ # echo "ça marche!" > ouais / # chat ouais ça marche!
Je suis sorti du shell interactif et je peux voir le conteneur nommé "vibrant_spenc" avec docker ps --all
. le --tout
le drapeau est important parce que le conteneur ne fonctionne plus.
> docker ps --all COMMANDE D'IMAGE DE CONTAINER ID NOM DE STATUT CRÉÉ c8faeb05de5f alpine "/ bin / sh" Il y a 6 minutes Exit vibrant_spence
Ici, je crée une nouvelle image à partir du conteneur "vibrate_spence". J'ai ajouté le message de validation "mine, mine, mine" pour faire bonne mesure.
> docker commit -m "mine, mine, mine" vibrant_spence yeah-alpine sha256: e3c98cd21f4d85a1428… e220da99995fd8bf6b49aa
Regardons ça. Oui, il y a une nouvelle image, et dans son histoire, vous pouvez voir une nouvelle couche avec le commentaire "mine, mine, mine".
Les images de docker sont remplacées par une en-tête (710), dont le plus récent est 775da (687 MB). 4e38e38c8ce0 4.8 MB nsqio / nsq dernières 2a82c70fe5e3 70.7 MB> histoire de docker yeah-alpine IMAGE CREATED SIZE COMMENTAIRE e3c98cd21f4d Il y a 40 secondes 66 B mine, mine, mine 4e38e38c8ce0 il y a 7 mois 4.8 MB
Maintenant pour le vrai test. Supprimons le conteneur et créons un nouveau conteneur à partir de l'image. Le résultat attendu est que le fichier "yeah" sera présent dans le nouveau conteneur.
> docker rm vibrant_spence vibrant_spence> docker run -it ouais-alpin / bin / sh / # cat ouais ça marche! / #
Que puis-je dire? Oui ça marche!
Créer des images à partir de conteneurs modifiés est cool, mais il n'y a aucune responsabilité. Il est difficile de suivre les changements et de connaître les modifications spécifiques. La méthode disciplinée pour créer des images est de les construire en utilisant un fichier Dockerfile..
Le fichier Dockerfile est un fichier texte similaire à un script shell, mais il prend en charge plusieurs commandes. Chaque commande qui modifie le système de fichiers crée un nouveau calque. Dans la première partie, nous avons discuté de l’importance de bien diviser votre image en couches. Le Dockerfile est un grand sujet en soi.
Ici, je vais simplement illustrer quelques commandes pour créer une autre image, "oh-yeah-alpine", basée sur un fichier Dockerfile. En plus de créer le fameux fichier "yeah", installons également vim. La distribution Linux alpine utilise un système de gestion de paquets appelé "apk". Voici le Dockerfile:
FROM alpine # Copiez le fichier "yeah" de l'hôte COPY yeah / yeah # Mettez à jour et installez vim en utilisant apk RUN apk update && apk add vim CMD cat / yeah
L'image de base est alpine. Il copie le fichier "yeah" à partir du même répertoire hôte que le fichier Dockerfile (le chemin du contexte de construction). Ensuite, il court apk update
et installe vim. Enfin, il définit la commande à exécuter lors de l’exécution du conteneur. Dans ce cas, le contenu du fichier "yeah" sera affiché à l'écran..
D'ACCORD. Maintenant que nous savons dans quoi nous nous engageons, construisons cette chose. L'option "-t" définit le référentiel. Je n'ai pas spécifié de balise, ce sera donc la valeur "dernière" par défaut.
> docker construit -t oh-yeah-alpine. Envoi du contexte de construction au démon Docker 3.072 kB Étape 1/4: DEPUIS alpine ---> 4e38e38c8ce0 Étape 2/4: COPIE yeah / yeah ---> 1b2a228cc2a5 Suppression du conteneur intermédiaire a6221f725845 Étape 3/4: RUN apk update && apk add vim ---> En cours d'exécution dans e2c0524bd792, récupérez http://dl-cdn.alpinelinux.org/… /APKINDEX.tar.gz récupérez http: //dl-cdn.alpinelinux.org… /x86_64/APKINDEX.tar.gz v3. 4.6-60-gc61f5bf [http://dl-cdn.alpinelinux.org/alpine/v3.4/main] v3.4.6-33-g38ef2d2 [http://dl-cdn.alpinelinux.org/… / v3. 4 / community] OK: 5977 paquets distincts disponibles (1/5) Installation de lua5.2-libs (5.2.4-r2) (2/5) Installation de ncurses-terminfo-base (6.0-r7) (3/5) Installation ncurses-terminfo (6.0-r7) (4/5) Installation de ncurses-libs (6.0-r7) (5/5) Installation de vim (7.4.1831-r2) Exécution de busybox-1.24.2-r9.trigger OK: 37 Mio dans 16 paquets ---> 7fa4cba6d14f Suppression du conteneur intermédiaire e2c0524bd792 Étape 4/4: CMD cat / yeah ---> Exécution de 351b4f1c1eb1 ---> e124405f28f4 Suppression du conteneur intermédiaire 351b4f1c1eb1 Successf ully construit e124405f28f4
Cela semble bon. Vérifions que l'image a été créée:
> images de docker | grep oh-yeah oh-yeah-alpine dernier e124405f28f4 Il y a environ une minute 30.5 MB
Notez que l'installation de vim et de ses dépendances a gonflé la taille du conteneur de 4,8 Mo de l'image alpine de base à 30,5 Mo!
C'est très bien. Mais ça marche?
> docker run oh-yeah-alpine ça marche!
Oh oui, ça marche!
Si vous avez encore des doutes, allons dans le conteneur et examinons le fichier "yeah" avec notre vim fraîchement installé..
> docker run -it oh-yeah-alpine / bin / sh / # vim ouais ça marche! ~ ~… ~ "Ouais" 1L, 10C
Je ne vous l'ai pas dit, mais lorsque j'ai essayé de construire l'image oh-yeah-alpine, elle est restée suspendue pendant plusieurs minutes. Le problème était que je viens de mettre le fichier Dockerfile dans mon répertoire personnel. Lorsque Docker crée une image, il compresse d’abord le répertoire complet dans lequel se trouve le fichier Dockerfile (y compris les sous-répertoires) et le rend disponible pour les commandes COPY du fichier Dockerfile..
Docker n'essaie pas d'être intelligent et d'analyser vos commandes COPY. Il emballe juste le tout. Notez que le contenu de la construction ne finira pas dans votre image, mais ralentira votre commande de construction si votre contexte de construction est inutilement grand..
Dans ce cas, j'ai simplement copié le fichier Dockerfile et le "yeah" dans un sous-répertoire et exécuté la commande docker build dans ce sous-répertoire. Mais parfois, vous avez une arborescence de répertoires compliquée à partir de laquelle vous voulez copier des sous-répertoires et des fichiers spécifiques et en ignorer d'autres. Entrez le fichier .dockerignore.
Ce fichier vous permet de contrôler exactement ce qui entre dans le contexte de construction. Mon astuce préférée consiste à tout d'abord exclure tout, puis à inclure les éléments dont j'ai besoin. Par exemple, dans ce cas, je pourrais créer le fichier .dockerignore suivant et conserver le fichier Docker et le "yeah" dans mon répertoire personnel:
# Exclure TOUT d'abord * # Maintenant, incluez sélectivement des trucs!
Il n'est pas nécessaire d'inclure le "Dockerfile" lui-même ou le fichier ".dockerignore" dans le contexte de construction..
Vous avez parfois besoin de copier des fichiers dans l'image, mais dans d'autres cas, vous voudrez peut-être que vos conteneurs soient plus dynamiques et fonctionnent avec des fichiers sur l'hôte. C'est ici qu'interviennent les volumes et les montures.
Le montage des répertoires hôtes est un jeu de balle différent. Les données appartiennent à l'hôte et non au conteneur. Les données peuvent être modifiées lorsque le conteneur est arrêté. Le même conteneur peut être démarré avec différents répertoires hôtes montés.
Le marquage des images est très important si vous développez un système basé sur des microservices et générez de nombreuses images qui doivent parfois être associées les unes aux autres. Vous pouvez ajouter autant de tags que vous le souhaitez à une image.
Vous avez déjà vu la balise "dernière" par défaut. Parfois, il est judicieux d’ajouter d’autres balises, comme "testé", "release-1.4" ou le commit git qui correspond à l’image..
Vous pouvez marquer une image pendant une construction ou plus tard. Voici comment ajouter une balise à une image existante. Notez que, même s’il s’agit d’une balise, vous pouvez également affecter un nouveau référentiel..
> étiquette de docker oh-yeah-alpine oh-yeah-alpine: cool-tag> étiquette de docker oh-yeah-alpine oh-yeah-alpine-2> images de docker | grep oh-yeah oh-yeah-alpine-2 dernière e124405f28f4 30,5 Mo oh-yeah-alpine étiquette-cool e124405f28f4 30,5 Mo oh-yeah-alpine dernière e124405f28f4 30,5 Mo
Vous pouvez également annuler l’étiquetage en supprimant une image par son nom de tag. C'est un peu effrayant car si vous supprimez la dernière balise par accident, vous perdez l'image. Mais si vous construisez des images à partir d'un fichier Dockerfile, vous pouvez simplement reconstruire l'image..
> docker rmi oh-yeah-alpine-2 Untagged: oh-yeah-alpine-2: dernier> docker rmi oh-yeah-alpine: cool-tag Untagged: oh-yeah-alpine: cool-tag
Si j'essaie de supprimer la dernière image marquée restante, j'obtiens une erreur car elle est utilisée par un conteneur..
> docker rmi oh-yeah-alpine Réponse d'erreur du démon: conflit: impossible de supprimer la référence de référentiel "oh-yeah-alpine" (doit forcer) - le conteneur a1443a7ca9d2 utilise son image référencée e124405f28f4.
Mais si je retire le conteneur…
> Docker rmi oh-yeah-alpin Untagged: oh-yeah-alpin: le dernier Deleted: SHA256: e124405f28f48e ... 441d774d9413139e22386c4820df Deleted: SHA256: 7fa4cba6d14fdf ... d8940e6c50d30a157483de06fc59 Deleted: SHA256: 283d461dadfa6c ... dbff864c6557af23bc5aff9d66de Deleted: SHA256: 1b2a228cc2a5b4 ... 23c80a41a41da4ff92fcac95101e Deleted: SHA256: fe5fe2290c63a0 … 8af394bb4bf15841661f71c71e9a> images de docker | grep oh-ouais
Oui. C'est parti. Mais ne t'inquiète pas. Nous pouvons le reconstruire:
> docker construit -t oh-yeah-alpine. > images de docker | grep oh-yeah oh-yeah-alpine dernier 1e831ce8afe1 il y a 1 minute 30.5 MB
Yay, c'est de retour. Dockerfile pour la victoire!
Les images ressemblent beaucoup à certains égards aux dépôts git. Ils sont également construits à partir d'un ensemble ordonné de commits. Vous pouvez penser à deux images qui utilisent les mêmes images de base en tant que branches (bien qu'il n'y ait pas de fusion ni de refonte dans Docker). Un registre d'images est l'équivalent d'un service d'hébergement git central tel que GitHub. Devinez quel est le nom du registre d'images officiel de Docker? C'est vrai, Docker Hub.
Lorsque vous exécutez une image, si elle n’existe pas, Docker essaie de la extraire de l’un de vos registres d’images configurés. Par défaut, il se connecte à Docker Hub, mais vous pouvez le contrôler dans votre fichier "~ / .docker / config.json". Si vous utilisez un autre registre, vous pouvez suivre leurs instructions, qui impliquent généralement une connexion à l'aide de leurs informations d'identification..
Supprimons l’image "hello-world" et tirez-la à nouveau à l’aide de la touche docker pull
commander.
> images de dockere | grep hello-world hello-world dernière c54a2cc56cbb il ya 7 mois 1.85 kB> docker rmi hello-world hello-world
C'est parti. Tirons maintenant.
> docker pull hello-world Utilisation de la balise par défaut: dernière dernière: Extrait de library / hello-world 78445dd45222: Extrait complète Digest: sha256: c5515758d4c5e1e… 07e6f927b07d05f6d12a1ac8d7 Statut: Téléchargé nouveau image pour hello-world: dernière image> grep hello-world hello-world dernier 48b5124b2768 il y a 2 semaines 1,84 kB
Le dernier hello-world a été remplacé par une version plus récente.
Pousser des images est un peu plus compliqué. Vous devez d’abord créer un compte sur Docker Hub (ou un autre registre). Ensuite, vous vous connectez. Ensuite, vous devez marquer l’image que vous souhaitez importer en fonction de votre nom de compte ("g1g1" dans mon cas)..
> connexion au docker -u g1g1 -pConnexion réussie> balise docker hello-world g1g1 / hello-world> docker images | grep bonjour g1g1 / dernier monde 48b5124b2768 2 semaines plus tôt 1.84 kB dernier monde 48b5124b2768 2 semaines plus tôt 1.84 kB
Maintenant, je peux pousser l'image taguée g1g1 / hello-world.
> docker push g1g1 / hello-world La poussée fait référence à un référentiel [docker.io/g1g1/hello-world] 98c944e98de8: Monté à partir de library / hello-world dernièrement: condensé: sha256: c5515758d4c5e… f6d12a1acacdd: 524
Les images Docker sont les modèles de vos conteneurs. Ils sont conçus pour être efficaces et offrent une réutilisation maximale en utilisant un pilote de stockage du système de fichiers en couches..
Docker fournit de nombreux outils pour lister, inspecter, construire et marquer des images. Vous pouvez extraire et pousser des images dans des registres d'images, tels que Docker Hub, pour gérer et partager facilement vos images..