Introduction
La fonction de Docker en tant qu’application est de simplifier le processus de gestion des processus d’application dans des conteneurs, ce qui vous permet d’exécuter vos applications via des processus isolés de ressources. Ils présentent des similitudes avec les machines virtuelles, mais les conteneurs sont plus portables, respectueux des ressources et plus dépendants en termes de système d’exploitation hôte.
Dans ce guide, vous allez installer et utiliser Docker Community Edition (CE) sur Ubuntu 20.04 et 22.04 LTS. Vous allez installer Docker lui-même, manipuler les conteneurs et les images, puis placer une image dans un Référentiel Docker.
Prérequis
Vous aurez besoin des éléments suivants pour suivre ce guide:
- Configurer un serveur Ubuntu 20.04 et 22.04 LTS.
- Avoir un compte sur Docker Hub si vous préférez créer des images vous-même et les pousser vers Docker Hub comme vous le verrez aux étapes 7 et 8 de ce guide.
Étape 1 : Installer Docker
Le package d’installation de Docker disponible dans le référentiel officiel Ubuntu n’est probablement pas une version récente. Pour nous assurer que nous obtiendrons cette dernière, nous allons installer Docker à partir du référentiel Docker officiel. Pour cela, nous allons ajouter une nouvelle source de package, donc installez le package après avoir ajouté la clé GPG de Docker pour garantir la validité des téléchargements.
Avant de commencer, vous devrez mettre à jour votre liste de packages existante :
$ sudo apt-get update
Ensuite, pour permettre à apt d’utiliser des packages via HTTPS, vous devrez installer quelques packages prérequis :
$ sudo apt install apt-transport-https ca-certificates curl software-properties-common
Ajoutez maintenant la clé GPG au référentiel Docker officiel de votre système :
$ sudo mkdir -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
Ajoutez maintenant le référentiel Docker aux sources APT:
$ echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Allez-y maintenant et mettez à jour la base de données de packages à l’aide des packages Docker du référentiel nouvellement ajoutés :
$ sudo apt-get update
Vérifiez que vous allez installer à partir du référentiel Docker et non à partir du référentiel Ubuntu par défaut :
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
Docker est maintenant installé, le démon a démarré et le processus activé afin qu’il puisse démarrer au démarrage. Vérifiez qu’il est en cours d’exécution :
$ sudo systemctl status docker
L’output doit montrer que le service est actif et en cours d’exécution et doit ressembler à ceci:
root@ServerB:/home/ubuntu# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2022-07-28 09:49:02 UTC; 8min ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 6958 (dockerd)
Tasks: 8
Memory: 30.2M
CPU: 1.276s
CGroup: /system.slice/docker.service
└─6958 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Maintenant que vous avez installé Docker, vous ne disposez pas uniquement du service Docker (démon), mais également de l’utilitaire de ligne de commande docker ou du client Docker. Nous apprendrons à utiliser la commande docker plus loin dans ce guide.
Étape 2 – Exécuter la commande Docker sans Sudo (Non Obligatoire)
Par défaut, la commande docker ne peut pas être exécutée par un autre utilisateur que l’utilisateur root ou un utilisateur du groupe docker, qui est créé par défaut lors du processus d’installation de Docker. Si vous essayez d’exécuter la commande docker sans la préfixer ou être dans le groupe docker, le résultat sera un output similaire à ce qui suit :
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied
Pour éviter d’avoir à taper sudo chaque fois que vous exécutez la commande docker, vous devez ajouter votre nom d’utilisateur au groupe docker:
$ sudo usermod -aG docker ${USER}
Déconnectez-vous du serveur et reconnectez-vous ou saisissez ce qui suit pour appliquer la nouvelle affiliation au groupe:
$ su - ${USER}
Pour continuer, il vous sera demandé de saisir le mot de passe de votre utilisateur:
Tapez ce qui suit pour confirmer que votre utilisateur est maintenant ajouté au groupe docker:
$ id -nG
ubuntu adm cdrom sudo dip plugdev lxd docker
Si nécessaire, vous pouvez déclarer explicitement le nom d’utilisateur de l’utilisateur que vous devez ajouter au groupe docker avec lequel vous n’êtes pas connecté, en utilisant:
$ sudo usermod -aG docker username
Le reste de ce guide est basé sur le fait que vous exécutez la commande docker en tant qu’utilisateur dans le groupe docker. Si vous préférez ne pas le faire, allez-y et ajoutez les commandes avec sudo.
Étape 3 – Utiliser la commande Docker
L’utilisation de docker signifie le passer sur une chaîne d’options et de commandes après quoi viendront des arguments. La syntaxe ressemble à ce qui suit:
$ docker [option] [command] [arguments]
$ docker -v
ubuntu@ServerB:~$ docker -v
Docker version 20.10.17, build 100c701
Pour visualiser toutes les sous-commandes disponibles, tapez:
$ docker
La liste complète de toutes les sous-commandes possibles comprend :
Commands:
attach Attach local standard input, output, and error streams to a running container
build Build an image from a Dockerfile
commit Create a new image from a container's changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes to files or directories on a container's filesystem
events Get real time events from the server
exec Run a command in a running container
export Export a container's filesystem as a tar archive
history Show the history of an image
images List images
import Import the contents from a tarball to create a filesystem image
info Display system-wide information
inspect Return low-level information on Docker objects
kill Kill one or more running containers
load Load an image from a tar archive or STDIN
login Log in to a Docker registry
logout Log out from a Docker registry
logs Fetch the logs of a container
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
ps List containers
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
save Save one or more images to a tar archive (streamed to STDOUT by default)
search Search the Docker Hub for images
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
version Show the Docker version information
wait Block until one or more containers stop, then print their exit codes
Pour visualiser les options possibles pour une commande spécifique, tapez:
$ docker docker-subcommand --help
Pour visualiser les informations à l’échelle du système concernant Docker, tapez:
$ docker info
Dans cette prochaine étape, nous explorerons certaines de ces images.
Étape 4 : Gérer les Images Docker
Les images Docker sont utilisées pour créer des conteneurs Docker. Docker extrait ces images de Docker Hub par défaut, qui est un registre Docker géré par Docker. Il est possible pour n’importe qui d’utiliser Docker Hub pour héberger ses images, donc la grande majorité des applications et des distributions Linux dont vous aurez besoin y auront des images hébergées.
Pour vérifier si vous avez accès et pouvez télécharger les images trouvées sur Docker Hub, tapez:
$ docker run hello-world
La sortie suivante vous indiquera que Docker fonctionne correctement :
ubuntu@ServerB:~$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:53f1bbee2f52c39e41682ee1d388285290c5c8a76cc92b42687eecf38e0af3f0
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
Docker n’a d’abord pas été en mesure de trouver l’image hello-world localement, il a donc procédé à la télécharger à partir de Docker Hub, qui est le référentiel par défaut. Une fois l’image téléchargée, Docker a créé un conteneur à partir de celle-ci et a exécuté l’application à l’intérieur du conteneur, tout en affichant finalement le message.
Vous pouvez trouver les images disponibles sur Docker Hub à l’aide de la commande docker et de la sous-commande de recherche. Par exemple, pour trouver l’image Ubuntu, vous devez taper:
$ docker search ubuntu
Le script ira sur Docker Hub et affichera une liste de toutes les images dont le nom correspond à la requête de recherche. Dans ce cas, l’output ressemblera à ceci :
ubuntu@ServerB:~$ docker search ubuntu
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating sys… 14664 [OK]
websphere-liberty WebSphere Liberty multi-architecture images … 286 [OK]
ubuntu-upstart DEPRECATED, as is Upstart (find other proces… 112 [OK]
neurodebian NeuroDebian provides neuroscience research s… 92 [OK]
ubuntu/nginx Nginx, a high-performance reverse proxy & we… 55
open-liberty Open Liberty multi-architecture images based… 53 [OK]
ubuntu-debootstrap DEPRECATED; use "ubuntu" instead 46 [OK]
ubuntu/apache2 Apache, a secure & extensible open-source HT… 39
ubuntu/mysql MySQL open source fast, stable, multi-thread… 36
kasmweb/ubuntu-bionic-desktop Ubuntu productivity desktop for Kasm Workspa… 31
...
Une fois que vous avez sélectionné l’image que vous allez utiliser, vous pouvez la télécharger sur votre ordinateur à l’aide de la sous-commande pull.
$ docker pull ubuntu
L’output que vous obtiendrez ressemblera à ceci :
ubuntu@ServerB:~$ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
405f018f9d1d: Pull complete
Digest: sha256:b6b83d3c331794420340093eb706a6f152d9c1fa51b262d9bf34594887c2c7ac
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
Une fois qu’une image a été téléchargée, vous pouvez exécuter un conteneur en utilisant l’image téléchargée avec la sous-commande run. Comme vous l’avez vu avec l’exemple hello-world, si une image n’a pas été téléchargée lorsque docker est exécuté avec la sous-commande run, le client Docker téléchargera d’abord l’image, puis exécutera un conteneur en l’utilisant.
Pour afficher les images téléchargées sur votre ordinateur, saisissez ce qui suit:
$ docker images
L’output ressemblera à ceci :
ubuntu@ServerB:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 27941809078c 7 weeks ago 77.8MB
hello-world latest feb5d9fea6a5 10 months ago 13.3kB
Vous verrez plus tard dans ce tutoriel comment vous pouvez modifier les images que vous utilisez pour exécuter des conteneurs et les utiliser pour générer de nouvelles images qui peuvent ensuite être insérées (push est le terme technique) dans Docker Hub ou d’autres registres Docker.
Étape 5 : Exécuter un Conteneur dans Docker
Le conteneur hello-world que vous avez exécuté dans la dernière étape est un exemple de conteneur qui, après avoir émis un message de test, s’exécutera et se fermera. Les conteneurs peuvent être plus utiles que cela, ainsi qu’interactifs. Ils fonctionnent un peu comme des machines virtuelles, la seule différence est qu’elles sont plus respectueuses des ressources.
À titre d’exemple, exécutons un conteneur et utilisons l’image la plus récente d’Ubuntu. La combinaison des switch -i et -t vous donnera un accès shell interactif dans le conteneur:
$ docker run -it ubuntu
Votre invite de commande doit être reformulée pour montrer que vous travaillez maintenant à l’intérieur du conteneur et devrait ressembler à ceci :
ubuntu@ServerB:~$ docker run -it ubuntu
root@a9bb67c47592:/#
Regardez attentivement l’ID du conteneur dans l’invite de commande qui est d9b100f2f636 ici. Cet ID de conteneur est ultérieurement nécessaire pour identifier le conteneur lorsque vous souhaitez le supprimer.
Vous pouvez maintenant exécuter n’importe quelle commande à l’intérieur du conteneur. Par exemple, lors de la mise à jour de la base de données du package à l’intérieur du conteneur, vous n’aurez pas besoin de préfixer une commande avec sudo, car vous travaillez à l’intérieur du conteneur en tant qu’utilisateur root:
root@a9bb67c47592:/# apt update
Maintenant, allez-y et installez n’importe quelle application dedans, Node.js par exemple:
root@a9bb67c47592:/# apt install nodejs
Cela installera Node.js dans le conteneur trouvé dans le référentiel officiel Ubuntu. Une fois installé, vérifiez-le via:
root@a9bb67c47592:/# node -v
Le numéro de version sera affiché dans votre terminal :
v12.22.9
Toutes les modifications que vous apportez à l’intérieur du conteneur ne s’appliqueront qu’à ce conteneur.
Tapez exit dans l’invite pour quitter le conteneur.
Étape 6 – Gérer les Conteneurs dans Docker
Une fois que vous êtes sur Docker depuis un certain temps, vous remarquerez qu’il existe de nombreux conteneurs actifs (en cours d’exécution) et inactifs sur votre ordinateur. Pour visualiser les actifs, utilisez:
$ docker ps
L’output que vous obtiendrez est similaire à celui-ci :
ubuntu@ServerB:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Vous avez commencé deux conteneurs jusqu’à présent dans les étapes précédentes; un de l’image hello-world et le second de l’image ubuntu. Les deux ne fonctionnent plus, mais ils sont toujours sur votre système.
Pour visualiser les conteneurs actifs et inactifs, exécutez docker ps avec le switch -a:
$ docker ps -a
Vous obtiendrez un output similaire:
ubuntu@ServerB:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a9bb67c47592 ubuntu "bash" 6 minutes ago Exited (127) 27 seconds ago magical_shirley
ee421c96d926 hello-world "/hello" 30 minutes ago Exited (0) 30 minutes ago wonderful_raman
Passez le switch -l pour visualiser le dernier conteneur que vous avez créé:
$ docker ps -l
ubuntu@ServerB:~$ docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a9bb67c47592 ubuntu "bash" 15 minutes ago Exited (127) 10 minutes ago magical_shirley
Utilisez docker start pour démarrer un conteneur arrêté, suivi de l’ID du conteneur ou de son nom. Commençons celui qui est basé sur Ubuntu avec l’ID de a9bb67c47592:
$ docker start a9bb67c47592
Vous pouvez utiliser docker ps pour voir l’état du conteneur une fois qu’il démarre :
ubuntu@ServerB:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a9bb67c47592 ubuntu "bash" 23 minutes ago Up About a minute magical_shirley
Utilisez docker stop pour arrêter un conteneur en cours d’exécution, suivi de son ID ou de son nom. Cette fois, nous utiliserons le nom que Docker a attribué au conteneur, à savoir quizzical_mcnulty:
$ docker stop magical_shirley
Lorsque vous n’avez plus besoin d’un conteneur, vous pouvez le supprimer avec la commande docker rm, cette fois également en utilisant soit l’ID du conteneur, soit son nom. Utilisez la commande docker ps -a pour trouver le nom ou l’ID du conteneur associé à l’image hello-world et supprimez-le.
$ docker rm wonderful_raman
Vous pouvez créer un nouveau conteneur et le nommer à l’aide du switch –name. Il est également possible d’utiliser le switch –rm pour démarrer un conteneur qui se supprime lorsqu’il est arrêté. Consultez la commande docker run help pour plus d’informations sur ces options et d’autres.
Les conteneurs peuvent être transformés en images qui peuvent être utilisées pour créer de nouveaux conteneurs.
Étape 7 : Apporter des Modifications à l’intérieur d’un Conteneur à une Image sur Docker
Vous pouvez créer, modifier et supprimer des fichiers comme avec une machine virtuelle lorsque vous démarrez une image Docker. Les modifications que vous apportez s’appliqueront à ce seul conteneur. Vous pouvez le démarrer et l’arrêter, mais une fois que vous utilisez la commande docker rm pour le détruire, les modifications seront définitivement perdues.
Cette partie vous montrera comment enregistrer l’état d’un conteneur en tant que nouvelle image Docker.
Une fois que vous avez installé Node.js dans le conteneur Ubuntu, vous en avez maintenant un qui s’exécute à partir d’une image, mais le conteneur n’est pas le même que l’image que vous avez utilisée pour le créer. Mais vous voudrez peut-être utiliser ce conteneur Node.js une autre fois comme base pour de nouvelles images plus tard.
Ensuite, apportez les modifications à une nouvelle instance d’image Docker avec la commande suivante.
$ docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name
Le Switch -m
est lié au message de validation qui vous aide, ainsi que les autres, à identifier les modifications que vous avez apportées, cependant -a est utilisé pour spécifier l’auteur.container_id
est celui que vous avez vu plus haut dans ce guide lorsque vous avez lancé la session Docker interactive. référentiel
est généralement votre nom d’utilisateur Docker Hub, sauf si vous avez créé de nouveaux référentiels sur Docker Hub.
Par exemple, pour l’utilisateur Ubuntu dont l’ID de conteneur est a9bb67c47592, la commande serait :
$ docker commit -m "added Node.js" -a "ubuntu" a9bb67c47592 ubuntu/ubuntu-nodejs
Une fois que vous avez validé une image, la nouvelle est enregistrée localement sur votre ordinateur. Vous apprendrez plus tard dans ce guide comment pousser une image vers un registre Docker tel que Docker Hub afin que d’autres personnes puissent y avoir accès.
Répertorier les images Docker visualisera à la fois les nouvelles et les anciennes dont elles proviennent:
$ docker images
Vous verrez l’output suivant :
ubuntu@ServerB:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu/ubuntu-nodejs latest 45f8857f0719 9 seconds ago 197MB
...
Dans ce cas, ubuntu-nodejs est la nouvelle image qui a été extraite de l’image ubuntu existante de Docker Hub. La différence de taille reflète les modifications apportées. Et ici, le changement est que Node.js a été installé. La prochaine fois que vous devrez exécuter un conteneur avec Ubuntu avec Node.js préinstallé, vous pourrez simplement utiliser cette image.
Vous pouvez également créer des images à partir d’un Dockerfile qui vous permet d’automatiser l’installation du logiciel dans une nouvelle image. Cependant, cela n’a aucun rapport avec ce guide.
Étape 8 : Pousser une Image Docker vers un Référentiel Docker
La prochaine étape évidente après la création d’une nouvelle image à partir d’une image existante est de la partager avec quelques personnes que vous sélectionnez, le grand public sur Docker Hub ou un autre registre Docker auquel vous pouvez accéder. Pour pousser une image vers Docker Hub ou tout autre registre Docker, vous devez y avoir un compte.
Pour ce faire, vous devez d’abord vous connecter à Docker Hub.
$ docker login -u docker-registry-username
Vous serez invité à vous authentifier à l’aide de votre mot de passe Docker Hub.
Remarque: Si votre nom d’utilisateur du registre Docker diffère du nom d’utilisateur local que vous avez utilisé pour créer l’image, vous devrez identifier votre image avec votre nom d’utilisateur du registre. Dans le cas du dernier exemple, vous saisiriez:
$ docker tag ubuntu/ubuntu-nodejs docker-registry-username/ubuntu-nodejs
Ensuite, vous pourrez pousser votre propre image en utilisant:
$ docker push docker-registry-username/docker-image-name
Pour pousser l’image ubuntu-nodejs dans le référentiel Ubuntu, utilisez la commande suivante :
$ docker push ubuntu/ubuntu-nodejs
Soyez patient, car le processus prend du temps pendant le téléchargement des images, mais une fois terminé, l’output sera similaire à ceci :
The push refers to a repository [docker.io/ubuntu/ubuntu-nodejs]
e3fbbfb44187: Pushed
5f70bf18a086: Pushed
a3b5c80a4eba: Pushed
7f18b442972b: Pushed
3ce512daaf78: Pushed
7aae4540b42d: Pushed
...
S’il y a une erreur de ce type, c’est peut-être parce que vous ne vous êtes pas connecté :
The push refers to a repository [docker.io/ubuntu/ubuntu-nodejs]
e3fbbfb44187: Preparing
5f70bf18a086: Preparing
a3b5c80a4eba: Preparing
7f18b442972b: Preparing
3ce512daaf78: Preparing
7aae4540b42d: Waiting
unauthorized: authentication required
Connectez-vous avec l’identifiant Docker et redémarrez le processus de poussée. Vérifiez ensuite qu’il se trouve bien sur votre page de référentiel Docker Hub.
Il vous est maintenant possible d’utiliser docker pull ubuntu/ ubuntu-nodejs pour extraire l’image vers une nouvelle machine et l’exécuter.