« Gestion des images dockers Linux » : différence entre les versions
(2 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 54 : | Ligne 54 : | ||
Pour récupérer une autre version de l’image, il faut associer le nom du tag au nom de l’image. Dans l’exemple précédent , pour récupérer la version xenial, il faut utiliser la commande suivante : | Pour récupérer une autre version de l’image, il faut associer le nom du tag au nom de l’image. Dans l’exemple précédent , pour récupérer la version xenial, il faut utiliser la commande suivante : | ||
docker pull ubuntu:xenial | sudo docker pull ubuntu:xenial | ||
[[Fichier:Capture d’écran du 2023-11-07 14-26-01.png|800px|vignette|centré]] | [[Fichier:Capture d’écran du 2023-11-07 14-26-01.png|800px|vignette|centré]] | ||
=== Connaître les images disponibles sur le système === | |||
sudo docker images | |||
[[Fichier:Capture d'écran 2023-11-08 145923.png|800px|vignette|centré]] | |||
=== Supprimer une image === | |||
Voici la commande | |||
sudo docker rmi <nom image> | |||
Il n’est pas possible de supprimer une image si un conteneur associé est exécuté (voir partie suivante) ;une image peut être référencée dans plusieurs référentiels, comme cela est le cas pourhello-world : dans ce cas, il faut utiliser l’option « f ». | |||
Exemple: Supprimer l'image docker de hello-world | |||
sudo docker rmi hello-world -f | |||
[[Fichier:Capture d'écran 2023-11-08 150524.png|800px|vignette|centré]] | |||
== Gestion basique des conteneurs == | |||
=== Lancer un conteneur === | |||
docker run [OPTIONS] <nom image> [COMMANDE] | |||
Selon ce que l’on veut faire, il est possible de lancer un conteneur : | |||
en interactif, si l’on veut agir sur le conteneur pour par exemple le mettre à jour ou installer un paquetage ; | |||
en arrière plan, si l’on veut, par exemple, lancer un service installé dans ce conteneur : le conteneur doit dans ce cas là rester actif : c’est l’usage le plus courant ; | |||
en arrière plan, mais uniquement pour lancer une commande : le conteneur existe toujours mais n’est plus actif : il s’arrête dès que la ou les commandes passées sont exécutées. | |||
Si le conteneur n’était pas déjà téléchargé, la commande run le fait automatiquement (sans requérir un pull spécifique) | |||
La commande suivante lance un conteneur (sans options et commandes spécifiques à exécuter dans le conteneur) à partir de l'image ubuntu : | |||
sudo docker run ubuntu | |||
Mais rien ne semble s’être passé ! | |||
=== Lister les conteneurs en cours d’exécution (actifs) === | |||
sudo docker ps | |||
[[Fichier:Capture d'écran 2023-11-08 151247.png|800px|vignette|centré]] | |||
=== Lister tous les conteneurs qu’ils soient actifs ou non === | |||
sudo docker ps -a | |||
[[Fichier:Capture d'écran 2023-11-08 151304.png|800px|vignette|centré]] | |||
# '''CONTAINER ID''' : ID unique du conteneur. | |||
# '''IMAGE''' : image utilisée pour le conteneur. | |||
# '''COMMAND''' : commande exécutée ⇒ le processus lancé ici est /bin/bash (shell Bash) (il s’agit du processus lancé par défaut prévu par les concepteurs de cette image). | |||
# '''CREATED''' : temps depuis la création du conteneur. | |||
# '''STATUS''' : état du conteneur (en cours ou arrêté) ici exited avec un code retour 0 (sans erreur) ⇒ le processus s’est arrêté de manière normale. | |||
# '''PORTS''' : liste des ports d’écoute (ici aucun), nous verrons cela plus loin. | |||
# '''NAMES''' : nom du conteneur aléatoire (sad_jennings), il est possible de définir un nom personnalisé avec le paramètre --name. | |||
Si on lance de nouveau le conteneur avec la même commande « docker run », ce n’est pas le même conteneur qui est exécuté mais un nouveau conteneur qui est créé. Pour relancer un conteneur, Il faut utiliser la commande « docker start » (voir ci-après). | |||
sudo docker run ubuntu | |||
sudo docker ps -a | |||
[[Fichier:Capture d'écran 2023-11-08 151637.png|800px|vignette|centré]] | |||
Pour lancer un conteneur en lui faisant exécuter une commande spécifique (et non seulement celle prévue par défaut) : | |||
sudo docker run ubuntu cat /etc/lsb-release | |||
[[Fichier:Capture d'écran 2023-11-08 151917.png|800px|vignette|centré]] | |||
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. | |||
Nous pouvons voir qu’un troisième conteneur non actif existe : | |||
docker ps -a | |||
[[Fichier:Capture d'écran 2023-11-08 152028.png|800px|vignette|centré]] | |||
Nous pouvons nous retrouver très facilement avec de multiples conteneurs totalement inutiles qu’il faut supprimer. | |||
=== Supprimer un conteneur === | |||
Voici la cammande | |||
docker rm <id conteneur> ou docker rm <nom du conteneur> | |||
Exemple : supprimer le conteneur dockers naughty_feynman | |||
sudo docker rm naughty_feynman | |||
Voir si le contener et bien supprimé | |||
sudo docker ps -a | |||
[[Fichier:Capture d'écran 2023-11-08 152505.png|800px|vignette|centré]] | |||
Seul un conteneur avec un statut « exited » peut être supprimé. | |||
=== Lancer un conteneur en « programmant » sa suppression === | |||
Si, par exemple, le conteneur a pour seul 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 : cela peut se faire avec l’option « -- rm » : | |||
sudo docker run --rm ubuntu cat /etc/lsb-release | |||
[[Fichier:Capture d'écran 2023-11-08 153107.png|800px|vignette|centré]] | |||
Aucun nouveau conteneur n’apparaît avec la commande docker ps -a | |||
Tant qu’un conteneur n’est pas supprimé, son environnement est sauvegardé et il peut être relancé. | |||
=== Relancer un conteneur === | |||
sudo docker start <id conteneur> ou sudo 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 gracious_alle | |||
=== Lancement d’un conteneur en interactif === | |||
sudo docker run --name servubuntu -it ubuntu | |||
[[Fichier:Capture d'écran 2023-11-08 153948.png|800px|vignette|centré]] | |||
'''Le paramètre --name''' (facultatif) permet de nommer le conteneur pour plus de confort dans sa manipulation future. | |||
'''Le paramètre''' '''« -i »''' permet d’activer le mode interactif, qui récupère l’entrée standard (clavier) et redirige tous les messages sur la sortie standard (écran). | |||
'''Le paramètre''' '''« -t »''' permet d’avoir un pseudo-terminal pour exécuter des commandes dans le conteneur une fois lancé. | |||
Nous pouvons remarquer que nous sommes dans un shell spécifique au conteneur car le prompt contient son identifiant (f37761aae4b0). Depuis une autre console, la commande listant les conteneurs montre que ce conteneur est en cours d’exécution (car nous sommes connectés en mode interactif) : '''status à UP'''. | |||
Il est donc possible d’interagir avec le système pour le mettre à jour par exemple et y installer les applications que l’on veut. | |||
[[Fichier:Capture d'écran 2023-11-08 154130.png|800px|vignette|centré]] | |||
[[Fichier:Capture d'écran 2023-11-08 154340.png|800px|vignette|centré]] | |||
On crée également un utilisateur pour pouvoir se connecter au service ultérieurement. | |||
[[Fichier:Capture d'écran 2023-11-08 154535.png|800px|vignette|centré]] | |||
... | |||
Quand le travail est terminé, on sort du conteneur par la commande exit qui sort du shell courant, et donc du conteneur puisque celui-ci n’a pour but que de faire tourner cet unique processus : le statut du dernier conteneur passe donc à « exited ». | |||
Ce qui a été fait est sauvegardé tant que le conteneur n’est pas supprimé ⇒ même s’il est arrêté, le conteneur contient tous les fichiers ajoutés (typiquement ici le paquet openssh-server et le nouvel utilisateur) | |||
=== Pour le réactiver et y accéder de nouveau en interactif : === | |||
1.sudo docker start servubuntu | |||
2.sudo docker attach servubuntu | |||
=== Pour voir les modifications apportées au conteneur (la commande diff) === | |||
sudo docker diff servubuntu | |||
[[Fichier:Capture d'écran 2023-11-08 154908.png|800px|vignette|centré]] | |||
... | |||
A pour ajout, C pour modification et D pour suppression | |||
Voir les processus lancés dans le conteneur | |||
sudo docker top servUbuntu | |||
[[Fichier:Capture d'écran 2023-11-08 155236.png|800px|vignette|centré]] | |||
Nous pouvons constater que le service « ssh » n’est pas lancé. | |||
[[Fichier:Capture d'écran 2023-11-08 155614.png|800px|vignette|centré]] | |||
[[Fichier:Capture d'écran 2023-11-08 160016.png|800px|vignette|centré]] | |||
=== Création d’une nouvelle image à partir d’un conteneur === | |||
voici la commande | |||
sudo docker commit <nom conteneur> <nom image> | |||
Exemple : en lançant une image ubuntu avec le ssh | |||
sudo docker commit servubuntu ar/ubuntu:ssh | |||
[[Fichier:Capture d'écran 2023-11-08 160447.png|800px|vignette|centré]] | |||
La commande produit un hash permettant au système d’identifier de manière unique la nouvelle image. | |||
Nous constatons qu’une nouvelle image est disponible : | |||
sudo docker images | |||
[[Fichier:Capture d'écran 2023-11-08 160556.png|800px|vignette|centré]] | |||
C’est cette nouvelle image (et non plus l’image téléchargée du Hub) que nous allons exploiter à l’avenir (Il est désormais possible de lancer plusieurs serveurs SSH isolés en rendant ce service accessible . | |||
=== Sauvegarder une image en local === | |||
Il peut être utile de sauvegarder une image localement à des fins d’exploitation sur un autre PC (en attendant de publier notre image sur le Hub officiel ou un autre Hub) : | |||
voici la commande | |||
sudo docker save <image> > <nom_fichier.tar> | |||
Exemple : Sauvegarder l'image ubuntu avec le ssh | |||
sudo docker save ar/ubuntu:ssh > serv_ubuntu-ssh.tar | |||
=== Restaurer depuis un conteneur en local === | |||
voici la commande | |||
sudo docker load -i <nom_fichier.tar> | |||
Exemple : restaurer l'image ubuntu avec le ssh | |||
sudo docker load -i serv_ubuntu-ssh.tar | |||
=== Comment rendre accessible un service === | |||
Ip a^ | |||
... | |||
[[Fichier:Capture d'écran 2023-11-08 161303.png|800px|vignette|centré]] | |||
... | |||
Une commande possible est la suivante : | |||
sudo docker run -d -p <IP:port-hôte:port-conteneur> --name <nom conteneur> <image> COMMANDE | |||
Le paramètre permettant le mappage est '''-p <IP:port-hôte:port-container>''' : | |||
si l’adresse IP réelle de l’hôte n’est pas indiquée, le système n’écoutera que sur localhost ; | |||
si le port de l’hôte à mapper n’est pas indiqué, Docker en choisira un automatiquement. | |||
Le principe est ensuite de lancer le service en même temps que le conteneur sachant que : | |||
le service doit être lancé en premier plan (par exemple /usr/sbin/sshd -D pour le service ssh) | |||
le conteneur sera lancé en arrière plan (sans laisser de console ouverte) en mode « détaché » : c’est '''l’option « -d »''' qui permet cela. | |||
sudo docker run -d -p 192.168.1.46 :22222:22 --name servssh ar/ubuntu:ssh /usr/sbin/sshd -D | |||
[[Fichier:Capture d'écran 2023-11-08 162027.png|800px|vignette|centré]] | |||
[[Fichier:Capture d'écran 2023-11-08 162142.png|800px|vignette|centré]] | |||
Test accès ssh via L'adresse 192.168.1.46 et le port 22222 | |||
[[Fichier:Capture d'écran 2023-11-08 162327.png|800px|vignette|centré]] | |||
Nous pouvons constater via la commande « docker ps » que l’attribut PORT est maintenant rempli : | |||
[[Fichier:Capture d'écran 2023-11-08 162537.png|800px|vignette|centré]] | |||
=== Afficher les logs du conteneur === | |||
Il s’agit d’une commande utile notamment si la création du conteneur se passe mal et si l’accès en ssh n’est pas possible (cette commande ne renvoie rien dans ce cas si tout se passe bien). | |||
sudo docker logs servssh |
Dernière version du 21 novembre 2023 à 08:58
Gestion des images dockers Linux[modifier | modifier le wikicode]
Rechercher un image via le terminal[modifier | modifier le wikicode]
Interroger le dépôt officiel en ligne de commandes sans passer par le site web
Voici la commande
sudo docker search <mot clé>
Exemple: rechercher l'image docker de Ubuntu
sudo docker search ubuntu

La commande renvoie beaucoup de résultats (limités par défaut à 25) et classés par ordre décroissant de popularité
NAME indique le nom de l’image. Les noms des images créées par l’équipe de Docker (comme httpd) ne sont pas précédés par le nom de l’utilisateur qui l’a créée (comme eboraas/apache-php).
DESCRIPTION : décrit l’image et donne des informations sur son contenu.
STARS indique le nombre de fois où l’image a été mise en favori par les utilisateurs, elle donne ainsi une idée sur sa popularité.
OFFICIAL indique si l’image a été produite par une source officielle reconnue par l’équipe de Docker.
AUTOMATED indique si l’image a été créée automatiquement depuis un dépôt GitHub ou Bitbucket.
Il est possible d’affiner cette commande. Comme pour n’importe quelle autre commande, les options sont décrites avec la commande :
docker search --help

L’équivalent de la recherche de la page précédente via le Web donne l’image ci-dessous :

Docker permet d’ajouter un tag à une image. Par défaut c’est la dernière image (latest) qui est téléchargée.
Télécharger une image[modifier | modifier le wikicode]
Voici la commande
sudo docker pull <nom image>
Exemple: Télécharger l'image docker de Ubuntu
sudo docker pull ubuntu

Docker télécharge les différentes couches qui forment l’image.
Pour récupérer une autre version de l’image, il faut associer le nom du tag au nom de l’image. Dans l’exemple précédent , pour récupérer la version xenial, il faut utiliser la commande suivante :
sudo docker pull ubuntu:xenial

Connaître les images disponibles sur le système[modifier | modifier le wikicode]
sudo docker images

Supprimer une image[modifier | modifier le wikicode]
Voici la commande
sudo docker rmi <nom image>
Il n’est pas possible de supprimer une image si un conteneur associé est exécuté (voir partie suivante) ;une image peut être référencée dans plusieurs référentiels, comme cela est le cas pourhello-world : dans ce cas, il faut utiliser l’option « f ».
Exemple: Supprimer l'image docker de hello-world
sudo docker rmi hello-world -f

Gestion basique des conteneurs[modifier | modifier le wikicode]
Lancer un conteneur[modifier | modifier le wikicode]
docker run [OPTIONS] <nom image> [COMMANDE]
Selon ce que l’on veut faire, il est possible de lancer un conteneur : en interactif, si l’on veut agir sur le conteneur pour par exemple le mettre à jour ou installer un paquetage ; en arrière plan, si l’on veut, par exemple, lancer un service installé dans ce conteneur : le conteneur doit dans ce cas là rester actif : c’est l’usage le plus courant ; en arrière plan, mais uniquement pour lancer une commande : le conteneur existe toujours mais n’est plus actif : il s’arrête dès que la ou les commandes passées sont exécutées.
Si le conteneur n’était pas déjà téléchargé, la commande run le fait automatiquement (sans requérir un pull spécifique)
La commande suivante lance un conteneur (sans options et commandes spécifiques à exécuter dans le conteneur) à partir de l'image ubuntu :
sudo docker run ubuntu
Mais rien ne semble s’être passé !
Lister les conteneurs en cours d’exécution (actifs)[modifier | modifier le wikicode]
sudo docker ps

Lister tous les conteneurs qu’ils soient actifs ou non[modifier | modifier le wikicode]
sudo docker ps -a

- CONTAINER ID : ID unique du conteneur.
- IMAGE : image utilisée pour le conteneur.
- COMMAND : commande exécutée ⇒ le processus lancé ici est /bin/bash (shell Bash) (il s’agit du processus lancé par défaut prévu par les concepteurs de cette image).
- CREATED : temps depuis la création du conteneur.
- STATUS : état du conteneur (en cours ou arrêté) ici exited avec un code retour 0 (sans erreur) ⇒ le processus s’est arrêté de manière normale.
- PORTS : liste des ports d’écoute (ici aucun), nous verrons cela plus loin.
- NAMES : nom du conteneur aléatoire (sad_jennings), il est possible de définir un nom personnalisé avec le paramètre --name.
Si on lance de nouveau le conteneur avec la même commande « docker run », ce n’est pas le même conteneur qui est exécuté mais un nouveau conteneur qui est créé. Pour relancer un conteneur, Il faut utiliser la commande « docker start » (voir ci-après).
sudo docker run ubuntu sudo docker ps -a

Pour lancer un conteneur en lui faisant exécuter une commande spécifique (et non seulement celle prévue par défaut) :
sudo docker run ubuntu cat /etc/lsb-release

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.
Nous pouvons voir qu’un troisième conteneur non actif existe :
docker ps -a

Nous pouvons nous retrouver très facilement avec de multiples conteneurs totalement inutiles qu’il faut supprimer.
Supprimer un conteneur[modifier | modifier le wikicode]
Voici la cammande
docker rm <id conteneur> ou docker rm <nom du conteneur>
Exemple : supprimer le conteneur dockers naughty_feynman
sudo docker rm naughty_feynman
Voir si le contener et bien supprimé
sudo docker ps -a

Seul un conteneur avec un statut « exited » peut être supprimé.
Lancer un conteneur en « programmant » sa suppression[modifier | modifier le wikicode]
Si, par exemple, le conteneur a pour seul 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 : cela peut se faire avec l’option « -- rm » :
sudo docker run --rm ubuntu cat /etc/lsb-release

Aucun nouveau conteneur n’apparaît avec la commande docker ps -a Tant qu’un conteneur n’est pas supprimé, son environnement est sauvegardé et il peut être relancé.
Relancer un conteneur[modifier | modifier le wikicode]
sudo docker start <id conteneur> ou sudo 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 gracious_alle
Lancement d’un conteneur en interactif[modifier | modifier le wikicode]
sudo docker run --name servubuntu -it ubuntu

Le paramètre --name (facultatif) permet de nommer le conteneur pour plus de confort dans sa manipulation future. Le paramètre « -i » permet d’activer le mode interactif, qui récupère l’entrée standard (clavier) et redirige tous les messages sur la sortie standard (écran). Le paramètre « -t » permet d’avoir un pseudo-terminal pour exécuter des commandes dans le conteneur une fois lancé.
Nous pouvons remarquer que nous sommes dans un shell spécifique au conteneur car le prompt contient son identifiant (f37761aae4b0). Depuis une autre console, la commande listant les conteneurs montre que ce conteneur est en cours d’exécution (car nous sommes connectés en mode interactif) : status à UP.
Il est donc possible d’interagir avec le système pour le mettre à jour par exemple et y installer les applications que l’on veut.


On crée également un utilisateur pour pouvoir se connecter au service ultérieurement.

... Quand le travail est terminé, on sort du conteneur par la commande exit qui sort du shell courant, et donc du conteneur puisque celui-ci n’a pour but que de faire tourner cet unique processus : le statut du dernier conteneur passe donc à « exited ».
Ce qui a été fait est sauvegardé tant que le conteneur n’est pas supprimé ⇒ même s’il est arrêté, le conteneur contient tous les fichiers ajoutés (typiquement ici le paquet openssh-server et le nouvel utilisateur)
Pour le réactiver et y accéder de nouveau en interactif :[modifier | modifier le wikicode]
1.sudo docker start servubuntu 2.sudo docker attach servubuntu
Pour voir les modifications apportées au conteneur (la commande diff)[modifier | modifier le wikicode]
sudo docker diff servubuntu

... A pour ajout, C pour modification et D pour suppression
Voir les processus lancés dans le conteneur
sudo docker top servUbuntu

Nous pouvons constater que le service « ssh » n’est pas lancé.


Création d’une nouvelle image à partir d’un conteneur[modifier | modifier le wikicode]
voici la commande sudo docker commit <nom conteneur> <nom image>
Exemple : en lançant une image ubuntu avec le ssh
sudo docker commit servubuntu ar/ubuntu:ssh

La commande produit un hash permettant au système d’identifier de manière unique la nouvelle image.
Nous constatons qu’une nouvelle image est disponible :
sudo docker images

C’est cette nouvelle image (et non plus l’image téléchargée du Hub) que nous allons exploiter à l’avenir (Il est désormais possible de lancer plusieurs serveurs SSH isolés en rendant ce service accessible .
Sauvegarder une image en local[modifier | modifier le wikicode]
Il peut être utile de sauvegarder une image localement à des fins d’exploitation sur un autre PC (en attendant de publier notre image sur le Hub officiel ou un autre Hub) :
voici la commande
sudo docker save <image> > <nom_fichier.tar>
Exemple : Sauvegarder l'image ubuntu avec le ssh
sudo docker save ar/ubuntu:ssh > serv_ubuntu-ssh.tar
Restaurer depuis un conteneur en local[modifier | modifier le wikicode]
voici la commande
sudo docker load -i <nom_fichier.tar>
Exemple : restaurer l'image ubuntu avec le ssh
sudo docker load -i serv_ubuntu-ssh.tar
Comment rendre accessible un service[modifier | modifier le wikicode]
Ip a^
...

...
Une commande possible est la suivante :
sudo docker run -d -p <IP:port-hôte:port-conteneur> --name <nom conteneur> <image> COMMANDE
Le paramètre permettant le mappage est -p <IP:port-hôte:port-container> : si l’adresse IP réelle de l’hôte n’est pas indiquée, le système n’écoutera que sur localhost ; si le port de l’hôte à mapper n’est pas indiqué, Docker en choisira un automatiquement.
Le principe est ensuite de lancer le service en même temps que le conteneur sachant que : le service doit être lancé en premier plan (par exemple /usr/sbin/sshd -D pour le service ssh) le conteneur sera lancé en arrière plan (sans laisser de console ouverte) en mode « détaché » : c’est l’option « -d » qui permet cela.
sudo docker run -d -p 192.168.1.46 :22222:22 --name servssh ar/ubuntu:ssh /usr/sbin/sshd -D


Test accès ssh via L'adresse 192.168.1.46 et le port 22222

Nous pouvons constater via la commande « docker ps » que l’attribut PORT est maintenant rempli :

Afficher les logs du conteneur[modifier | modifier le wikicode]
Il s’agit d’une commande utile notamment si la création du conteneur se passe mal et si l’accès en ssh n’est pas possible (cette commande ne renvoie rien dans ce cas si tout se passe bien).
sudo docker logs servssh