Création d'une image docker à partir de zéro

Création d'une image docker à partir de zéro
Le principal avantage de Docker sur toute autre technologie de contenerisation est que Docker s'adresse aux développeurs et à leurs applications à dos. Alors que les technologies de contenerisation appropriées comme LXC, les zones et les prisons sont ciblées du point de vue des opérations, ou, pour le dire simplement, ces plateformes sont un substitut des machines virtuelles fonctionnant sur le cloud. Où AS, Docker est un substitut aux packages et aux binaires exécutables.

De plus en plus, Docker devient de plus en plus comme un gestionnaire de packages universels qui fonctionne sur toutes les plates-formes Linux possibles. Il faut des conteneurs et les utilise pour résoudre un problème complètement différent auquel les développeurs sont confrontés. Le problème est que les développeurs utilisent leur système d'exploitation de bureau (comme Windows, MacOS ou Linux avec une tonne de packages liés au bureau) pour écrire des applications. L'application qu'ils écrivent s'exécute souvent sur un système d'exploitation complètement différent sur un serveur quelque part avec une distribution Linux complètement différente de celle de l'ordinateur portable du développeur.

Avec Docker, l'idée est que votre application est remplie comme une image Docker. C'est le travail de Docker de prendre cette image et de l'exécuter en tant qu'application conteneurisée pour vous. Être conteneurisé signifie que l'application et ses dépendances fonctionneront dans un environnement isolé qui peut différer complètement de l'ordinateur portable du développeur et même du serveur de production. Tant qu'ils soutiennent tous les deux Docker, ils peuvent tous les deux exécuter la même application de la même manière.

Anatomie d'une image docker

Comme mentionné précédemment, une application Docker fonctionnera sur un environnement convenu. Maintenant, la question est de savoir comment créer cet environnement? La plupart des images d'application importeraient une image de base Docker et créeraient leur application par-dessus.

Les applications sont faites à partir de couches de logiciels. Une image de conteneur WordPress est construite à l'aide d'une image de conteneur HTTPD qui, à son tour, est construite sur une image Ubuntu. L'image sur laquelle une image plus récente est construite est connue sous le nom d'image parentale dans Docker Terminology. Dans dockerfile (nous arrivera à ce que signifie un dockerfile, un peu plus tard), cette image parent est mentionnée en haut du fichier comme indiqué ci-dessous:

De Ubuntu: 18.04
## Reste du dockerfile

Ce dockerfile lors de l'exécution convertit votre application en image docker (une sorte de binaire) que vous pouvez ensuite pousser vers un registre d'où il peut être tiré pour créer de nouveaux conteneurs ailleurs. Cependant, ils auront tous Ubuntu: 18.04 comme image de base, et exécutez comme s'il s'agissait d'un système Ubuntu dans lequel ils exécutent.

Vous avez peut-être remarqué cela lorsque vous essayez de tirer une nouvelle image Docker.

Cela montre combien de couches sont tirées avant l'application réelle (qui pourrait être seulement de quelques mégaoctets).

Pour cette raison, nous aimerions créer ce que l'on appelle une image de base. Qui n'est construit au-dessus de rien d'autre. Le mot clé «Scratch» est utilisé pour indiquer que ce calque n'est pas construit sur quoi que ce soit d'autre. Ainsi:

De zéro
## Reste du dcokerfile

Nous allons d'abord créer une application Hello-World simple, puis déterminer ce que sera le reste du Dockerfile. Le système hôte est Ubuntu: 18.04 LTS et nous utilisons Docker version 17.12.1-CE pour l'expérience.

Création d'un binaire statique

Les conteneurs Docker sont une collection de processus s'exécutant isolés du reste du système d'exploitation. La seule chose avec laquelle le processus est en contact est le noyau. Kernel est responsable de la planification de ces processus sur le CPU, faisant la gestion de la mémoire et quelques autres tâches de conservation de la réservation de base.

Mais la plupart des applications de haut niveau dépendent de nombreuses bibliothèques système (comme glibc, musl, klibc, etc) et beaucoup de dépendances d'exécution comme Python ou Node.Runtime JS ou Java. Le binaire de l'application n'a pas toutes les bibliothèques disponibles à l'intérieur, mais quand il démarre l'exécution, il appelle ces bibliothèques à partir du système d'exploitation hôte.

Parce que nous essayons de créer une image à partir de zéro, nous n'obtenons pas ces subtilités. Notre application doit donc être un fichier statique ou un exécutable autonome.

Commençons par créer un dossier appelé mydockerimage et créer un fichier bonjour.CC à l'intérieur.

$ mkdir mydockerimage
$ cd mydockerimage
$ touch bonjour.CC

Ouvert bonjour.CC en utilisant votre éditeur de texte préféré et ajoutez les lignes suivantes à l'intérieur.

#inclure
Utilisation de Namespace Std;
int main()
couter << "Hello! This message is coming from a container \n ";
retour 0;

Ceci est un simple programme C ++ qui imprime «Bonjour! Ce message… "

Pour les raisons discutées précédemment, nous compilerons cela en utilisant le drapeau statique. Le compilateur utilisé est G ++ (Ubuntu 7.3.0-16ubuntu3) 7.3.0.

Pour compiler le programme, dans le même répertoire, exécutez la commande suivante:

$ g ++ -o bonjour -statique bonjour.CC

Cela crée un fichier exécutable binaire «bonjour» dans le même répertoire. C'est notre fichier statique. Testez s'il fonctionne comme prévu en mentionnant le nom de fichier dans le terminal.

$ ./Bonjour

Maintenant, nous sommes prêts à conteneuriser ce programme simple.

Dockerfile

Le dockerfile se compose d'un ensemble de règles qui prend vos fichiers d'application (comme les binaires, les fichiers source, etc.) ainsi que divers paramètres de configuration comme la disposition du système de fichiers, les ports exposés, etc. et les transforment en fichier d'image Docker. Vous pouvez ensuite partager le fichier image avec quiconque souhaite exécuter cette application.

Nous ne creuserons pas dans toutes les options disponibles pour dockerfile, nous rédigeons plutôt un dockerfile très minimaliste. Dans le même répertoire, où réside votre Hello Exécutable, créez un fichier vide nommé Dockerfile.

$ touch dockerfile

Ouvrez-le avec votre éditeur de texte préféré et écrivez les lignes suivantes:

De zéro
Ajouter Hello /
Cmd ["/ bonjour"]

gratter n'est pas une image parentale. Il indique plutôt Docker que l'image n'est pas construite sur une autre image. Il est construit à partir de zéro. Ajouter la commande prendrait le binaire statique nommé Bonjourà partir du répertoire actuel et ajoutez-le au répertoire racine du fichier image. Lorsque nous exécutions enfin un conteneur en fonction de cette image, l'exécutable Hello sera vu à l'intérieur du répertoire racine lui-même à /Bonjour.

Enfin, la ligne CMD a une chaîne "/Bonjour" Cette chaîne sera exécutée en tant que commande shell chaque fois qu'un conteneur sera créé à partir de cette image, donc le fichier binaire que nous avons ajouté à notre conteneur et imprime le message que nous avons écrit dans notre application.

Construisons l'image en invoquant le docker commande qui passerait par le contenu du dockerfile et générerait l'image. Exécutez la commande suivante dans le même répertoire que le dockerfile et l'exécutable.

$ docker build - tag bonjour .

Le -Tag bonjour Flag définit le nom de l'image sur Bonjour et le point ( ".») à la fin raconte docker Pour examiner le répertoire actuel de Dockerfile et des contenus connexes.

Exécution du conteneur Docker

Pour vérifier si l'image que nous venons de créer apparaît dans la liste des images, exécutez:

$ images docker

Remarquez à quel point l'image Hello est petite par rapport aux autres images. Dans tous les cas, il est prêt à être exécuté comme un conteneur,

$ docker run bonjour

C'est ça! Vous avez créé votre premier conteneur minimaliste à partir de zéro.

Autres options

Bien que la création d'images à partir de zéro soit toujours une option, les gens ont souvent tendance à créer des images à partir d'autres distros linux légers. Par exemple, des images comme Alpine et Busybox sont des environnements vraiment légers avec des bibliothèques plus petites comme Musl au lieu de GLIBC.

Les utiliser comme image parent en utilisant "De Alpine: le dernier" entraînerait également des images plus petites. Puisque les images de base ne mesurent que 2 Mb. Faites-nous savoir s'il y a un sujet lié à Docker que vous voudrez peut-être que nous couvrions ensuite. Vous pouvez nous joindre sur Twitter, Facebook ou vous abonner par e-mail.