VIRTUALISATION D’ENVIRONNEMENT : DOCKER
DOCKER
• Agenda
– Présentation du Docker
– Travailler avec des conteneurs docker
– Travailler avec des images docker
26/11/2024 93
Présentation de Docker
26/11/2024 94
Qu'est-ce la virtualisation ?
• Ensemble de techniques et d’outils permettant de :
– faire tourner plusieurs systèmes d’exploitation sur un serveur
– Partager des ressources
• En respectant deux principes fondamentaux :
– Le cloisonnement : chaque système d’exploitation a un fonctionnement
indépendant sans aucune interférence mutuelle
– La transparence : le fonctionnement en mode virtualisé ne modifie pas le
fonctionnement du système ni des applications
26/11/2024 95
Utilité de la virtualisation ?
• Chaque application a ses propres besoins de dépendances.
– Une application java nécessite une JDK installée,
– Une application nodejs nécessite la plateforme nodejs installée et ainsi de suite.
• Les langages de programmation (java, nodejs et python) ont tous de
nombreuses versions: quelle version faut-il vraiment installer pour une
application
• Une simple application web écoute sur le port tcp 80 et peut avoir besoin à
des ressources locales sur la machine: une instance de la même application
web se heurterait au port tcp
• La réponse à toutes ces questions concerne les machines virtuelles et les
conteneurs.
26/11/2024 96
Utilité de la virtualisation ?
• Le développeur d’applications peut exporter l’application et toutes ses
dépendances installées dans une machine virtuelle ou un conteneur
• La machine ou le conteneur fournit un environnement adéquat pour
exécuter l’application sur le serveur
Nous pouvons exécuter plusieurs instances de l’application sur le
même serveur sans entrer en conflit d’adresses ni de ressources.
26/11/2024 97
Machines virtuelles vs Docker
Rest API
CLI Dockerfile
Containers
26/11/2024 98
Machines virtuelles
• Une machine virtuelle est un ensemble de systèmes d’exploitation qui
s’exécutent les uns sur les autres en utilisant un logiciel appelé
hyperviseur (vmware, oracle virtual box et ms hyper-v)
• L’hyperviseur simule le matériel tel que la mémoire et le cpu pour la
machine virtuelle
• On peut exécuter de nombreuses instances de machines virtuelles sur
une seule machine physique
26/11/2024 99
Hyperviseur vs Docker
26/11/2024 100
Docker : Présentation
• Docker est un projet open-source qui automatise le déploiement
d'applications à l'intérieur de conteneurs de logiciels en fournissant une
couche supplémentaire d'abstraction et d'automatisation de la
virtualisation au niveau du système d'exploitation
• Pris en charge par plusieurs plates-formes cloud, notamment Amazon
EC2, Google Compute Engine et Rackspace
26/11/2024 101
Editions Docker : CE et EE
26/11/2024 102
Version de Docker CE et EE
26/11/2024 103
Docker : un LXC augmenté
Définition de LXC :
• LXC est un ensemble d'outils en espace utilisateur permettant de
contrôler les LinuX Containers, un mécanisme léger de système virtuel.
• LXC implémente des systèmes virtuels complets en partant de chroot,
en ajoutant des mécanismes de gestion des ressources et d'isolation à
l'infrastructure de gestion de processus existante de Linux
• Les LXC implémentent la gestion de ressources et leur isolation via
l’appel système clone et newinstance
26/11/2024 104
Docker : un LXC augmenté
• L'idée consiste à utiliser LXC comme base, puis à ajouter des capacités
de niveau supérieur
• Docker autorise la portabilité entre machines (qui exécutent aussi
Docker) et permet ainsi à une application et à ses composants d'exister
en tant qu'objet mobile unique.
• Avec LXC, déplacer une application sur une autre machine peut
introduire des différences susceptibles d'empêcher le conteneur de
l'application de s'exécuter.
26/11/2024 105
Architecture du docker
26/11/2024 106
Terminologie Docker
• Architecture Client/Serveur :
– Serveur = moteur ou daemon,
– Client = docker CLI
• Le client Docker communique avec le Docker daemon pour construire et gérer les conteneurs
• Le client Docker et le daemon Docker peuvent tourner sur la même machine, comme sur des
machines différentes
– Api REST qui permet de communiquer avec le daemon
• Docker File : C’est un fichier contenant l’ensemble des
commandes pour construire une image. Ce fichier
descriptif permet de construire automatiquement des
images.
26/11/2024 107
Terminologie Docker
• Image : Ensemble des couches
• Conteneur : Elément manipulable et accessible en écriture
• Registre : Une bibliothèque où les images sont stockées et peuvent être
extraites pour générer des conteneurs afin d’exécuter les services ou les
applications web
• Docker compose : fichier texte (yaml) de description d’un ensemble de
conteneurs
• Docker machine : outil de déploiement des hôtes docker sur différentes
plateformes (mac, windows) : ([Link]
• Orchestrateur : gère un pool de ressources serveurs ( swarm, kubernetes,
mesos, rancher…)
26/11/2024 108
Docker : Architecture
26/11/2024 109
Docker : Architecture
26/11/2024 110
Docker : Images
• Les images sont un modèle binaire en
lecture seule utilisé pour créer des
conteneurs (Une image est une
représentation statique de
l’application ou du service, de sa
configuration et de ses dépendances).
26/11/2024 111
Docker : Images
• Une image contient l’application ou le service, sa configuration et de ses
dépendances
• L’image contient également des métadonnées décrivant les capacités et les
besoins du conteneur.
• Les images sont utilisées pour stocker, déployer et exécuter des applications.
• Utilisé pour générer des conteneurs
26/11/2024 112
Docker : Container
• Un conteneur est une instance active (started) ou inactive (stopped) d’une
image
• Un conteneur enveloppe l’application d’un logiciel dans une boîte invisible
avec tout ce dont il a besoin pour s’exécuter (système d'exploitation, code de
l'application, runtime, outils système et les librairies).
• Les conteneurs sont légers, portables et permettent aux développeurs de
créer, déployer et exécuter efficacement des applications distribuées.
• Les conteneurs permettent à une application d’être empaquetée et déplacée
facilement, augmentant ainsi la simplicité d'une infrastructure.
26/11/2024 113
Docker : Registre (Registry)
• Les registres Docker sont des services qui fournissent des emplacements
à partir desquels vous pouvez stocker et télécharger des images.
26/11/2024 114
Labs
Installation Docker CE
26/11/2024 115
Travailler avec des conteneurs
docker
26/11/2024 116
Rechercher une image
• Les images sont disponibles dans un registre Docker privé ou publique
# docker search motif
# docker search --filter is-official=true --filter stars=3 fedora
# docker search --help
26/11/2024 117
Télécharger une image
# docker pull NAME[:TAG]
# docker pull image:tag Télécharger un version spécifique d’une image
# docker pull --all-tags centos Télécharger toutes les versions d’une image
# docker pull --help
26/11/2024 118
Lister des images
• Les images peuvent être extraites depuis un registre, importées via la
commande docker ou créées via des Dockerfiles.
# docker images
# docker images --filter "name=nginx"
# docker images --help
26/11/2024 119
Démarrer un conteneur
# docker run [ OPTIONS ] IMAGE[:TAG] [COMMAND] [ARG...]
• -i démarre le conteneur en mode interactif
• -t alloue un pseudo-tty et l'attache à l'entrée standard
• -d : démarrer le conteneur en arrière-plan
• --rm : Supprimer le conteneur une fois terminé
• --read-only : interdit la modification sur le système de fichiers racine
# ID=$(docker create -t -i centos bash)
# docker start -a -i $ID
26/11/2024 120
Lister des conteneurs
• Nous pouvons lister les conteneurs en cours d'exécution et arrêtés.
# docker ps [ OPTIONS ]
# docker ps –a Lister les conteneurs en cours d'exécution et arrêté
# docker ps –aq Renvoyer uniquement les ID de conteneur de tous les
conteneurs
# docker ps --help
26/11/2024 121
Consulter les logs des conteneurs
• Si le conteneur émet des journaux ou une sortie sur STDOUT/STDERR,
nous pouvons les obtenir sans nous connecter au conteneur.
# docker logs [-f|--follow[=false]][-t|--timestamps[=false]] CONTENEUR
Lister les conteneurs en cours d'exécution et arrêté
# docker logs –t -f
# docker logs --help
26/11/2024 122
Arrêter un conteneur
# docker stop [-t|--time[=10]] CONTAINER [CONTAINER...]
# docker stop $(docker ps -q)
Arrêter les conteneurs
en cours d'exécution
# docker stop --help
26/11/2024 123
Supprimer un conteneur
• Nous pouvons supprimer un conteneur de manière permanente, mais
avant cela, nous devons arrêter le conteneur ou utiliser l'option forcer.
# docker rm [ OPTIONS ] CONTAINER [CONTAINER...]
rm
Lister les conteneurs en cours d'exécution et arrêté
-f : Forcer la suppression
# docker rm –help
26/11/2024 124
Définition de la stratégie de redémarrage
sur un conteneur
# docker run --restart=POLICY [ OPTIONS ] IMAGE[:TAG] [COMMAND] [ARG...]
Vous avez le choix entre trois stratégies de redémarrage:
– no: ne pas démarrer le conteneur s'il meurt
– on-failure: redémarrer le conteneur s'il échoue avec un code de sortie
différent de zéro Lister les conteneurs en cours d'exécution et arrêté
– always: redémarrer toujours le conteneur sans se soucier du code retour
# docker run --restart=on-failure:3 -d -i -t fedora /bin/bash
ne redémarrer le conteneur que trois fois, en cas d'échec.
26/11/2024 125
Exposer des ports
Exposez un port ou une plage de ports
# docker run --expose=PORT [ OPTIONS ] IMAGE[:TAG] [COMMAND] [ARG...]
Lister les conteneurs en cours d'exécution et arrêté
26/11/2024 126
Exécuter un nouveau processus dans un
conteneur en cours d'exécution
• L'option exec permet d’injecter un nouveau processus dans un
conteneur en cours d'exécution.
# docker exec [-d|--detach[=false]] [--help] [-i|--interactive[=false]]
[-t|--tty[=false]] CONTAINER COMMAND [ARG...]
# docker exec --help
26/11/2024 127
Examiner un container
Examiner les processus en cours d' exécution à l'intérieur d’un container :
# docker top [OPTIONS] NAME|ID
Examiner les statistiques d’utilisation (cpu, ram, net, bloc i/o...) pour un ou
plusieurs containers en cours de fonctionnement :
# docker stats [OPTIONS] [NAME|ID]
26/11/2024 128
Examiner un container
Lors du débogage, de l'automatisation, etc., nous aurons besoin des détails de
configuration du conteneur. Docker fournit la commande inspect pour les
obtenir facilement utilisant le format Go :
# docker inspect [OPTIONS] NAME|ID [NAME|ID...]
# docker inspect --format='{{.[Link]}}' $ID
# docker inspect --help
26/11/2024 129
Labs
Manipulation des conteneurs avec le CLI
26/11/2024 130
Travailler avec des images docker
26/11/2024 131
Créer un compte avec Docker Hub
• Il s'agit d'un registre public sur lequel vous pouvez héberger des images à la fois
publiques et privées, les partager et collaborer avec d'autres.
• Il est intégré à GitHub, Bitbucket et peut déclencher des builds automatisés.
• Un référentiel peut contenir différentes versions d'une image.
• Par défaut, un référentiel privé + plusieurs référentiels publics
[Link]
# docker login
26/11/2024 132
Créer une image à partir du conteneur
(1/2)
Il existe plusieurs façons de créer des images, l'une consiste à valider
manuellement des couches et l'autre à utiliser Dockerfiles.
# docker commit -a|--author[=""] -m|--message[=""] CONTAINER [REPOSITORY[:TAG]]
# docker commit -a "JEMAL" -m "Centos Avec HTTPD" c83ff3f4c9e2 jmlhmd/centos:httpd
26/11/2024 133
Créer une image à partir du conteneur
(2/3)
26/11/2024 134
Créer une image à partir du conteneur
(3/3)
Pour rechercher des fichiers modifiés depuis le démarrage du conteneur:
# docker diff Conteneur
Liste des préfixes avant chaque entrée de la sortie:
• A: C'est pour dire qu’un fichier / répertoire
a été ajouté
• C: C'est pour dire qu’un fichier / répertoire
a été modifié
• D: C'est pour dire qu’un fichier / répertoire
a été supprimé
26/11/2024 135
Publication d'une image dans le registre
# docker push NAME[:TAG] Public (Docker hub)
# docker push [REGISTRYHOST/][USERNAME/]NAME[:TAG] Privé
# docker push --help
26/11/2024 1 136
3
Historique d'une image
# docker history [ OPTIONS ] IMAGE
# docker inspect --format='{{.Comment}}’ jemal/centos:httpd
# docker history --help
26/11/2024 137
Supprimer une image
# docker rmi [ OPTIONS ] IMAGE [IMAGE...]
# docker stop `docker ps -q` Arrêter tous les conteneurs
# docker rm `docker ps -a -q` Supprimer tous les conteneurs
# docker rmi `docker images -q` Supprimer toutes les images
26/11/2024 138
Exporter/Importer une image (1/2)
# docker save [-o|--output=""] IMAGE [:TAG] Image
# docker export CONTAINER > [Link] Conteneur
# docker import URL|- [REPOSITORY[:TAG]]
26/11/2024 139
Exporter/Importer une image (2/2)
Docker export = docker commit + docker save
26/11/2024 140
Création d'images à l'aide de Dockerfile
• Les images Docker peuvent être créées de 2 manières différentes:
– En travaillant sur un conteneur, puis en le sauvegardant en exécutant la
commande docker commit
– En modifiant un fichier Docker dans le système de fichiers hôte et en exécutant la
commande docker build
26/11/2024 141
Création d'images à l'aide de Dockerfile
• Exemple :
FROM centos:latest
MAINTAINER JEMAL
CMD date
# docker build .
L’option -t spécifie le nom du référentiel
ou de la balise pour l'image
26/11/2024 142
Le format du Dockerfile
• FROM : La première instruction de tout Dockerfile, qui définit l'image de
base pour les instructions suivantes. [OBLIGATOIRE]
FROM <images>:<tag>
FROM ubuntu Par défaut, le tag est latest
FROM devops/ubuntu-ssh:16.04
• LABEL : En utilisant l'étiquette, vous pouvez organiser les images de
manière appropriée. Ceci est utile pour définir l'adresse du responsable,
le nom du fournisseur, la version de l'image, la date de sortie, etc.
LABEL maintainer= “jemal@[Link]" LABEL LABEL maintainer= "jemal@[Link]" \
vendor= “FR" vendor= "FR" \
LABEL [Link]="0.0.1" [Link]="0.0.1"
46
26/11/2024 143
Le format du Dockerfile
• MAINTAINER: définit l'auteur de l'image générée
MAINTAINER <name>
• RUN : exécuter n'importe quelle commande sur l'image pendant la
construction
RUN <command> <param1> ... <pamamN> Comme shell (sh -c)
RUN ["executable", "param1",...,"paramN" ] Comme exécutable
RUN apt-get update
RUN apt-get install -y apache2 automake build-essential
curl
RUN apt-get update && apt-get install -y \ automake \
build-essential \ curl \
26/11/2024 144
Le format du Dockerfile
• CMD : utilisé pour exécuter le service ou le logiciel contenu par votre
image, ainsi que les éventuels arguments lors du lancement du
conteneur.
CMD ["executable", "param1",...,"paramN" ] Comme exécutable
CMD <command> <param1> ... <pamamN> Comme shell (sh -c)
CMD ["param1", ... , "paramN"] fournir des arguments à ENTRYPOINT.
• Exemple: pour démarrer le service Apache lors du lancement du
conteneur
CMD ["apache2ctl", "-D", "FOREGROUND"]
26/11/2024 145
Le format du Dockerfile
• ENTRYPOINT : Spécifier une commande ou un exécutable comme point
d’entrée du conteneur
ENTRYPOINT ["executable", "param1",...,"paramN"] Comme exécutable
ENTRYPOINT <command> <param1> ... <pamamN> Comme shell (sh -c)
ENTRYPOINT [Link]
• WORKDIR : définit le répertoire de travail pour les instructions
RUN, CMD et ENTRYPOINT
WORKDIR <PATH>
WORKDIR /opt
26/11/2024 146
Le format du Dockerfile
• ADD : copier des fichiers et des répertoires du système hôte vers l'image
pendant la construction.
ADD <src> <dest>
ADD ["<src>"... "<dest>"] Pour le chemin contenant des espaces
ADD [Link] /[Link]
• COPY : Similaire à ADD, copier les fichiers de la source vers la
destination
COPY ["<src>"... "<dest>"]
COPY html/* /var/www/html/
COPY *.conf /etc/apache2/sites-available/
26/11/2024 147
Le format du Dockerfile
• VOLUME: créer un point de montage avec le nom donné et le marquera
comme point de montage du volume externe
VOLUME ["/data"]
VOLUME /data
• EXPOSE : exposer les ports réseau du conteneur sur lesquels il
écoutera au moment de l'exécution
EXPOSE <port> [<port> ... ]
EXPOSE 80
EXPOSE 443
26/11/2024 148
Le format du Dockerfile
• ENV : Définir des variables d'environnement pour un service spécifique
du conteneur.
ENV <key> <value>
ENV PATH=$PATH:/usr/local/pgsql/bin/
ENV CONT_IMG_VER=v1.0.0
• USER : Définir le nom d'utilisateur (ou UID) à utiliser lors de
l'exécution de l'image et pour toutes les instructions RUN, CMD et
ENTRYPOINT
USER <username>/<UID>
USER patrick
26/11/2024 149
Exemples du Dockerfile (1/2)
• Affichage d’un FROM ubuntu:14.04
message en entrée ENTRYPOINT ["/bin/echo"]
FROM centos:7
• Empaquetage du Maintainer jmlhmd@[Link]
serveur Apache RUN yum update -y && yum clean all
dans un conteneur RUN yum install httpd -y && yum clean all
RUN echo "Ceci est un exemple pour créer une image basé \
sur Centos avec Le serveur Web pré-installé" \
> /var/www/html/[Link]
ENTRYPOINT apachectl "-DFOREGROUND"
26/11/2024 150
Exemples du Dockerfile (2/2)
• Empaquetage
d'une application FROM ubuntu:14.04
Flask dans un
RUN apt-get update
conteneur RUN apt-get install -y python
RUN apt-get install -y python-pip
RUN apt-get clean all
RUN pip install flask
ADD [Link] /tmp/[Link] EXPOSE 5000
CMD ["python","/tmp/[Link]"]
26/11/2024 151
Labs
Manipulation des Dockerfiles
26/11/2024 152