Maitriser les conteneurs Docker
Docker est la plateforme de conteneurisation la plus populaire. Pour rappel, une plateforme de conteneurisation permet d'isoler des applications et leurs dépendances dans des environnements autonomes appelés conteneurs. Chaque conteneur fonctionne de manière autonome, contenant tout ce dont une application a besoin pour s'exécuter, y compris le code ou le binaire, les bibliothèques et les fichiers de configuration. Ces conteneurs sont légers, portables et compatibles avec différentes plateformes. Contrairement à la virtualisation traditionnelle, où l'on exécute des machines virtuelles avec leurs systèmes d'exploitation complets, Docker partage le noyau du système hôte, ce qui permet une utilisation plus efficace des ressources.
L'histoire de Docker
L'histoire de Docker commence en 2010, lorsque Solomon Hykes, un ingénieur français, commence à travailler sur un projet personnel de virtualisation légère. L'idée était de créer un outil qui simplifierait le processus de développement, de test et de déploiement d'applications en utilisant des conteneurs.
En 2013, Docker a été publié en tant que projet open source, initialement appelé "dotCloud" en référence à la société dotCloud fondée par Solomon Hykes. Docker a rapidement gagné en popularité parmi les développeurs et les administrateurs système.
En juin 2014, Docker 1.0 a été officiellement lancé. C'était un jalon important, marquant la maturité de la technologie de conteneurisation. Docker est devenu un outil standard pour les développeurs et les opérations informatiques.
Disponibilité de Docker
Docker est disponible sur les plateformes suivantes :
- Les distributions Linux : Ubuntu, Fedora, RHEL, Centos, Gentoo, ArchLinux, openSUSE, CRUX,...
- Les systèmes de cloud : Amazon EC2, Google Compute Engine et Rackspace.
- Les systèmes d’exploitations Mac Os X et Windows. Sous Windows Docker s’appuie sur une mini VM Linux packagée dans le produit Docker Desktop.
Installation de Docker
Docker est disponible sur toutes les versions disponibles d’Ubuntu, et ce, depuis la version 12.04 L.T.S. Ici, je ne documenterai que l’installation sur Ubuntu 22.04. Pour les autres versions, je vous renvoie sur la page du projet : docs.docker.com
Dans un premier temps, il faut supprimer toutes traces d'autres systèmes de conteneurisations :
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
On va ensuite ajouter le dépôt apt
officiel et installer le moteur de
docker
, sa cli et les plugins buildkit
et compose
:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Add the repository to Apt sources:
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Pour terminer l’installation :
sudo groupadd docker
sudo usermod -aG Docker $USER
Pour que ces modifications soient effectives il faut vous déconnecter et vous reconnecter.
Vérification de la bonne installation de Docker
Pour vérifier que l’installation de Docker est terminé lançons simplement les commandes suivantes :
Exécutez la commande de vérification : Utilisez la commande suivante pour vérifier si Docker est correctement installé et fonctionne :
docker --version
Cette commande devrait afficher la version de Docker installée sur votre système.
Vérifiez l'état du service Docker : Vous pouvez également vérifier l'état du service Docker pour vous assurer qu'il est en cours d'exécution. Utilisez la commande suivante :
Sur les systèmes Linux (avec systemd) :
sudo systemctl is-active docker
Sur les systèmes Linux (sans systemd) :
sudo service docker status
Cette commande vous indiquera si le service Docker est actif (actif/en cours d'exécution).
Si vous avez suivi ces étapes et que vous obtenez une sortie cohérente avec votre installation de Docker, cela signifie que Docker est correctement installé sur votre système et prêt à être utilisé. Si vous rencontrez des problèmes, refaites le processus.
Lancement de votre premier conteneur
Test du premier conteneur :
docker run hello-world
Cette commande téléchargera l'image hello-world
depuis la registry Docker, le
docker Hub et l'exécutera. Si tout se passe bien, vous verrez un message
indiquant que votre installation de Docker fonctionne correctement.
Premières commandes Docker
Dans un premier temps, on va construire une simple image Docker en utilisant la dernière image Alpine disponible.
Rechercher une image
Nous allons rechercher les images Alpines disponibles
docker search alpine
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
alpine A minimal Docker image based on Alpine Linux… 10380 [OK]
alpinelinux/docker-cli Simple and lightweight Alpine Linux image wi… 9
alpinelinux/alpine-gitlab-ci Build Alpine Linux packages with Gitlab CI 3
alpinelinux/gitlab-runner-helper Helper image container gitlab-runner-helper … 4
alpinelinux/rsyncd 2
alpinelinux/alpine-drone-ci Build Alpine Linux packages with drone CI 0
alpinelinux/unbound 6
alpinelinux/apkbuild-lint-tools Tools for linting APKBUILD files in a CI env… 0
alpinelinux/docker-compose docker-compose image based on Alpine Linux 2
alpinelinux/ansible Ansible in docker 8
alpinelinux/gitlab-runner Alpine Linux gitlab-runner (supports more ar… 4
alpinelinux/darkhttpd 1
alpinelinux/docker-alpine 0
alpinelinux/golang Build container for golang based on Alpine L… 2
alpinelinux/alpine-docker-gitlab Gitlab running on Alpine Linux 0
alpinelinux/docker-abuild Dockerised abuild 0
alpinelinux/alpine-www The Alpine Linux public website (www.alpinel… 0
grafana/alpine Alpine Linux with ca-certificates package in… 6
alpinelinux/build-base Base image suitable for building packages wi… 0
alpinelinux/turbo-paste Alpine Linux paste service 0
alpinelinux/mqtt-exec 0
alpinelinux/git-mirror-syncd 0
alpinelinux/package-builder Container to build packages for a repository 1
alpinelinux/mirror-status
La première image est la bonne, l’officielle.
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
alpine A minimal Docker image based on Alpine Linux… 5692 [OK]
Télécharger une image Docker (pull)
Pour télécharger l’image en local, il suffit de faire :
docker pull alpine
Vous remarquerez qu’il récupère la dernière version disponible qu’il appelle
latest
. Chaque image possède un identifiant auquel peux être adjoint des tags,
latest
étant la dernière version stable d’alpine. Mais si dans nos fichiers de
déclarations, nous indiquons latest
nous ne contrôlerons plus la version
utilisée pour construire notre conteneur. Pour récupérer la liste de tous les
tags d’une image officielle, il suffit de se rendre sur le docker
hub.
Là, on voit que la dernière version disponible est la 3.18.4 donc pour la récupérer, il suffit de lancer la commande suivante :
docker pull alpine:3.18.4
Lister les images Docker présentes
Pour lister les images en local :
> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine 3.18.4 8ca4688f4f35 4 weeks ago 7.34MB
kindest/node <none> 89e7dc9f9131 4 months ago 932MB
erikvl87/languagetool latest cf4fb2fd7d9b 6 months ago 563MB```
Vous remarquerez que l’image ID est identique, car Docker ne duplique pas les données.
Construire une simple image
Pour construire une image, on utilise le format Dockerfile
vi Dockerfile
On y colle le contenu suivant :
FROM alpine:3.18.4
RUN apk update
RUN apk upgrade
Pour lancer la construction de l’image :
docker build .
ou
docker builf -f Dokerfile .
[+] Building 2.7s (7/7) FINISHED docker:default
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 87B 0.0s
=> [internal] load metadata for docker.io/library/alpine:3.18.4 0.0s
=> [1/3] FROM docker.io/library/alpine:3.18.4 0.0s
=> [2/3] RUN apk update 1.5s
=> [3/3] RUN apk upgrade 1.1s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:b07c51b112239ef2922d3cb6515098d9739ef2e2a81c495d52e1cc7871be4426 0.0s
Info importante Docker par défaut détruit les conteneurs intermédiaires. Donc si on lance la commande Docker images, on doit obtenir ce ID dans la liste retournée :
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> b07c51b11223 About a minute ago 15.9MB
alpine 3.18.4 8ca4688f4f35 4 weeks ago 7.34MB
kindest/node <none> 89e7dc9f9131 4 months ago 932MB
erikvl87/languagetool latest cf4fb2fd7d9b 6 months ago 563MB```
On voit que cette image n’a pas de TAG. Pour taguer une image lors de la
construction, il suffit d’ajouter l’option -t <tag:xxx>
.
docker build . -t test:0.1
...
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test 0.1 b07c51b11223 2 minutes ago 15.9MB
alpine 3.18.4 8ca4688f4f35 4 weeks ago 7.34MB
kindest/node <none> 89e7dc9f9131 4 months ago 932MB
erikvl87/languagetool latest cf4fb2fd7d9b 6 months ago 563MB```
Vos trouverez beaucoup plus d'informations sur la construction des Dockerfile
dans la section dédiée aux images de
conteneurs
Taguer une image existante
Pour taguer une image existante, il suffit de taper la commande suivante
docker tag 9c5a9a6e761f test:`latest`
REPOSITORY TAG IMAGE ID CREATED SIZE
test 0.1 9c5a9a6e761f 9 minutes ago 10.2MB
test `latest` 9c5a9a6e761f 9 minutes ago 10.2MB
Comme on s’y attendait, on retrouve bien le même ID pour les images 0.1 et
latest
.
Lancer une instance d'une image de conteneur
Pour lancer une instance d'image de commande, il suffit d'utiliser la commande run :
docker run test:0.1
Il ne se passe rien puisque notre Dockerfile ne lance aucune tache de fond. Nous
allons ajouter une simple commande echo
à notre fichier Dockerfile :
FROM alpine:3.18.4
RUN apk update
RUN apk upgrade
CMD ["/bin/echo", "Build with Docker!"]
Relançons la construction de notre image :
docker build -f /tmp/test/Dockerfile . -t test:0.2
J'ai incrémenté la version pour conserver l'ancienne version de l'image. Maintenant lançons cette nouvelle version :
docker run test:0.2
Build with Docker!
Vous remarquez que seule la commande définit dans l'instruction CMD
est
exécutée. Celles présentes dans les instructions RUN
sont lancées au moment de
la construction de l'image.
Les lancer en mode détaché
Un autre paramètre important à connaitre avec la commande docker run
est celui
qui permet de lancer en mode détaché un conteneur. Il s'agit du flag -d
qui
permet lancer en "en arrière-plan", comme n'importe quel processus Linux. En
mode attaché, un conteneur est lié à la session du terminal.
docker run -d redis
19267ab19aedb852c69e2bd6a776d9706c540259740aaf4878d0324f9e95af10
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a5b7b62c8d0d redis "docker-entrypoint.s…" 22 seconds ago Up 21 seconds 6379/tcp eager_pike
Lancer une console sur un conteneur détaché
Nous allons utiliser ici la commande exec
:
docker exec -it a5b7b62c8d0d sh
# cat /etc/hostname
a5b7b62c8d0d
On indique simplement l'id
ou le nom du conteneur suivi de la commande, ici le
shell. Une fois lancé, nous arrivons à l'intérieur de celui-ci. Vous pouvez
lancer toutes les commandes habituelles. Pour en sortir, il suffit de taper la
commande exit
.
Lister les instances d'images
Pour lister les images en cours, il faut utiliser la commande ps
:
docker ps
Cela ne retourne rien, car notre image ne tourne pas en tache de fond.
Détruire une image
Pour détruire une image, nous avons à notre disposition la commande rmi
:
docker rmi test:0.1
Error response from daemon: conflict: unable to remove repository reference "test:0.1" (must force) - container b48f4f1aab3f is using its referenced image b07c51b11223
Ce message indique que cette image ne peut pas être détruite, car une instance est toujours présente. Pour lister toutes les instances m^me celle qui ne tournent pas en tâche de fond :
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c8bf3a574fab test:0.2 "/bin/echo 'Build wi…" 9 minutes ago Exited (0) 9 minutes ago mystifying_faraday
a35ac8202d19 b07c51b11223 "/bin/sh" 9 minutes ago Exited (0) 9 minutes ago xenodochial_hertz
...
Destruction d'une instance d'image
Pour détruire une instance d'image, il faut utiliser la commande rm
suivi du nom ou de l'id de celle-ci :
docker rm b48f4f1aab3f
b48f4f1aab3f
Testons si nous pouvons détruire l'image :
docker rmi test:0.1
Untagged: test:0.1
Deleted: sha256:b07c51b112239ef2922d3cb6515098d9739ef2e2a81c495d52e1cc7871be4426
Elle est enfin détruite. Petite vérification :
REPOSITORY TAG IMAGE ID CREATED SIZE
test 0.2 80d5588d642d 24 minutes ago 15.9MB
alpine 3.18.4 8ca4688f4f35 4 weeks ago 7.34MB
La version 0.1 a bien disparu.
Conclusion
Dans cette documentation, nous avons exploré les bases de Docker, une technologie de conteneurisation puissante qui a révolutionné la façon dont nous développons, testons et déployons nos applications. Docker offre une solution élégante pour isoler et exécuter des applications, créant ainsi un environnement cohérent et portable.
L'utilisation de Docker ne s'arrête pas à ce guide pour débutants. Vous pouvez explorer davantage en créant vos propres images Docker personnalisées à l'aide des Dockerfiles, en utilisant Docker Compose pour gérer des applications multi-conteneurs, ou en découvrant des stratégies de déploiement plus avancées avec Docker Swarm ou Kubernetes.
Sur ce site, vous trouverez d'autres documentations ou billets de blog, permettant de progresser dans l'utilisation de Docker :
- Optimiser la taille des images Docker
- Scanner les vulnérabilités de vos containers, filesystems et ...
- Intégrer un certificat à un containeur Docker Windows
- Construire des images Docker avec Ansible
- Docker - Optimiser la taille des images utilisant python
- Docker - Pour que vos secrets le restent
- Docker - Comment extraire d'une image toutes les informations pour la reconstruire
- Docker - Comment valider des images docker avec container-structure-test
- Docker - Sécuriser son utilisation
- Docker - Builder en une fois à destination de plusieurs architectures
- Docker - Configurer correctement Docker
- Docker - Afficher facilement les logs de vos containers avec Dozzle
- Docker - Modus un nouveau langage pour construire des images de conteneurs
- Podman Desktop 1.0
Vous êtes prêt pour faire du docker build and run.
Plus d'infos
Site Officiel : docker.com
Livres Gratuits
- Introduction à Docker [PDF]
- Apprenez Docker
- Recommentation de sécurité relatives aux déploiement de conteneur Docker ANSSI-FT-082
Livres
- Docker - Pratique des architectures à base de conteneurs - 2e éd.: Pratique des architectures à base de conteneurs de Pierre-Yves Cloux Docker et conteneurs - 3e éd.: Architectures, développement, usages et outils de Pierre-Yves Cloux
MOOC
Sites
- Sécuriser l'utilisation de Docker
- Chérie, j'ai rétréci Docker : Optimisation de la taille des images
- Apprendre Docker avec une tasse de café
- Support de cours Docker : Découverte de Docker avec animation Asciinema