Outils pour utilisateurs

Outils du site


reseau:docker:utiliserdocker

Activité : découvrir Docker

Pour cette découverte de Docker, vous pouvez :

Un premier conteneur

Lancement sans option d’un conteneur

Cette commande lance le classique Hello world ! :

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c1ec31eb5944: Already exists 
Digest: sha256:305243c734571da2d100c8c8b3c3167a098cab6049c9a5b066b6021a60fcb966
Status: Downloaded newer image for hello-world:latest
 
Hello from Docker!
This message shows that your installation appears to be working correctly.
 
To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.
 
To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash
 
Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/
 
For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Ce qu’il faut retenir de l’exécution de cette commande :

  • La première ligne indique que l’image du conteneur 'hello-world:latest' n’est pas disponible localement c’est-à-dire sur voter ordinateur. De plus, comme aucune version du conteneur n’est précisée, c’est la dernière version disponible, la latest qui est recherchée.
  • L’image recherchée est alors tirée (pull) de Docker Hub depuis Internet.
  • Une explication des étapes réalisées est indiquée : le client Docker, la session de terminal de votre ordinateur, contacte le daemon Docker de votre ordinateur (le service Docker) qui tire l’image du conteneur depuis Docker Hub, crée un container, exécute ce qui est prévu dans l’image du conteneur (la production du texte à afficher) et envoie cette sortie texte vers le client Docker votre terminal.
  • Le conteneur est ensuite arrêté automatiquement car le traitement prévu s’est effectué, l’affichage du texte et rien d’autre.

Afficher les images Docker présentes sur la machine

$ docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    d2c94e258dcb   19 months ago   13.3kB

Vous pouvez vérifier la présence de l’image qui a été tirée (pull) de Docker Hub et stockée sur votre serveur. Docker gère un cache des images sur la machine. Lors du prochain démarrage d’une instance de conteneur sur la même image il n’y aura pas de nouveau téléchargement sauf si elle a été modifiée entre-temps.

INFORMATION
Pour en savoir plus sur une image il suffit de faire une recherche sur Docker Hub. Pour le conteneur hello-world : https://hub.docker.com/_/hello-world

Explication des tags

  • Le TAG associé à l’image hello-world est latest et est le marqueur de version de l’image.
  • IMAGE ID est l’identifiant unique de l’image.
  • CREATED est la date de création de l’image publiée sur le site Docker Hub.
  • SIZE est sa taille virtuelle, c’est-à-dire de la couche logicielle téléchargée.

Lister les conteneurs actifs

L’image du conteneur hello-world est présente sur votre serveur mais après le lancement d’un conteneur basé sur cette image, vous avez retrouvé l’invite de commandes de votre serveur. Le conteneur lancé s’est ensuite arrêté automatiquement. Mais existe-il toujours ?

Pour constater que le conteneur lancé est bien arrêté vous pouvez visualiser les conteneurs actifs :

$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

Le conteneur hello-world n’est effectivement plus actif.

Lister tous les conteneurs y compris ceux qui sont inactifs

Relancez le conteneur hello-world. Vous pouvez à nouveau vérifier que celui n’est pas actif après l’affiche du texte prévu.

Visualisez maintenant tous les conteneurs créés, qu’ils soient actifs ou non :

$ docker ps -a
CONTAINER ID IMAGE        COMMAND  CREATED        STATUS                   PORTS NAMES
be16991ea477 hello-world  "/hello" 4 minutes ago  Exited (0) 4 minutes ago       crazy_cartwright
7905287e58fc hello-world  "/hello" 15 minutes ago Exited (0) 15 minutes ago      elastic_hawking

Les 2 conteneurs basés sur la même image hello-world, sont bien présents mais arrêtés sans erreur normale (code de sortie 0) comme le montre le champ STATUS : Exited (0). Le premier conteneur s’est arrête il y a 15 minutes, le 2ème il y a 4 minutes.

Chaque conteneur :

  • possède un identifiant de conteneur CONTAINER ID,
  • et un nom, NAMES, qui a été généré par de démon Docker.

La colonne COMMAND nous renseigne sur le processus qui avait été lancé, à savoir un script hello.

Comprendre le système de couche logicielle des images Docker

Récupérer une image dans sa dernière version

$ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
de44b265507a: Pull complete 
Digest: sha256:80dd3c3b9c6cecb9f1667e9290b3bc61b78c2678c02cbdae5f0fea92cc6734ab
Status: Downloaded newer image for ubuntu:latest

Le TAG est latest par défaut si vous ne précisez pas la version du conteneur voulu. Cette image ubuntu est une image officielle ; elle n’est pas préfixée et vous pouvez avoir des informations sur Docker hub.

Lien : https://hub.docker.com/

Cette image est basée sur une couche logicielle :

…
de44b265507a: Pull complete 
…

INFORMATION
Le chargement de ce conteneur ubuntu et de sa couche logicielle nécessaire a lieu une fois pour toutes. Tous les lancements de conteneur suivant se baseront sur cette image, y compris - et c’est une des grands avantages de l’architecture par couches - toutes les images qui se trouvent sur Docker Hub et qui ont été construites à partir de cette image ubuntu. Et il existe sur Docker Hub de nombreuses images basées sur Ubuntu qui est une distribution de base fréquemment utilisée pour les images Docker.

Lancez un conteneur Ubuntu. Comme précédemment, le conteneur est ensuite arrêté mais existe bien. La colonne COMMAND indique que le processus qui a été lancé est cette fois-ci un shell Bash.

$ docker run ubuntu
$ docker ps -a
CONTAINER ID IMAGE  COMMAND     CREATED  STATUS   PORTS  NAMES
b5ec671c6d11 ubuntu "/bin/bash" 21 s ago Exited …       laughing_ride
…

Vous pouvez prendre connaissance de la configuration du conteneur sur Docker Hub en consultant son fichier Dockerfile.

IMPORTANT
Le fichier Dockerfile associé à une image Docker, décrit exactement comment l’image a été construite. Quand vous recherchez sur Docker Hub une image qui doit répondre à votre besoin et qui a été publié par un membre de la communauté, ce fichier vous permet de savoir ce que contient l’image afin de vous permettre de faire un choix éclairé parmi la profusion d’images possibles. Une bonne pratique consiste donc :

  • à choisir une image officielle si celle-ci répond à votre besoin,
  • et, si cela n’est pas le cas, à choisir une image de la communauté en regardant si elle est souvent utilisée (sa popularité), sa documentation mais aussi son fichier Dockerfile pour savoir exactement ce qu’elle contient.

Sur Docker Hub plusieurs Dockerfile sont indiqués pour l’image officielle ubuntu :

Télécharger l’image Docker ubuntu :noble-20241118.1

$ docker pull ubuntu:noble-20241118.1
focal-20241011: Pulling from library/ubuntu
d9802f032d67: Pull complete 
Digest: sha256:8e5c4f0285ecbb4ead070431d29b576a530d3166df73ec44affc1cd27555141b
Status: Downloaded newer image for ubuntu:focal-20241011
docker.io/library/ubuntu:focal-20241011
 
$ docker images
REPOSITORY   TAG                IMAGE ID       CREATED       SIZE
ubuntu       latest             b1d9df8ab815   2 weeks ago   78.1MB
ubuntu       noble-20241118.1   b1d9df8ab815   2 weeks ago   78.1MB

Il s’agit exactement de la même image comme le montre le champ IMAGE ID. Vous pouvez donc télécharger une version plus ancienne d’Ubuntu si votre projet porte sur une version bien précise de cet OS et faire cohabiter ensuite des conteneurs utilisant des versions différentes de système d’exploitation ou de paquets logiciels.

Le champ SIZE indique la taille virtuelle de l’image, c’est à dire la taille de la couche téléchargée qui est plus important que celle du conteneur hello-world car l’image ubuntu ne s’appuie pas sur une couche préexistante.

Pour connaître comment une image a été construite, consultez sur DockerHub, le fichier Dockerfile.

  • Exemple pour l'image Debian
# this isn't used for the official published images anymore, but is included for backwards compatibility
# see https://github.com/docker-library/bashbrew/issues/51
FROM scratch
ADD oci/blobs/rootfs.tar.gz /
CMD ["bash"]

La première ligne - FROM scratch - indique que cette image ne se base pas sur une image préexistante. On part de la version de base d’Ubuntu. La dernière ligne - CMD [“bash”] - indique le processus qui doit être lancé par le conteneur et qui est ici un shell Bash.

Sans rentrer dans le détail du contenu du fichier Dockerfile, les différentes actions décrites dans ce fichier se sont traduites par le téléchargement d'une couche de l’image Debian.

Utiliser les conteneurs

Le conteneur ubuntu lancé prévoit bien l’exécution d’un processus shell mais il s’est ensuite automatiquement arrêté. En effet, comme rien n’a été précisé lors du lancement pour que vous puissiez utiliser ce shell, le conteneur a considéré que l’action à faire, lancer un shell et rien d’autre, est terminée. Il s’arrête donc.

Lancer un conteneur en lui faisant exécuter une commande spécifique (et non seulement celle prévue par défaut)

$ docker run ubuntu cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=24.04
DISTRIB_CODENAME=noble
DISTRIB_DESCRIPTION="Ubuntu 24.04.1 LTS"

La commande run a lancé un conteneur à partir de l’image ubuntu et a exécuté dessus la commande cat pour afficher le fichier de version d’ubuntu.

Pour visualiser l'existance de ce conteneur non actif avec, dans la colonne COMMAND “cat /etc/lsb-release” ;

$ docker ps -a
CONTAINER ID  IMAGE  COMMAND                CREATED        STATUS                PORTS NAMES
907a2cb48db5  ubuntu "cat /etc/lsb-release" 44 seconds ago Exited (0) 43 s       distracted_wilbur

Il est ainsi possible de retrouver très facilement de multiples conteneurs totalement inutiles qu’il faut supprimer.

Supprimer un conteneur

docker rm <id conteneur> ou docker rm <nom du conteneur>

$ docker rm distracted_wilbur

Seul un conteneur avec un statut exited peut être supprimé. Si un conteneur est actif, il faut soit le stopper avant soit utiliser l’option -f : docker rm -f <conteneur>

Lancer un conteneur en programmant sa suppression

Si, par exemple, le conteneur a pour seule vocation de lancer une commande, il est inutile de le conserver sur la machine hôte et il peut être supprimé dès qu’il a rempli sa fonction, comme nous l’avons fait avec le conteneur hello-world : cela peut se faire avec l’option – rm :

$  docker run --rm ubuntu cat /etc/lsb-release

Tant qu’un conteneur n’est pas supprimé, son environnement est sauvegardé et il peut être relancé.

Relancer un conteneur

docker start <id conteneur> ou docker start <nom du conteneur>

  • Par défaut, le conteneur est relancé en arrière plan, donc rien ne s’affiche, pour le lancer au premier plan, il faut utiliser l’option -a.
$  docker start -a laughing_ride

Lancer un conteneur en mode interactif

Pour pouvoir réellement interagir et utiliser le conteneur ubuntu grâce à ce processus de shell Bash qui est lancé, il faut :

  • lancer le conteneur en mode interactif pour lui associer une console TTY : paramètre -i,
  • ouvrir une console pour que vous puissiez saisir des commandes : paramètre -t.
$ docker run -i -t ubuntu
root@394beb25ab78:/# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
root@394beb25ab78:/# cd /root
root@394beb25ab78:/# touch docker.txt
root@394beb25ab78:/# ls
docker.txt
root@394beb25ab78:/#

Le lancement du conteneur est toujours aussi rapide et le résultat de la commande est différent puisque vous avez le shell du conteneur avec comme nom l’identifiant du nouveau conteneur lancé.

Vous êtes identifiés comme root sur la VM nommée 394beb25ab78 qui est l’identifiant du nouveau conteneur lancé et qui a servi à attribuer un nom à la VM.

La commande ls montre l’arborescence de la VM et non celle du serveur Ubuntu. Un fichier a été créé dans le dossier /root.

Tapez Exit pour revenir à la machine hôte en sortant du shell et donc du conteneur qui ne faisant que tourner cet unique processus s’arrête.

IMPORTANT
Toutes les modifications effectuées dans le conteneur lancé, comme la création de ce fichier docker.txt, ne modifie pas l’image ubuntu qui a servi à sa création. Les modifications ne sont faites que dans une nouvelle couche ajoutée par Docker pour gérer les modifications du système de fichiers afin de n’avoir aucun impact sur la couche inférieure, la couche ubuntu. En lançant un nouveau conteneur, vous consterez que le dossier root ne contient pas de fichier docker.txt.

Pour lancer un conteneur arrêté avec son identifiant ou son nom :

$ docker start ID_ou_son_nom

Autre commande pour visualiser les conteneurs actifs

$ docker container ls

Lancer un conteneur en mode détaché

Lors du lancement d’un conteneur, on perd l’accès à la console du serveur Ubuntu. Cette commande permet de lancer le conteneur et de retrouver le shell du serveur sans arrêter le conteneur.

$ docker run -i -t -d ubuntu
e70a11313849c4c2ce8beebe72935368b909759ab5eb4e2c2f1bcf715c1a2bd1
$ docker ps
CONTAINER ID IMAGE  COMMAND     CREATED        STATUS PORTS NAMES
e70a11313849 ubuntu "/bin/bash" 3 seconds ago  Up 2 s       gallant_kilby

On peut aussi écrire les paramètres de la façon suivante :

$ docker run -itd ubuntu

Se connecter à un conteneur lancé

Après le lancement d’un conteneur en mode détaché, il peut être nécessaire de pouvoir accéder à la console du conteneur et donc au shell. Voici deux manières de procéder.

  • S’attacher à la console du conteneur : ATTENTION, en quittant le shell, cela arrête le processus shell et donc le conteneur :
$ docker attach gallant_kilby
root@e70a11313849:/#
  • Pour quitter le conteneur mais en le laissant s’exécuter en arrière-plan :
Ctrl + p + q.
  • Pour lancer un processus shell (commande ls par exemple) dans un conteneur en cours d'exécution :
$ docker exec -it gallant_kilby ls
bin
boot
dev
...
$ 

Obtenir la liste des modifications d’un conteneur par rapport à son image de lancement

$ docker diff 394beb25ab78
C /root
A /root/.bash_history
A /root/docker.txt
$

Cette commande utilise la syntaxe diff/patch en Linux :

  • D pour les parties d’arborescence supprimées,
  • C pour les parties d’arborescence créées : le dossier /root
  • A pour les ajouts : le fichier .bash_history est créé automatiquement pour stocker l’historique des actions effectuées dans le shell, et le fichier docker.txt que vous avez créé manuellement.

Conteneurs et variables d'environnement

  • Modification du point d’entrée par défaut (action par défaut au lancement du conteneur) : Lancer un conteneur basée sur l’image Ubuntu qui liste les variables d’environnement présentes dans l’image.
$ docker run ubuntu env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=9a123737965f
HOME=/root
  • Injecter une variable d’environnement au démarrage d’un conteneur en faisant remonter la variable LOGNAME dans un conteneur.
$ docker run -i -t -e=LOGNAME ubuntu
root@41716d7ee125:/# env
HOSTNAME=41716d7ee125
PWD=/
LOGNAME=smb101
HOME=/root
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:
TERM=xterm
SHLVL=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/env
  • Création d’une variable d’environnement qui n’existe pas sur l’hôte pour spécifier au conteneur l’adresse IP 192.168.1.200 d’un service Web nécessaire pour la réalisation de sa tâche
$ docker run -e=IPAPIWEB="192.168.1.200" ubuntu env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=2352eb733166
IPAPIWEB=192.168.1.200
HOME=/root
  • Modification du hostname au démarrage du conteneur
$ docker run -it -h idefix ubuntu
root@idefix:/#

Quelques autres commandes de Docker

Supprimer un conteneur

docker rm [identifiant ou nom du conteneur]

Faire le ménage

La commande system et sa sous-commande prune permettant de réaliser le ménage dans les conteneurs arrêtés, les images orphelines et d’autres ressources a priori non utilisées, sans supprimer les images.

docker system prune

Supprimer une image

Les conteneurs qui utilisent cette image doivent au préalable avoir été supprimés. Le paramètre -f force cependant la suppression si cela n’est pas le cas.

docker rmi [identifiant ou nom de l’image]

Lancer un conteneur avec un nom donné

docker run --name=[nom fourni] [image]

Lancer un conteneur en mode détaché

Lors du lancement d’un conteneur, on perd l’accès à la console du serveur Ubuntu. Cette commande permet de lancer le conteneur et de retrouver le shell du serveur sans arrêter le conteneur.

$ docker run -i -t -d ubuntu
e70a11313849c4c2ce8beebe72935368b909759ab5eb4e2c2f1bcf715c1a2bd1
$ docker ps
CONTAINER ID IMAGE  COMMAND     CREATED        STATUS PORTS NAMES
e70a11313849 ubuntu "/bin/bash" 3 seconds ago  Up 2 s       gallant_kilby

Se connecter à un conteneur lancé

Pour accéder ensuite à ce conteneur on utilise la commande attach avec l’identifiant ou le nom du conteneur :

$ docker attach e70a11313849
root@e70a11313849:/#

Arrêter un conteneur

docker stop [conteneur]

Démarrer un conteneur arrêté

docker start [conteneur]

Docker propose également un guide de découverte de Docker (en anglais) avec son ordinateur personnel ou bien en ligne dans un lab (Cloud) : https://www.docker.com/101-tutorial

Autres ressources :

Mémento Docker

Retour Accueil Docker

reseau/docker/utiliserdocker.txt · Dernière modification: 2024/12/10 16:41 de techer.charles_educ-valadon-limoges.fr