[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"
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 :
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 !
Putain je connaissais pas. J’ai pas tout compris (pas à cause de toi) mais en tout cas super boulot !
Hello,
Un petit mot pour dire que Docker n’est pas une baguette magique (même si j’avoue que ça y ressemble fortement). Plutôt que de me lancer dans de longues explications où je risque fortement de me gourer ^^ » je laisse un lien vers les slides de « l’Hygiène Numérique pour l’administrateur système » : https://confs.imirhil.fr/20170513_root66_securite-admin-sys/#51
Donc à utiliser oui, mais avec prudence :)
Pingback: [OpenShift] Gérer facilement et dynamiquement un parc de Docker | Dyrk
petit plus il ya la combinaison de touchess CTL-P CTRL-Q qui permet de sortir d’un container sans l’arreter