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:
- Debian x64 utiliser apt
- Raspberry pi utiliser cette méthode qui va exploiter le script get-docker.sh
- pour les vieux PC (i386) sous Linux voici la démarche (récupérer et compiler les sources) ou utiliser ce script (pour Ubuntu i386)
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
- Concepts avancés
- images <none>