Catégories
Devops

Docker introduction pour débutants

Docker virtualisation grâce à des images et containers

En tant que développeur, il nous arrive de vouloir « essayer » telle ou telle librairie, faire un petit POC rapide pour choisir une base de donnée parmi plusieurs.

Il était possible d’isoler des environnement de travail et de les rendre « temporaires » ou « jetable » grâce à des solutions de virtualisations (plus ou moins lourde ou onéreuses) depuis de nombreuses années.
Docker est apparue comme une alternative « légère » à la Virtualisation classique en machines virtuelles car elle se repose sur le système d’exploitation hôte (contrairement aux VM qui nécessite une install d’OS) pour ceux qui développent en environnement Linux.

Attention: on lit souvent que docker permet de déployer « cross plateform », mais il faut noter que les images sont dépendantes de l’OS et de l’architecture CPU hôte.
Il faudra donc utiliser une méthode nommé multistage build si votre environnement de dév est sous Linux sur un PC (x64) et que vous souhaitez déployer sur des Raspberry Pi (armV7).
Voir également Docker Machine (anciennement Boot2docker)

Concepts de base

Docker nous permet de créer un environnement isolé capable de faire tourner des services (comme des serveur web, smtp ou autres) ou de lancer des exécutables, sans interférer avec le système hôte.

Mots clé

Image: c’est un package exécutable en lecture seule, qui comprend tout ce qui est nécessaire pour lancer une application (le code, runtime, bibliothèques, var d’environnement et fichiers de conf). Une image Docker peut être une application web complète, un serveur quelconque ou juste un exécutable.
Il existe de nombreuses images facilement récupérables depuis un repo Docker, elles nous serviront de base pour construire notre propre image (contenant notre toute dernière SPA par ex).

Container: c’est l’instance d’une image, c’est une image qui est « exécutée » et visible avec la commande docker ps

DockerFile 🔗 : est un fichier de commandes qui va nous permet de créer une image personnalisée en se basant sur des images existantes puis la configuration et installation d’outils divers

Docker Engine: c’est le moteur de Docker coté serveur. Il se compose du process (deamon) dockerd, qui va permettre de gérer containers et images.
Pour interagir avec nous disposons d’une API REST, d’un SDK (pour Python et Go)

Docker Hub: Repository d’images dockers pour divers architectures matériels (ici pour Raspberry Pi)

Commandes de base

docker images  : liste l’ensemble des images présente en local (machine faisant tourner le deamon docker)

docker image inspect mon-image : détail du contenu d’une image

docker ps -a  ou docker container ls -all  : liste l’ensemble des containers (même ceux qui sont exited)

docker diff e319dc35e14e  : affiche la différence entre le container (l’argument est le CONTAINER ID fournie par docker ps ) et l’image à partir de laquelle il a été lancé

docker commit e319dc35e14e debian-perso : enregistre le container ayant l’ID spécifié dans une image nommée debian-perso

docker save debian-perso > ~/debian-perso.tar : exporte l’image debian-perso sur dans le home de l’utilisateur courant sous forme de fichier tar

docker run --hostname=dockerized --name=toto -ti debian  : lance l’image debian en nommant le container « toto » et en spécifiant le nom d’hôte dokerized, en mode interactif

docker run --hostname=dockerized -v /tmp/local:/tmp/container -ti debian : lance l’image debian en mappant un dossier de la machine hôte sur un dossier du container, cela permet de faire persister les fichiers

docker exec -it e319dc35e14e /bin/bash: lancer un shell sur un container tournant

Exemple simple « à la mano »

docker pull debian
docker run -ti debian /bin/bash
# une fois le prompt obtenu, modifier cette image "debian" et en sortir par la commande exit
docker commit e319dc35e14e nom-de-ma-nouvelle-image # enregistrer cette image

Gestion par lots

docker ps -aq                # ID des containers présent en local avec option quiet
docker stop `docker ps -aq`  # arrête tous le containers
docker rm `docker ps -aq`    # supprime tous le containers
docker image prune   # supprime toutes les images inutilisées
docker rmi `docker images|grep none| awk '{print $3}'` # supprime toutes les images taggés <none>

Volumes

Pour mapper un dossier du container à un dossier du système hôte, il nous est possible d’utiliser l’option -v pour Volume.

Par exemple pour lancer le container Docker Jenkins, la doc spécifie -v jenkins_home:/var/jenkins_home, qui va mapper le dossier local jenkins_home au dossier du container /var/jenkins_home.
Lorsque le chemin absolue n’est pas spécifié, le dossier du système hôte est hébergé sous: /var/lib/docker/volumes/jenkins_home.

Tips

Debug

docker events

Installation

Il existe différentes méthodes d’installation en fonction de l’OS hote:

mais la plus simple est d’exécuter le script d’installation:

 curl -fsSL https://get.docker.com -o get-docker.sh

Post-installation

Si vous souhaitez utiliser docker sans sudo à chaque commande, il suffit d’ajouter les logins au groupe docker (a créer s’il n’existe pas):

sudo groupadd docker  # création du groupe système docker
sudo usermod -aG docker $USER # ajout de l’utilisateur courant

Tester l’installation locale de docker

Pour vérifier son installation, faire un simple docker -v  puis  tenter de lancer une image (ici Nginx pour Raspberry Pi) en prenant soin de mettre un fichier index.html dans le dossier spécifié en paramètre :

docker run --name testwebsrv -v /dossier/local/contenant/du/html:/usr/share/nginx/html:ro -d -p 8080:80 arm32v7/nginx

❗ si on obtient une erreur standard_init_linux.go:207: exec user process caused « exec format error »  c’est que l’image que l’on souhaite exécuter n’est pas adaptée à l’architecture CPU locale (ex on essaye de lancer une image X64 sur un ARMv7).

Désintallation

Si l’installation a été faite via le script Curl fourni par le site Docke sur une distribution type Debian (ex raspbian), la désinstallation se fait avec dpkg

sudo dpkg -l|grep docker # pour vérifier que le(s) package docker est bien présent
sudo dpkg --remove --force-remove-reinstreq docker-ce
sudo groupdel docker

Liens