[Docker] – Créer des images Dockers en toute simplicité et hors ligne !

 

Hello les amis

Je ne vous cacherais pas que cet article est plutôt technique...
Et même si d'une certaine manière j'amène le sujet simplement, je pense qu'il mérite une deuxième lecture pour bien infuser dans votre esprit ^^

Le Docker, qu'est-ce que c'est ?

 

Docker est une sorte de Machine Virtuelle, enfin ... pas vraiment... mais c'est tout comme ...

Bon ok, j'arrête de faire mon troll et je vous raconte dans les grosses lignes ce qu'est ou plutôt ce à quoi sert Docker !

Docker c'est le moyen de disposer de plein d'applications et même si celles-ci tournent sur un système d'exploitation différent du vôtre.
Bien entendu, il va de soi que sa force réside dans le fait qu'il n'y a pas besoin d'installer / configurer pour chacune de vos applications, le système qui lui correspond.
Vos applications seront donc directement prêtes à l'emploi !

C'est customisable à l’extrême !
Vous pourrez via Docker, construire vous-même l'environnement dans lequel vous allez faire tourner vos applications.
L'idée étant de distribuer des applications qui embarquent ce dont elles ont besoin pour fonctionner.
C'est plutôt pas mal, car non seulement vous pouvez construire tout un environnement pour votre petite application (système d'exploitation, configuration, ajout des dépendances, ....)
Mais en plus vous pouvez choisir comment la démarrer : en mode statique, en mode dynamique, en mode lecture seule, en mode lecture - écriture, en redirigeant des ports, en définissant une ip, en lui partageant votre réseau...

Il y a là, je vous l'accorde, un certain nombre de similitudes avec ce que les machines virtuelles nous offrent.
Mais en y faisant bien attention, il y a quand même certaines nuances ...

Différencier Docker et Machine Virtuelle

Une machine virtuelle, c'est l'installation d'un système d'exploitation complet dans lequel vous pourrez faire tourner plusieurs applications.

Une image docker, c'est une application qui embarque avec elle uniquement les bouts du système d'exploitation dont elle a besoin.
Voici une représentation assez caricaturale de la différence entre Docker et une machine Virtuelle.
Dans un cas, on dispose d'un système complet avec un panel d'applications déjà installées.
Dans l'autre, on ne dispose que d'un système minimaliste, où l'on ajoute uniquement ce dont on a besoin.

Les Images

 

Créer une image Docker hors ligne

 

La première étape d'une image Docker c'est la création d'un dossier contenant un fichier "Dockerfile"

mkdir MonProjetDocker
vim MonProjetDocker/Dockerfile

 

Le Dockerfile est le fichier qui va "construire" votre image.
C'est en quelque sorte votre ouvrier, vous lui indiquerez les actions qu'il devra faire et celui-ci les fera.
Copie de fichier, exécution de commande, ajout de variable d'environnement ...

Les premières lignes du fichier Dockerfile seront les suivantes

FROM scratch
MAINTAINER Dave Hill < dave-hill [ at ] docker.dyrk.org >

FROM sert à indiquer ce que vous souhaitez utiliser comme environnement pour Docker.
Exemple :

  • FROM debian:jessie

Docker construira votre image en s'appuyant sur l'image système minimale d'une Debian dans la version Jessie (Version 7 de mémoire).
Bien entendu, pour récupérer l'image de Debian, docker aura besoin que votre machine soit connectée à internet, c'est donc pour ça que je vais vous parler plutôt de "scratch" !

Pourquoi "scratch" ?
Le terme "scratch" indiquera à Docker, que nous ne souhaitons pas utiliser d'environnement, que nous souhaitons nous-mêmes le construire.

MAINTAINER vous l'aurez compris, permet de spécifier l'auteur ... vous !

 

Ajouter un système à notre image Docker

 

Comme je l'explique un peu plus haut, nous partons sans "image base", nous partons "from scratch", sans rien ...

Il est donc important d'ajouter manuellement un système à notre image docker ...
Il est possible d'en créer soi-même, ou bien d'en télécharger !

Exemple :

Si je souhaite créer un environnement Centos 7, je vais devoir aller sur le site de Centos récupérer l'image de Centos 7

 

 

Une fois récupérée, je la copierais dans mon dossier, et ajouterais une nouvelle ligne :

ADD CentOS-7-20140625-x86_64-docker_01.img.tar.xz /

En clair, cette ligne va dire, prends-moi le fichier "CentOS-7-20140625-x86_64-docker_01.img.tar.xz", et extrait le à la racine "/"

ADD permet d'importer des fichiers dans votre image, dans le cas des tar.xz, tar.gz ... elle prendra même l'initiative de les extraire directement.

ADD script/SuperScript.sh /root

Ici, nous indiquons à Docker de prendre le fichier "SuperScript.sh" situé dans le dossier "script" de notre dossier docker, et de le mettre dans notre image à l'emplacement /root

Vous savez désormais comment mettre des fichiers dans votre image Docker !

Exécuter des commandes dans notre image

À présent que nous savons comment importer un système, ou de simples fichiers, nous allons voir comment appliquer directement des modifications sur ceux-ci ...

Pour cela, nous utiliserons l’instruction "RUN" !

Imaginons, donc que je souhaite ajouter un utilisateur

RUN useradd dyrk

RUN va lancer la ligne de commande "useradd dyrk", qui aboutira sur la création de l'utilisateur Dyrk !

RUN chmod +x /root/SuperScript.sh

Ici, nous donnons des droits d’exécutions à notre fichier, en exécutant la commande "chmod +x /root/SuperScript.sh".

Ces commandes-là, seront exécutées PENDANT la construction de l'image.
Elles ne seront pas exécutées lorsque vous démarrerez / utiliserez l'image.

Définir des variables d'environnements !

Si vous désirez ajouter des variables d'environnement, il vous suffit d'utiliser l'instruction ENV

ENV MaVariable "Hello World"

Exécutez des commandes au démarrage de votre Image

Lorsque vous démarrez votre image, vous souhaitez peut-être que celle-ci amorce directement un script, ou exécute une commande.
Un script pour démarrer une application par exemple.

L'instruction  "CMD" est là pour ça !
Il est important de prendre en compte que chacun des paramètres doit être entre guillemets et séparé par une virgule

CMD ["ls", "-la", "/root"]

L'exemple ci-dessus exécutera au démarrage de l'image la commande suivante :

ls -la /root

 

 

Exemple complet

Il existe pas mal d'autres instructions, je n'ai mis ci-dessus que les plus courantes, mais je vous invite au besoin à creuser les méandres de Google pour trouver les instructions qu'il vous manque.

Enfin pour clôturer ce chapitre, je vous propose de regarder un basique exemple de "Dockerfile"

FROM scratch
MAINTAINER Dave Hill < dave-hill [ at ] docker.dyrk.org >
ADD CentOS-7-20140625-x86_64-docker_01.img.tar.xz /
ADD script/SuperScript.sh /root
RUN chmod +x /root/SuperScript.sh
CMD ["ls", "-la", "/root"]

Dans un premier temps, je vais charger les fichiers de CentOs 7, j'ajouterais ensuite un script dans /root.
Je lui donnerais les droits d’exécution, et enfin, je ferais en sorte qu'à chaque démarrage ce script soit lancé.

Construction de l'image

 

Construction, compilation ... build, c'est là le mot juste, nous allons fabriquer notre image !

Pour cela, il faut nous positionner dans le dossier ou se trouve le Dockerfile et lancer la commande suivante

docker build .

A l'issue de cette commande vous obtiendrez un id du genre 8db3545acd
Il est possible de donner un nom à votre build, de manière à ne pas avoir à mémoriser par coeur les id ;)

docker build -t nomDeLimage .

Lister les images créées

 

Lorsque vous fabriquerez des images dockers, chacune de vos modifications sera sauvegardée.
Vous pourrez donc à tout moment consulter les images dockers enregistrées avec la commande suivante :

docker images

Cette commande devrait alors vous retourner quelques choses ressemblant à ceci :

Démarrer une image

Je ferais plutôt court sur ce sujet, car il est vraiment possible de personnaliser à fond le démarrage d'une image, aussi je vais vous montrer quelques manières de faire.

Standard

Aucun paramètre particulier, l'image va démarrer de manière statique, et s'arrêter.

docker run <id ou nom de l'image>

Avec une commande

En spécifiant une commande à exécuter

docker run -i <id ou nom de l'image> "ls /"

Dynamiquement

docker run -i -t <id ou nom de l'image> "ls /"

En mode écriture

Sans ce paramètre, votre système sera en ReadOnly, certaines actions vous seront donc impossible.

docker run -i -t --privileged  <id ou nom de l'image> "ls /"

Les Containers

 

Lorsque vous démarrer une image, docker va automatiquement créer ce que l'on appelle un "container".
Container => conteneur, je pense que vous comprenez le terme.
Ce conteneur sera le récipient dans lequel nous exécuterons les images.

Aussi, pour chaque image que vous démarrerez avec la commande "docker run", vous aurez un "container".

 

 

Lister les "containers" démarrés

Il est possible lorsqu'une ou plusieurs images sont démarrées, de lister les containers actifs.

Syntaxe :

docker ps

Exemple :

Arrêter le container d'une image en cours d’exécution

Syntaxe :

docker stop <id du container>

Accéder à un container en cours d'exécution

Via la commande "docker ps", vous aurez la possibilité de récupérer l'id du container, pour le rejoindre, il suffira de saisir la ligne de commande suivante

Syntaxe :

docker exec -i -t <id du container> bash

Les paramètres sont sensiblement les mêmes que ceux de la commande "docker run".
Comme vous pouvez le constater j'ai spécifié bash, vous pourriez exécuter n'importe quelle autre commande.

 

Astuce(s)

Si vous souhaitez utiliser internet, ou accéder au réseau depuis votre image docker, il vous faudra la démarrer en mode écriture, et une fois à l'intérieur, utiliser la commande suivante :

sysctl -w net.ipv4.ip_forward=1

Super petit tuto ici pour réinitialiser votre installation de Docker en cas de problème :
http://unpoucode.blogspot.fr/2015/06/docker-and-devicemappers-thinpool-in.html

 

Conclusion

 

Dyrk me sert pas mal de calepin, parfois j'écris des sujets afin de partager des sujets construits, parfois un peu déconstruit.
Bien entendu tout cela reste dans l'esprit de partage en bonne camaraderie.
Je ne suis pas un spécialiste de Docker, et j'espère que cet article vous aura permis de mieux appréhender cette nouvelle technologie qui est plutôt en vogue !

N’hésitez surtout pas à apporter en commentaire, des corrections ou des trucs et astuces sur le sujet que vous pourriez avoir ;)

Je vous souhaite à tous un excellent Weekend !

 

Partagez ce contenu

2 comments

Laisser une réponse

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *