Docker est un outil permettant de créer des conteneurs, c’est-à-dire des environnements virtuels permettant d’exécuter des applications de manière isolée et identique sur n’importe quelle machine. C’est un projet Open Source qui est très populaire et qui est aujourd’hui utilisé par une majorité d’entreprises pour des besoins de développement, de test et de production.
Nous allons rapidement voir ce qu’est un conteneur, comment Docker fonctionne et comment l’utiliser. Nous allons fonctionner avec un apprentissage par l’exemple, il va donc falloir installer Docker sur votre machine :
- sur Windows : docs.docker.com/desktop/install/windows-install/
- sur macOS : docs.docker.com/desktop/install/mac-install/
- sur Linux : docs.docker.com/desktop/install/linux-install/
Premier conteneur 🔗
Une fois installé, vous pouvez lancer Docker Desktop et vérifier que tout fonctionne correctement en lançant la commande suivante dans un terminal (ou PowerShell sur Windows) :
docker run --rm alpine echo "Bonjour, je suis un conteneur !"
Pour mieux comprendre ce que fait cette commande, nous allons la décomposer :
docker
: nom de la commande permettant de dialoguer avec Dockerrun
: instruction permettant de lancer un conteneur--rm
: option permettant de supprimer le conteneur une fois qu’il a été exécutéalpine
: nom du modèle de conteneur (appelé image) à utiliser pour créer le conteneurecho "Bonjour, je suis un conteneur !"
: commande à exécuter dans le conteneur
Le résultat de cette commande sera normalement le suivant :
Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
f56be85fc22e: Already exists
Digest: sha256:124c7d2707904eea7431fffe91522a01e5a861a624ee31d03372cc1d138a3126
Status: Downloaded newer image for alpine:latest
Bonjour, je suis un conteneur !
Ici, Docker vérifie d’abord si l’image alpine
est présente sur votre machine, comme ce n’est pas le cas il la récupère depuis Docker Hub qui est un registre d’images Docker. Une fois l’image récupérée, Docker crée un conteneur à partir de cette image et exécute la commande echo "Bonjour, je suis un conteneur !"
dans ce conteneur. Enfin, une fois la commande exécutée, Docker supprime le conteneur.
Entrer dans un conteneur 🔗
Un conteneur est un environnement virtuel isolé, il possède donc son propre système de fichiers, ses propres processus, ses propres ressources réseau, etc. Nous allons voir comment nous pouvons rentrer dans un conteneur pour interagir avec son système de fichiers et ses processus, pour cela exécutez la commande suivante :
docker run --rm -it alpine sh
Une fois dans le conteneur, vous pouvez par exemple exécuter les commandes :
ls
pour lister les fichiers présents dans le répertoire courantcd
pour vous déplacer dans un autre répertoireps
pour lister les processus en cours d’exécution
Créer un dossier partagé entre le conteneur et votre machine 🔗
Comme nous l’avons vu précédemment, un conteneur est un environnement virtuel isolé, il possède donc son propre système de fichiers, mais il est possible de créer un dossier partagé entre le conteneur et votre machine. Pour cela, nous allons utiliser la commande suivante :
docker run --rm -v $(pwd):/app -w /app alpine ls -la
Dans cette commande, nous avons :
docker run
: instruction permettant de lancer un conteneur--rm
: option permettant de supprimer le conteneur une fois qu’il a été exécuté-v
: option permettant de préciser un dossier partagé entre le conteneur et votre machine$(pwd)
: dossier présent sur l’hôte (votre machine), ici nous utilisons la commandepwd
qui permet de récupérer le chemin du répertoire courant mais vous pouvez également utiliser un chemin (par exemple/tmp/test
):
: séparateur entre le dossier présent sur l’hôte et le dossier présent dans le conteneur/app
: dossier présent dans le conteneur-w /app
: option qui n’est pas obligatoire mais qui permet de définir le répertoire courant du conteneur lorsqu’il est lancéalpine
: nom du modèle d’image à utiliser pour créer le conteneurls -la
: commande à exécuter dans le conteneur, ici nous listons les fichiers présents dans le répertoire/app
Accéder aux ports d’un conteneur 🔗
Maintenant que nous avons vu comment créer un dossier partagé entre le conteneur et votre machine, nous allons voir comment accéder aux ports d’un conteneur. Pour cela, nous allons utiliser l’image nginx qui est une image Docker permettant de lancer un serveur web Nginx. Pour lancer un serveur web Nginx dans un conteneur, exécutez la commande suivante :
docker run --rm -d -p 8080:80 nginx
Dans cette commande, nous avons :
docker run
: instruction permettant de lancer un conteneur--rm
: option permettant de supprimer le conteneur une fois qu’il a été exécuté-d
: option permettant de lancer le conteneur en mode détaché, c’est-à-dire que le conteneur continue de fonctionner en arrière-plan-p
: option permettant de préciser un port à exposer8080
: port présent sur l’hôte (votre machine), ici nous utilisons le port8080
mais vous pouvez utiliser un autre port:
: séparateur entre le port présent sur l’hôte et le port présent dans le conteneur80
: port présent dans le conteneurnginx
: nom de l’image à utiliser pour créer le conteneur
Si vous ouvrez votre navigateur et que vous allez sur l’adresse localhost:8080, vous devriez voir la page par défaut de Nginx.
Définir des variables d’environnement 🔗
Un conteneur comme tout système d’exploitation possède des variables d’environnement contenant des informations sur le système ou des configurations. Lors de la création d’un conteneur, il est possible de définir des variables d’environnement avec des valeurs spécifiques. Pour cela, nous allons utiliser la commande suivante :
docker run --rm -e APP_ENV=dev alpine env
Dans cette commande, nous avons :
docker run
: instruction permettant de lancer un conteneur--rm
: option permettant de supprimer le conteneur une fois qu’il a été exécuté-e
: option permettant de définir une variable d’environnementAPP_ENV=dev
: variable d’environnementAPP_ENV
avec la valeurdev
alpine
: nom de l’image à utiliser pour créer le conteneurenv
: commande à exécuter dans le conteneur, ici nous listons les variables d’environnement
Dans la liste des variables d’environnement, vous devriez voir la variable APP_ENV
avec la valeur dev
.
Voir la liste des conteneurs 🔗
La précédente commande a été exécutée en mode détaché, c’est-à-dire que le conteneur continue de fonctionner en arrière-plan. Pour voir la liste des conteneurs en cours d’exécution, vous pouvez exécuter la commande suivante :
docker ps
Vous devriez voir une liste de conteneurs, dont le conteneur Nginx que nous avons lancé précédemment :
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ebf116196f75 nginx "/docker-entrypoint.…" 6 seconds ago Up 20 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp affectionate_robinson
Vous remarquerez que le conteneur Nginx a été nommé affectionate_robinson
par Docker dans notre cas, mais ce nom est généré aléatoirement. Si vous voulez donner un nom à votre conteneur, vous pouvez utiliser l’option --name
:
docker run --rm -d -p 8080:80 --name nginx-server nginx
Dernière chose importante, la commande ps
par défaut ne liste que les conteneurs en cours d’exécution, si vous voulez voir tous les conteneurs, même ceux qui ne sont pas en cours d’exécution, vous pouvez exécuter la commande suivante :
docker ps -a
Arrêter et supprimer un conteneur 🔗
Pour arrêter un conteneur, vous pouvez exécuter la commande suivante :
docker stop ebf116196f75
Vous pouvez également utiliser le nom du conteneur :
docker stop nginx-server
Pour supprimer un conteneur, si vous n’avez pas utilisé l’option --rm
lors de la création du conteneur, vous pouvez exécuter la commande suivante :
docker rm nginx-server
Pour arrêter un conteneur et le supprimer en même temps, vous pouvez exécuter la commande suivante :
docker rm -f nginx-server
Si vous voulez supprimer tous les conteneurs en cours d’exécution, vous pouvez exécuter la commande suivante :
docker rm -f $(docker ps -q)
Si vous voulez supprimer tous les conteneurs, même ceux qui ne sont pas en cours d’exécution, vous pouvez exécuter la commande suivante :
docker rm -f $(docker ps -aq)
Exécuter plus facilement des conteneurs 🔗
Jusqu’à présent nous avons vu comment créer un conteneur avec la commande docker run
, mais il est également possible de créer des conteneurs avec la commande docker compose
sans avoir a écrire toutes les options via un terminal. Pour cela, nous allons créer un fichier docker-compose.yml
qui contiendra les instructions permettant de créer un ou plusieurs conteneurs, par exemple :
version: "3.7"
services:
nginx1:
image: nginx
volumes:
- .:/usr/share/nginx/html
environment:
APP_ENV: dev
ports:
- "8080:80"
Dans ce fichier, nous avons :
version
: version de la syntaxe utilisée dans le fichier, ici nous utilisons la version3.7
services
: section contenant la liste des services à créernginx1
: nom du service, vous pouvez en créer plusieurs et les nommer comme vous le souhaitezimage
: nom de l’image à utiliser pour créer le conteneurvolumes
: section contenant la liste des volumes à monter dans le conteneur, ici nous montons le dossier courant dans le dossier/usr/share/nginx/html
du conteneurenvironment
: section contenant la liste des variables d’environnement à définir dans le conteneur, ici nous définissons la variableAPP_ENV
avec la valeurdev
ports
: section contenant la liste des ports à exposer, ici nous exposons le port80
du conteneur sur le port8080
de notre machine
Une fois le fichier docker-compose.yml
créé, vous pouvez créer le conteneur en exécutant la commande suivante :
docker compose up
Le conteneur sera créé et vous pourrez voir les logs du conteneur dans votre terminal. Si vous voulez créer le conteneur en mode détaché, vous pouvez exécuter la commande suivante :
docker compose up -d
Pour voir les logs du conteneur en mode détaché, vous pouvez utiliser la commande suivante :
docker compose logs -f
Pour arrêter les conteneurs créés avec la commande docker compose
, vous pouvez utiliser la commande suivante :
docker compose down
Enfin, voici un cas complexe pour vous montrer comment créer plusieurs conteneurs avec la commande docker compose
et dont nous avons besoin d’une communication entre les conteneurs :
version: "3.7"
services:
database:
image: mariadb
volumes:
- ./database:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: test
MYSQL_USER: test
MYSQL_PASSWORD: test
phpmyadmin:
image: phpmyadmin/phpmyadmin
ports:
- "8080:80"
environment:
PMA_HOST: database
PMA_USER: test
PMA_PASSWORD: test
Ici nous avons deux conteneurs :
database
: conteneur contenant la base de données MariaDB dont nous avons besoin pour notre applicationphpmyadmin
: conteneur contenant l’interface phpMyAdmin qui nous permet de gérer notre base de données, ici nous avons besoin de communiquer avec le conteneurdatabase
pour pouvoir se connecter à la base de données
Créer une image Docker 🔗
Nous avons vu comment créer un conteneur à partir d’une image Docker, mais il est également possible de créer une image personnalisée à partir d’une autre image existante. Pour cela, nous allons utiliser l’image nginx que nous avons utilisée précédemment.
Pour créer une image personnalisée à partir de l’image nginx
, nous allons créer un fichier Dockerfile
qui contiendra les instructions permettant de créer notre image personnalisée :
FROM nginx:latest
COPY index.html /usr/share/nginx/html
Pour cet exemple, nous avons créé un fichier index.html
qui contient le code suivant :
<!DOCTYPE html>
<html>
<head>
<title>Test</title>
</head>
<body>
<h1>Bonjour tout le monde !</h1>
</body>
</html>
Une fois le fichier Dockerfile
et le fichier index.html
créés, vous pouvez créer votre image personnalisée en exécutant la commande suivante :
docker build -t nginx-hello .
Dans cette commande, nous avons :
docker build
: instruction permettant de créer une image Docker-t
: option permettant de donner un nom à l’imagenginx-hello
: nom de l’image.
: chemin du dossier contenant les fichiersDockerfile
etindex.html
Si vous exécutez la commande docker images
, vous devriez voir votre image nginx-hello
:
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx-hello latest 1b0b1b0b1b0b 10 seconds ago 142MB
Vous pouvez maintenant lancer un conteneur à partir de cette image en exécutant la commande suivante :
docker run --rm -d -p 8080:80 nginx-hello
Si vous ouvrez votre navigateur et que vous allez sur l’adresse localhost:8080, vous devriez voir la page que nous avons créée.
Pour supprimer l’image nginx-hello
, vous pouvez exécuter la commande suivante :
docker rmi nginx-hello
Pour en savoir plus sur les instructions que vous pouvez utiliser dans un fichier Dockerfile
, vous pouvez consulter la documentation officielle.