Aller au contenu principal

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 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 update
sudo apt install ca-certificates curl gnupg -y
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 update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

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 :

  1. 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.

  2. 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 && \
    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 && \
    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 :

Vous êtes prêt pour faire du docker build and run.

Plus d'infos

Site Officiel : docker.com

Livres Gratuits

Livres

MOOC

Sites

Vidéos