Fonctionnement et manipulation des images Docker

Aujourd'hui, vous allez apprendre le fonctionnement et la manipulation des images Docker. Vous saurez ainsi comment lister, télécharger, supprimer et rechercher des images Docker. Enfin vous allez découvrir quelques commandes pour récolter des informations sur votre installation Docker.

Qu'est qu'une image Docker

Sur Docker, un conteneur est lancé en exécutant une image. "Attends mais c'est quoi une image Docker" ?

Une image est un package qui inclut tout ce qui est nécessaire à l'exécution d'une application, à savoir :

  • Le code
  • L'exécution
  • Les variables d'environnement
  • Les bibliothèques
  • Les fichiers de configuration

Dans le chapitre suivant vous allez en savoir plus sur les conteneurs. Pour le moment tout ce que vous devez retenir, c'est qu'une image docker est créée à partir d'un fichier nommé le Dockerfile. Une image est un modèle composé de plusieurs couches, ces couches contiennent notre application ainsi que les fichiers binaires et les bibliothèques requises. Lorsqu'une image est instanciée, son nom est un conteneur, un conteneur est donc une image en cours d'exécution.

Pour mieux comprendre le système de couche, imaginons par exemple qu'on souhaite déployer notre application web dans un serveur LAMP (Linux Apache MySQL PHP) au moyen de Docker. Pour créer notre stack (pile en français), nous aurons besoin de :

  • Une couche OS pour exécuter notre Apache, MySQL et Php
  • Une couche Apache pour démarrer notre serveur web et pourquoi pas la config qui va avec (.htaccess, apache2.conf, site-available/, etc ... )
  • Une couche php qui contiendra un interpréteur Php mais aussi les bibliothèques qui vont avec (exemple : php-curl)
  • Une couche Mysql qui contiendra notre système de gestion de bases de données Mysql

Au total, notre image docker sera composée de quatre couches, en schéma ceci nous donnerai :

Les différentes couches d'une image LAMP au moyen de Docker

Il est important de bien différencier une image Docker d'un conteneur Docker car ce sont deux choses distinctes, Sur le chapitre précédent nous avions téléchargé et éxécuté l'image "hello-world", je vais m'appuyer au début sur cette image pour vous dévoiler quelques commandes de manipulation d'images Docker et par la suite nous téléchargerons d'autres images.

Quelques commandes

Récupérer des informations

Pour commencer on va d'abord récupérer la liste des commandes possible :

docker help

Résultat:

Usage:  docker [OPTIONS] COMMAND

A self-sufficient runtime for containers

Options:
    -v, --version            Print version information and quit
    ...

Management Commands:
    builder     Manage builds
    ...

Commands:
    ...
    info        Display system-wide information
    ...
    Run 'docker COMMAND --help' for more information on a command.

Je n'ai pas listé toutes les commandes car il y en a beaucoup, mais sur votre terminal, vous verrez beaucoup plus d'options que moi.

Sur l'ouput de la commande help, nous avons une information super intéressante et croyez-moi elle vous sera d'une grande utilité et vous permettra de gagner beaucoup de temps 😎. Je parle de la ligne suivante : Run 'docker COMMAND --help' for more information on a command. Cette ligne nous informe qu'il est possible d'avoir de l'auto-complétion sur n'importe quelles sous-commandes/options de Docker, je m'explique, si vous tapez la commande suivante (avec un espace à la fin et sans la lancer) :

docker volumes

Si à ce moment vous appuyez sur la touche tabulation, alors ça vous affichera toutes les options possibles pour la sous-commande volumes, ainsi que leurs descriptions.

Résultat:

create   -- Create a volume
inspect  -- Display detailed information on one or more volumes
ls       -- List volumes
prune    -- Remove all unused volumes
rm       -- Remove one or more volumes

Nice non 😏 ?

Sur le chapitre précédent, nous avons vu comment afficher la version du moteur Docker avec la commande suivante :

docker --version

Résultat:

Docker version 18.09.6, build 481bc77

C'est cool d'avoir une telle information, mais il existe une autre commande qui permet d'afficher encore plus de détails sur votre installation de Docker:

docker info

Cette commande, nous fournit plusieurs informations concernant les spécifications du moteur Docker. Elle nous transmet aussi d'autres informations telles que le nombre total de conteneurs tournant sur notre machine ainsi que leur état :

Containers: 3
Running: 0
Paused: 0
Stopped: 3

Voir le nombre total d'images disponibles sur notre machine :

Images: 1

Hmm, par contre ça ne m'affiche que le nombre d'images disponibles sur ma machine, "Est-ce-que c'est possible d'avoir davantage d'informations sur mes images ?" La réponse est oui ! On va voir ça tout de suite 😀.

Lister les images Docker téléchargées

Sur le chapitre précédent vous aviez lancé la commande docker run hello-world. Pour information cette commande télécharge une image depuis le Docker Hub Registry et l'exécute dans un conteneur. Lorsque le conteneur s'exécute, il vous affiche un petit message d'information et se ferme directement.

Voici la commande qui permet de répertorier les images Docker téléchargées sur votre ordinateur :

docker image ls

ou bien la commande :

docker images

Résultat:

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              fce289e99eb9        5 months ago        1.84kB

Elle nous donne différentes informations dont :

REPOSITORY TAG IMAGE ID CREATED SIZE
Le titre REPOSITORY peut porter à confusion, c'est essentiellement le nom de l'image. un tag ici est une façon de faire référence à votre image, ils sont utilisés principalement pour affecter une version à une image L'identifiant de l'image (unique pour chaque image téléchargée) Date de la dernière modification de l'image Taille de l'image

Supprimer une image Docker

Maintenant si on souhaite supprimer une image Docker, on aura besoin soit de son IMAGE ID soit de son nom. Une fois qu'on aura récupéré ces informations, on peut passer à la suite en lançant la commande suivante :

avec l'id de l'image :

docker rmi fce289e99eb9

avec le nom de l'image :

docker rmi hello-world

Si vous lancez cette commande vous aurez le message d'erreur suivant :

Error response from daemon: conflict: unable to remove repository reference "hello-world" (must fo
rce) - container 3e444920f82d is using its referenced image fce289e99eb9

Ce message d'erreur nous explique, qu'on ne peut pas supprimer notre image Docker car des conteneurs ont été instanciés depuis notre image "hello-world". En gros si on jamais on supprime notre image "hello-world", ça va aussi supprimer nos conteneurs car ils se basent sur cette image. Dans notre cas ça ne pose aucun problème, d'ailleurs pour résoudre ce problème l'erreur nous informe qu'on doit forcer la suppression pour éliminer aussi les conteneurs liés à notre image (must force).

Pour forcer la supprimer on va utiliser l'option --force ou -f.

docker rmi -f hello-world

Information

Si jamais vous possédez plusieurs images avec le même nom mais avec des tags différents alors vous devez préciser le tag dans votre commande rmi, pour ainsi être sûr de supprimer la bonne image. Pour information par défaut Docker prend le tag latest.

Bonus

Voici une commande qui permet de supprimer toutes les images disponibles sur notre machine :

docker rmi -f $(docker images -q)

Télécharger une image depuis le Docker Hub Registry

Lister les images disponibles sur le Docker Hub Registry

Maintenant rentrons dans du concret et téléchargeons une image plus utile comme par exemple l'image officielle d'Ubuntu. "Oui mais ou est-ce que je peux retrouver la liste des images disponibles ?"

Très bonne question au tout début je vous ai parlé du Docker Hub Registry. Pour faire simple un Registry (registre en français) est une application côté serveur qui permet de stocker et de distribuer des images Docker, le Docker Hub Registry est le registre officiel de Docker.

Il existe deux façons pour voir si une image est disponible dans le Docker Hub Registry, la première consiste à visiter le site web et vous recherchez directement le nom de l'image dans la barre de recherche :

Recherche d'une image ubuntu dans le Docker Hub Registry

Vous remarquerez sur l'image que j'ai coché la case "Official Image" pour ne m'afficher que les images officielles. Ainsi je m'assure que l'image Ubuntu que je vais télécharger a bien été crée par l'équipe gérant la distribution Ubuntu.

Il faut bien faire attention aux images qu'on télécharge sur le net. Il faut toujours vérifier au préalable le code source de l'image plus précisément le fichier Dockerfile (ne vous inquiétez on verra le Dockerfile dans un prochain chapitre), car on est jamais à l'abri d'avoir des images contenant des programmes vulnérables voire même des images malhonnêtes.

Je ne dis pas non plus qu'il ne faut télécharger que des images officielles mais juste faire attention à ce qu'on télécharge sur le net. Car d'un autre côté il ne faut pas oublier qu'il existe dans le Docker Hub Registry une multitude d'images créées par des utilisateurs expérimentés indépendants. Ces images sont parfois bien plus optimisées que les images officielles car certaines images n'utilisent que le strict minimum pour faire fonctionner leur application permettant ainsi de réduire la taille de l'image.

Bref revenons à nos moutons, si je clique sur l'image officielle d'ubuntu je tombe sur la page suivante :

image officielle d'ubuntu dans le Docker Hub Registry

en haut à droite on retrouve le nom de l'image avec une toute petite description

haut droite de la page de l'image officielle d'ubuntu dans le Docker Hub Registry

Plus bas on retrouve, un menu de navigation contenant :

  • DESCRIPTION : Description de l'image, souvent on retrouve quelques tags, la configuration de votre conteneur (par exemple la config de votre base de données pour une image basé sur du mysql) et les liens github vers les sources du projet.
  • REVIEWS : l'avis des utilisateurs
  • TAGS : les différents tags disponible pour cette image
menu de navigation de la page de l'image officielle d'ubuntu dans le Docker Hub Registry

Enfin en haut à droit nous avons la commande à lancer permettant de télécharger l'image sur.

commande pour télécharger une image ubuntu

La deuxième manière pour lister les images disponibles dans le Docker hub Registry, c'est de passer par la ligne de commande :

docker search ubuntu

Résultat:

NAME                                                      DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
ubuntu                                                    Ubuntu is a Debian-based Linux operating sys…   9616                [OK]                
...
pivotaldata/ubuntu-gpdb-dev                               Ubuntu images for GPDB development              0

Si vous souhaitez n'afficher que les images officielles, il est possible de filtrer le résultat avec la commande suivante :

docker search --filter "is-official=true" ubuntu

Vous aurez ainsi beaucoup moins de résultats.

Télécharger une images depuis le Docker Hub Registry

Je pense que vous l'aurez deviné, pour télécharger une image depuis le Docker hub Registry il faut utiliser la commande suivante (précisez le tag si vous souhaitez un tag différent de latest)

docker pull ubuntu

Pour télécharger une image ubuntu avec un autre tag différent de latest par exemple le tag 16.04:

docker pull ubuntu:16.04

Je vais faire un petit coup de docker images pour si mon image s'est bien téléchargée.

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              16.04               2a697363a870        3 weeks ago         119MB
ubuntu              latest              7698f282e524        3 weeks ago         69.9MB
hello-world         latest              fce289e99eb9        5 months ago        1.84kB

Youpi !

Conclusion

Vous savez maintenant lister, télécharger, supprimer et rechercher une image Docker, je vous mets en bas un aide-mémoire des commandes vu ensemble :

## Afficher de l'aide
docker help
docker <sous-commande> --help

## Afficher des informations sur l'installation de Docker
docker --version
docker version
docker info

## Executer une image Docker
docker run hello-world

## Lister des images Docker
docker image ls
# ou
docker images

## Supprimer une image Docker
docker images rmi <IMAGE_ID ou IMAGE_NAME>  # si c'est le nom de l'image qui est spécifié alors il prendra par défaut le tag latest
    -f ou --force : forcer la suppression

## Supprimer tous les images Docker
docker rmi -f $(docker images -q)

## Rechercher une image depuis le Docker hub Registry
docker search ubuntu
    --filter "is-official=true" : Afficher que les images officielles

## Télécharger une image depuis le Docker hub Registry
docker pull <IMAGE_NAME>  # prendra par défaut le tag latest
docker pull ubuntu:16.04 # prendra le tag 16.04

Espace commentaire

Écrire un commentaire

Rejoignez la discussion

Vous devez être connecté pour poster un message.

29 commentaires

ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Pense à bien vérifier tes accès au registry si tu travailles en environnement isolé, les permissions sur le socket Docker /var/run/docker.sock sont souvent la cause des échecs de commande.

20/06/2019 à 01:59
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Oui, utilise docker save. Pour importer, tu utiliseras docker load sur la machine cible :

docker save -o mon_image.tar mon_image:tag
docker load -i mon_image.tar
19/06/2019 à 18:15
lorraine69
Membre Actif
Avatar de lorraine69
lorraine69
Membre Actif

Peut-on exporter une image vers un fichier pour la transférer sur une machine hors ligne ?

19/06/2019 à 12:02
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Oui, tu risques d'avoir une erreur exec format error au moment du lancement. Vérifie bien que l'image que tu télécharges supporte ton architecture avec docker manifest inspect <image>.

19/06/2019 à 05:29
astrid45
Membre Actif
Avatar de astrid45
astrid45
Membre Actif

J'ai un souci avec un docker pull sur une architecture ARM alors que j'ai un serveur x86. Ça peut poser problème ?

18/06/2019 à 21:30
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Utilise des outils comme trivy. C'est le standard actuel pour scanner les vulnérabilités dans les images. Un simple trivy image <nom_image> suffit pour avoir un rapport complet.

18/06/2019 à 15:44

Comment je peux vérifier si une image est vulnérable avant de la pull ?

18/06/2019 à 10:59
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Content que ça t'aide. La notion de couche est fondamentale pour comprendre pourquoi Docker est aussi efficace en termes de stockage et de déploiement.

18/06/2019 à 04:03
clelievre
Membre Actif
Avatar de clelievre
clelievre
Membre Actif

Merci pour le guide, j'ai enfin compris la différence entre un conteneur et une image. C'est beaucoup plus clair avec l'analogie des couches.

17/06/2019 à 22:11
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Docker ne gère pas nativement une limite de taille par cache. La meilleure pratique c'est de mettre en place une tâche cron qui lance docker image prune -a --force --filter "until=24h" pour virer les images inutilisées depuis plus de 24h.

17/06/2019 à 17:29
yves40
Membre Actif
Avatar de yves40
yves40
Membre Actif

C'est possible de limiter la taille du cache des images pour éviter que le disque sature tout seul ?

17/06/2019 à 12:15
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Il faut configurer les variables d'environnement du démon Docker. Crée ou modifie le fichier /etc/systemd/system/docker.service.d/http-proxy.conf :

[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80/"
Environment="HTTPS_PROXY=http://proxy.example.com:80/"

N'oublie pas de faire un systemctl daemon-reload et un systemctl restart docker après.

17/06/2019 à 05:28
joly-emmanuel
Membre Actif
Avatar de joly-emmanuel
joly-emmanuel
Membre Actif

Je bloque sur un docker pull derrière un proxy d'entreprise. Des conseils ?

16/06/2019 à 21:38
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

C'est exactement la même chose. rmi est juste un alias plus court pour image rm. Utilise celui qui te plaît le plus.

16/06/2019 à 16:26
olegros
Membre Actif
Avatar de olegros
olegros
Membre Actif

Question bête : c'est quoi la différence entre docker image rm et docker rmi ?

16/06/2019 à 10:30
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Carrément. Utilise la commande docker history suivie de l'ID de ton image. Ça te montre exactement quelles commandes ont été exécutées à chaque couche.

16/06/2019 à 04:52
lgimenez
Membre Actif
Avatar de lgimenez
lgimenez
Membre Actif

J'ai vu que tu parlais du Dockerfile. On peut voir l'historique des couches d'une image déjà téléchargée ?

16/06/2019 à 00:42
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Oui, utilise le formatage de sortie natif de Docker avec docker images --format :

docker images --format "table {{.Repository}}	{{.Size}}" | sort -k2 -h
15/06/2019 à 19:49
allard-alix
Membre Actif
Avatar de allard-alix
allard-alix
Membre Actif

Est-ce qu'on peut lister les images par taille ? J'ai l'impression d'avoir des images énormes qui polluent mon espace disque.

15/06/2019 à 14:01
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Utilise docker container prune. Ça supprimera tous les conteneurs qui ne sont pas en train de tourner actuellement.

15/06/2019 à 09:48
joseph19
Membre Actif
Avatar de joseph19
joseph19
Membre Actif

Le docker info m'indique 0 conteneur running mais 50 stopped. Comment je peux nettoyer ça proprement sans tout supprimer manuellement ?

15/06/2019 à 03:50
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

Vérifie si ton démon Docker est bien connecté au registre. Parfois, un docker login est nécessaire même pour des images publiques si tu as dépassé les quotas de requêtes anonymes.

14/06/2019 à 20:26
marie-clerc
Membre Actif
Avatar de marie-clerc
marie-clerc
Membre Actif

J'ai une erreur manifest unknown quand je tente un docker pull sur une image spécifique. Le tag existe pourtant bien sur le Hub.

14/06/2019 à 15:19
ajdaini-hatim
Auteur Rédacteur Secouriste Actif
Avatar de ajdaini-hatim
ajdaini-hatim
Auteur Rédacteur Secouriste Actif

À ne jamais faire en prod. Cette commande va supprimer absolument toutes tes images, même celles qui sont utilisées par tes conteneurs actifs.

Vérifie plutôt ce qui prend de la place avec docker system df pour cibler ce que tu peux supprimer sans tout casser.

14/06/2019 à 08:59
joseph-dominique
Membre Actif
Avatar de joseph-dominique
joseph-dominique
Membre Actif

J'essaie de pull une image mais mon disque est plein. Est-ce que docker rmi -f $(docker images -q) est safe à lancer en prod ?

14/06/2019 à 03:16

Rejoindre la communauté

Recevoir les derniers articles gratuitement en créant un compte !

S'inscrire