Docker - Conteneurisation
des applications
Institut F2i
Jaber
Octobre-Novembre 2022
Programme
• Les technologies de virtualisation
• Installation
• Docker proxy
• Premier conteneur
• Image personalisée
• Création d’image
• Upload sur Docker hub
• Options basiques de docker run
• Dockerfile
1
Programme
• Volumes
• Lien entre conteneurs
• Ressources
• Private Registry
• Docker-compose
• Docker-machine
• Docker Swarm
• Docker Network
2
Les Technologies de Virtualisation
Système invité / Système Hôte
• Le paradigme système invité / système hôte
représente la virtualisation classique ou virtual-
isation hébergée. Ce type de virtualisation re-
pose sur système existant – le système d’exploita-
-tion hôte, une solution de virtualisation tierce
et la création de divers système d’exploitation
invités.
• Chaque invité fonctionne sur l’hôte en util-
isant des ressources partagées qui lui sont at-
tribuées par l’hôte. L’avantage principal de ce
type de virtualisation est qu’il existe un nombre
limité de périphériques et de pilotes à gérer.
Chaque machine virtuelle – invitée – dispose
d’un ensemble cohérent de matériel.
3
Les Technologies de Virtualisation
• L’inconvénient majeur est que les entrées-
sorties disques souffrent dans le cadre de cette
technologie.
• Le temps d’exécution des opérations ne faisant
pas appel au disque est proche de celui des
opérations natives. Par conséquent, il est préférable
dans ce cas d’interagir avec les machines virtuelles
via le réseau en utilisant Windows Terminal
Services – Remote Desktop Protocol – pour les
machines virtuelles Windows ou ssh pour les systèmes
Unix/Linux/Mac OS.
4
Les Technologies de Virtualisation
VMware Server
• VmWare Server fonctionne selon le paradigme
système invité / système hôte. Il est considéré
comme un produit d’introduction à utiliser dans
les petits environnements. Son utilité est limitée
dans des environnements plus grands en rai-
son des limites de mémoire pour les machines
virtuelles et des basses performances disque.
VmWare Server prend en charge les machines
64 bits en tant qu’hôtes et en tant qu’invités.
5
Les Technologies de Virtualisation
VirtualBox
• VirtualBox, comme em VMware Server est
multiplate-forme, mais à la différence de ce
dernier, il est libre. Avec sa mémoire vidéo
ajustable, sa connectivité aux périphériques dis-
tants, sa connectivité RDP et ses bonnes perfor-
mances, il s’agit de l’un des outils de virtuali-
sation hébergée le plus intérressant.
• VirtualBox est plus adapté pour les petits
réseaux et pour les particuliers, pour les mêmes
raisons que VMware Server.
6
Les Technologies de Virtualisation
Hyperviseur
• Un hyperviseur est une approche bare-metal
ou bare-machine de la virtualisation. Bare-
metal fait référence au matériel du serveur sans
système d’exploitation installé. La meilleure
manière de décrire la technologie d’un hyper-
viseur est de le comparer à la virtualisation
hébergée. Au premier abord, l’hyperviseur peut
sembler comparable à la virtualisation hébergée,
mais il est significativement différent.
• Un hyperviseur est un logiciel de virtualisation
qui fait fonctionner un système d’exploitation.
À l’inverse, la virtualisation hébergée utilise un
système d’exploitation et y fait fonctionner un
logiciel de virtualisation comme application.
7
Les Technologies de Virtualisation
• L’hyperviseur est installé directement sur le
matériel, puis le système d’exploitation est in-
stallé ; il est lui-même une machine virtuelle
paravirtualisée. Le système d’exploitation hôte,
si on l’appelle ainsi, est désigné sous le nom de
machine virtuelle zéro.
• Des produits comme VMware ESXi, implémente
un hyperviseur bare-metal sans interface par
système d’exploitation traditionnel. Il s’installe
sur le matériel pour une empreinte faible de
32Mo.
8
Les Technologies de Virtualisation
Citrix Xen
• Les version 3.0 et précédentes de Xen n’étaient
pas faciles à utiliser et ne semblaient pas fonc-
tionner si bien.
• À partir de la version 4.x, en revanche est
plus stable. L’interface graphique est intuitive,
rapide et bien présentée. La mise en place
de machines est rapide. À étudier pour des
besoins de virtualisation haut de gamme.
VMware ESX/ VMware ESXi
• Des outils de virtualisation pour les entreprises.
ESX est un produit mûr qui n’a pour concur-
rence que Xen à ce niveau de virtualisation.
Les deux produits nécessitent une architecture
64 bits, mais ESXi a des demandes matérielles
spécifiques au délà de celle d’ESX. ESXi est un
produit gratuit :
https://www.vmware.com/fr/products.html
9
Les Technologies de Virtualisation
Microsoft Hyper-V
• Microsoft présente sa solution de virtualisa-
tion avec Hyper-V, afin de proposer une solu-
tion basée sur Windows en plus là où Citrix et
VMware n’ont pas tout à fait réussi. Ces deux
derniers sont basés sur Linux, ce qui signifie
que, si vous n’êtes pas familier de l’environnement
Unix/Linux, le produit Microsoft peut s’avérer
un bon choix.
10
Les Technologies de Virtualisation
Émulation
• L’émulation fait référence à la capacité de
mimer un type particulier de matériel pour un
système d’exploitation indépendamment du
système d’exploitation hôte. Par exemple, grâce
à une solution d’émulation, vous pouvez in-
staller une version Sparc du système Solaris sur
un ordinateur hôte non Sparc.
• Le logiciel d’émulation fonctionne comme
une application du système hôte, mais émule
un ordinateur entier d’une autre plate-forme.
Le système invité n’a pas conscience de son
statut de système invité, ni qu’il fonctionne
dans un environnement étranger.
11
Les Technologies de Virtualisation
• Dans certains cas, l’émulation matérielle peut
être lente, mais les technologies récentes, les
logiciels d’émulation, les pilotes récents et les
processeurs hôtes 64 bits plus rapides rendent
l’émulation viable en tant qu’options de virtu-
alisation, en particulier pour ceux qui doivent
développer des pilotes ou des technologies pour
d’autres plate-formes sans pouvoir investir dans
le matériel.
• Les meilleurs exemples de logiciels d’émulation
logicielle sont Bochs et QEMU.
http://bochs.sourceforge.net/
http://wiki.qemu.org/
12
Les Technologies de Virtualisation
Bochs
• Bochs est un émulateur libre et gratuit d’architec-
-ture Intel x86 qui fonctionne sous Unix, Linux,
Windows et Mac Os X, mais qui ne prend en charge
que les systèmes x86.
• Il prend en charge un éventail de matériel
pour émuler toute les architectures de pro-
cesseurs x86. Il prend également en charge
les processeurs multiples, mais il ne tire pas
complètement avantage du SMP.
Qemu
• Qemu est un autre programme libre et gra-
tuit d’émulation qui fonctionne sur un nom-
bre limité d’architectures hôtes (x86, x86 64 et
PowerPC) mais qui permet d’émuler des systèmes
invités pour x86, x86 64, ARM, Sparc, PowerPC,
MIPS et m68k.
13
Les Technologies de Virtualisation
Microsoft Virtual PC et Virtual Server
• Virtual PC est une solution gratuite de virtu-
alisation de Microsoft. Virtual PC utilise l’émulation
pour fournir son environnement de machines
virtuelles. C’est une solution pour héberger des
machines virtuelles sous Windows XP Workstation
ou sous Windows Server. Il ne s’agit pas de so-
lution adaptée pour un large environnement,
mais il peut faire fonctionner des machines
virtuelles rapidement et pas cher.
• Les performances des machines virtuelles sur
ces produits sont correctes pour des machines
virtuelles Windows. Il est difficile, sinon im-
possible de savoir que vous utilisez une ma-
chine virtuelle lorsque vous vous connectez au
réseau. Les performances de la console sont
parfois décevantes. Lorsque c’est possible, min-
imisez la console et utilisez RDP pour se con-
necter à vos systèmes Windows virtualisés.
14
Virtualisation au Niveau Noyau
• La virtualisation au niveau noyau est un cas
particulier dans le monde de la virtualisation
au sens où chaque machine virtuelle utilise son
propre noyau unique pour démarrer la machine
virtuelle invitée – appelée système de fichier
racine – indépendamment du noyau de l’hôte.
Kvm
• Kvm – Kernel Virtual Machine – est un Qemu
modifié. À la différence de Qemu, Kvm utilise
les extensions de virtualisation du processeur
(Intel-VT et AMD-V).
• Kvm prend en charge de nombreux systèmes
d’exploitation invités sous x86 et x86 64, y com-
pris Windows, Linux et FreeBDS. Il utilise le noyau
Linux comme hyperviseur et fonctionne comme
module que l’on peut charger dans le noyau.
15
Virtualisation au Niveau Noyau
User-Mode Linux
• User-Mode Linux – UML – utilise un noyau
exécutable et un système de fichiers racine pour
créer une machine virtuelle. Pour créer une
machine virtuelle, vous avez besoin d’un noyau
exécutable en espace utilisateur – noyau invité
– et d’un système de fichiers racine créé par
UML.
• Ces deux composants forment une machine
virtuelle UML. La session de terminal en ligne
de commande que vous utilisez pour vous con-
necter au système hôte distant devient votre
console de machine virtuelle. UML est inclus
dans tous les noyaux 2.6.x.
16
Les Technologies de Virtualisation
À Noyau Partagé
• La virtualisation à noyau partagé, aussi ap-
pelée virtualisation de système d’exploitation
ou virtualisation au niveau système, tire avan-
tage de la possibilité, unique sous Unix et Linux,
de partager le noyau avec d’autres processus
du système. Cette virtualisation à noyau partagé
utilise une fonctionnaliteé nommée chroot, pour
changer root, ou modifier la racine.
• Cette fonctionnalité modifie le sytème de
fichiers racine d’un processus pour l’isoler de
manière à fournir une certaine sécurité. On
appelle souvent cela chroot jail ou de la virtu-
alisation par conteneurs.
17
Les Technologies de Virtualisation
• Un programme, ensemble de programmes ou
système dans le cas de virtualisation à noyau
partagé fonctionnant dans un environnement
chroot est protégé en faisant croire au système
emprisonné qu’il fonctionne sur une machine
réelle avec son propre système de fichiers.
• Le mécanisme de chroot a été améliorer pour
mimer un système de fichier entier, de sorte
qu’un système entier peut fonctionner dans un
chroot, ce qui constitue une machine virtuelle.
• Les avantages de la virtualisation à noyau
partagé sont : (1) sécurité et isolation accrues
; (2) performances natives ; (3) densité plus
élevée de sytèmes virtualisés.
• L’inconvénient : toutes les machines virtuelles
doivent être compatibles avec le noyau en cours
d’exécution.
18
Les Technologies de Virtualisation
Solaris Containers Zones
• Solaris 10 fournit un système de virtualisa-
tion intégré. Le système d’exploitation Solaris
10 est nommé zone globale. Les zones de
Solaris sont en fait des jails BSD, chacune
contenant sa racine virtuelle propre qui imite
un système d’exploitation et un système de
fichiers complet.
• Lorsque vous créez une nouvelle zone, un
système de fichier complet est copié dans le
répertoire de la nouvelle zone. Chaque zone
ne voit que ses propres precessus et systèmes
de fichiers.
19
Les Technologies de Virtualisation
• La zone croit qu’elle est un système d’exploitation
complet et indépendant ; seule la zone globale
a conscience de la virtualisation.
• Chaque zone est, globalement, un bac à sable
propre dans lequel vous pouvez installer des
applications, fournir des services ou tester des
correctifs. Les zones Solaris constituent une
solution de virtualisation extensible et de niveau
professionnel, facile d’utilisation et aux perfor-
mances natives.
20
Les Technologies de Virtualisation
OpenVZ
• Le noyau OpenVZ est optimisé pour la virtu-
alisation et s’avère être efficace pour gérer les
performances de machines virtuelles, y compris
pour d’autres produits de virtualisation.
• OpenVZ est comparable aux zones de Solaris,
à ceci près que vous pouvez faire fonction-
ner plusieurs distributions Linux avec le même
Noyau : http://openvz.org/
21
Introduction à Docker
Présentation de Docker
• Docker est une plateforme ouverte de
développement, livraison, et exécution
d’applications.
• Docker vous permet de séparer vos applica-
tions de votre infrastructure afin de pouvoir
livrer des applications logiciels rapidement.
• Avec Docker vous pouvez gérer votre infras-
tructure de la même manière que vos appli-
cations. En tirant parti des méthodologies de
Docker pour la livraison, le test et le déploiement
rapide de code. Le délai entre l’écriture du
code et sa mise en production est réduit con-
sidérablement.
22
Introduction à Docker
La plateforme Docker
• Docker permet de packager et exécuter une
application dans un environnement isolé (libre-
ment) nommé conteneur.
• L’isolation et la sécurité vous permettent
d’exécuter plusieurs conteneurs simultanément
sur un hôte donné.
• Les conteneurs sont légers car ils n’ont pas
besoin de la charge supplémentaire d’un hy-
perviseur, mais s’exécute directement dans le
noyau de la machine hôte.
• Docker vous permet ainsi d’exécuter plus de
conteneurs sur un système réel donnée que
des machines virtuelles. Vous pouvez même
exécuter des conteneurs Docker sur des ma-
chines hôtes qui sont des machines virtuelles.
23
Introduction à Docker
La plateforme Docker
• Docker fournit des outils et une plateforme
pour gérer le cycle de vie de vos conteneurs :
- Développer votre application et ces composants
de support en utilisant des conteneurs ;
- Le conteneur devient l’unité pour la distribu-
tion et le test de votre application ;
- Lorsque vous êtes prêt, déployez votre ap-
plication dans votre environnement de produc-
tion, en tant que conteneur ou un service or-
chestré. Cela fonctionne de la même manière
que votre environnement de production soit
un centre de données local, un fournisseur de
cloud ou un hybride des deux.
24
Introduction à Docker
Docker Engine
• Docker Engine est une application client-serveur
avec les composant majeurs suivants :
- Un serveur représenté par la commande dockerd
et exécuté en tant que processus démon ;
- Une API REST qui spécifie les interfaces que
les programmes peuvent utiliser afin de com-
muniquer avec le démon dockerd et lui indiquer
les demandes ;
- Une interface ligne de commande — Com-
mand Line Interface (CLI) — représentée par
la commande docker.
25
Introduction à Docker
Fig 1 : Les composants de Docker Engine
26
Introduction à Docker
• L’interface ligne de commande utilise l’API
REST Docker pour contrôler ou interagir avec le
démon Docker — dockerd — par le biais de
scripts ou des commandes directes. De nom-
breuses autres applications Docker utilisent les
API et CLI sous-jacentes.
• Le démon crée et gère des objets Docker, tels
que des images, des conteneurs, des réseaux,
et des volumes.
27
Introduction à Docker
Qu’est-ce-qu’un conteneur ?
• Un conteneur est une unité logiciel stan-
dardisée qui regroupe le code et toutes ses
dépendances afin que l’application s’exécute
rapidement et de manière fiable d’un environ-
nement à un autre.
• Une image de conteneur Docker est un pa-
quet logiciel léger, autonome et exécutable, qui
inclut tout le nécessaire pour exécuter une ap-
plication :
- code ;
- environnement d’exécution ;
- outils système ;
- bibliothèques systèmes ;
- paramètres.
28
Introduction à Docker
Fig 1 : Conteneurisation d’applications avec Docker
29
Introduction à Docker
Image & conteneur
• Les images de conteneur deviennent des con-
teneurs à l’exécution et dans le cas des con-
teneurs Docker les images deviennent des con-
teneurs lorsqu’elles s’exécutent sur Docker Engine.
Plateforme applicative
• Disponible pour les applications Linux et Windows,
l’application logicielle conteneurisée fonction-
nera toujours de la même manière, quelle que
soit l’infrastructure.
• Les conteneurs isolent les logiciels de leur en-
vironnement et garantissent un fonctionnement
uniforme, malgré les différences.
30
Introduction à Docker
Docker Engine
• Les conteneurs qui fonctionnent sur Docker
Engine sont :
- Standard. Docker a créé la norme de con-
teneurs, de sorte qu’ils puissent être portables ;
- Léger. Les conteneurs partagent le noyau
du système d’exploitation de la machine et ne
nécessitent donc pas de système d’exploitation
par application, ce qui permet d’optimiser
l’éfficacité du système et/ou du serveur et de
réduire les coûts du serveur et de licences ;
- Sécurisé. Les applications sont plus sûres
dans les conteneurs et Docker offre les meilleures
capacités d’isolation dans le domaine.
31
Introduction à Docker
Des conteneurs Docker multi-plateformes
• La technologie de conteneur Docker a été
lancée en 2013 en tant que projet Open Source
avec Docker Engine.
• Docker Engine a exploité les concepts existant
autour des conteneurs et particulièrement ceux
de l’environnement Linux, des mécanismes tels
que cgroups et namespaces.
• La technologie de Docker sépare les dépendances
des applications de l’infrastructure afin de répondre
aux exigences des développeurs et des admin-
istrateurs opérateurs systèmes.
32
Introduction à Docker
Des conteneurs Docker multi-plateformes
• Des différents environnements utilisent la tech-
nologie de conteneur Docker :
- les conteneurs Windows Docker, le résultat de
l’intégration des techniques de conteneur Docker
dans un environnement Windows ;
- les conteneurs dans des environnements cloud
comme offres IaaS natives ;
- les frameworks open source.
33
Introduction à Docker
Fig 2 : Conteneur Docker multi-plateformes
34
Introduction à Docker
Conteneurs & machines virtuelles : com-
paraison
• Les conteneurs et les machines virtuelles
présentent des avantages similaires en termes
d’isolation et d’allocation de ressources, mais
fonctionnent différemment.
• Les conteneurs virtualisent le système
d’exploitation au lieu du matériel.
• Les conteneurs sont plus portables et effi-
caces.
35
Introduction à Docker
Fig 3 : Conteneurisation avec Docker
36
Introduction à Docker
Fig 4 : Machines virtuelles
37
Introduction à Docker
Les conteneurs
• Les conteneurs sont une abstraction au niveau
de la couche d’application qui regroupe le code
et les dépendances.
• Plusieurs conteneurs peuvent être exécutés
sur la même machine et partager le noyau du
système d’exploitation avec d’autres conteneurs.
Chaque conteneur s’exécute en tant que pro-
cessus isolé dans l’espace utilisateur.
• Les conteneurs occupent moins d’espace que
les machines virtuelles (les images de conteneurs
ont généralement une taille de dizaines de Mo),
peuvent gérer plus d’applications et nécessitent
moins de machines virtuelles et de systèmes
d’exploitation.
38
Introduction à Docker
Les machines virtuelles
• Les machines virtuelles (VM) sont une ab-
straction du matériel physique transformant un
serveur en plusieurs serveurs.
• L’hyperviseur permet à plusieurs machines
virtuelles de s’exécuter sur une seule machine.
• Chaque machine virtuelle comprend une copie
complète du système d’exploitation, de l’application,
des fichiers binaires et des bibliothèques nécessaires,
ce qui représente des dizaines de Go.
• Les machines virtuelles peuvent également
être lentes à démarrer.
39
Introduction à Docker
Conteneurs & machines virtuelles
• Les conteneurs et les machines virtuelles utilisés
conjointement facilitent le déploiement et la
gestion d’applications.
• Les conteneurs et les machines virtuelles of-
frent une souplesse dans la gestion et le déploiement
d’applications.
40
Introduction à Docker
Normes & standards de conteneur
• Démocratisation de conteneurs logiciel : le
lancement de Docker en 2013 a marqué le début
d’une révolution dans le développement d’appli-
-cation.
• Docker a développé une technologie de con-
teneur Linux, portable, flexible et facile à déployer.
• Docker a ouvert l’accès aux sources de
libcontainer et s’est associé à une commu-
nauté mondiale de contributeurs pour pour-
suivre son dévelop- -pement.
• En juin 2015, Docker a offert la spécification
d’image de conteneur et du code d’exécution,
nommé actuellement runc, à la Open Con-
tainer Initiative (OCI) afin d’aider à la normali-
sation au fur et à mesure de la croissance et de
la maturation de l’écosytème de conteneurs.
41
Introduction à Docker
• Suite à cette évolution, Docker continue avec
le projet containerd, que Docker a fourni à la
Cloud Native Computing Foundation (CNCF)
en 2017.
• containerd est un environnement d’exécution
standard qui s’appuie sur runc et a été créé
avec un accent mis sur la simplicité, la ro-
bustesse, et la portabilité.
• containerd est le principal environnement
d’exécution de Docker Engine :
https://containerd.io/
42
Introduction à Docker
Une plateforme moderne pour toutes les
applications
• Docker offre aux développeurs et aux ser-
vices informatiques la possibilité de créer, gérer
et sécuriser des applications sans contraintes
technologiques ou d’infrastructure.
• En combinant la technologie de gestionnaire
de conteneur, Docker permet d’intégrer des ap-
plications natives traditionnelles et des appli-
cations cloud construites sur Windows Server,
Linux et autres systèmes dans une chaı̂ne lo-
gistique automatisée et sécurisée, afin de fa-
ciliter la collaboration entre les développeurs
Dev et les administrateurs de productions et
d’opérations Ops.
43
Introduction à Docker
Une plateforme moderne pour toutes les
applications
• Docker augmente la productivité et réduit le
temps nécessaire aux développement d’applications,
ainsi permet de disposer désormais des ressources
nécessaires pour développer des projets de numé-
-risation couvrant l’ensemble de la chaı̂ne de
valeur.
• La chaı̂ne de valeur est constituée par la
modernisation des applications, la migration
dans le cloud et la consolidation de serveurs.
• Avec Docker, on dispose d’une solution qui
aide à gérer les diverses applications, les cloudset
l’infrastructure d’aujourd’hui, tout en offrant
aux projets une voie à suivre pour les applica-
tions futures.
44
Introduction à Docker
Les Besoins
Livraison rapide et cohérente d’applications
• Docker rationalise le cycle de développement
en permettant aux développeurs de travailler
dans des environnements standardisés en util-
isant des conteneurs locaux fournissant vos ap-
plications et services.
• Les conteneurs sont adaptés pour l’intégration
et la livraison continues — continous integra-
tion and continous delivery, CI/CD.
45
Introduction à Docker
Les Besoins
Déploiement et calibrage dynamique
• La plateforme de conteneurs Docker permet
des charges de travail portable. Les conteneurs
peuvent s’exécuter dans un environnement lo-
cal du développeur, sur des machines physiques,
virtuelles, des cloud ou dans plusieurs environ-
nements.
• La portabilité et la légèreté de Docker fa-
cilitent la gestion dynamique des charges de
travail, l’extension ou la suppression des appli-
cations et des services en fonction des besoins
en temps quasi réel.
46
Introduction à Docker
Les Besoins
Exécution de plusieurs charges sur le même
matériel
• Docker est rapide et léger. Il fournit une
alternative aux machines virtuelles basées sur
l’hyperviseur. Vous pouvez ainsi utiliser pleine-
ment la capacité de calcul de votre machine.
• Docker est adapté pour les environnements
à haute densité et pour les déploiements de
petite et moyenne taille où vous devez faire
plus avec moins de ressources.
47
Introduction à Docker
L’architecture Docker
• Docker utilise une architecture client-serveur.
Le client Docker communique avec le démon
Docker, qui se charge de la construction, l’exécution
et la distribution des conteneurs.
• Le client et le démon Docker peuvent être
exécutés sur le même système, ou vous pouvez
connecter un client Docker à un démon Docker
distant.
• Le client et le démon Docker communiquent
en utilisant une API REST, via des sockets UNIX
ou une interface réseau.
48
Introduction à Docker
Fig 2 : L’architecure de Docker
49
Introduction à Docker
Le démon Docker
• Le démon Docker (dockerd) écoute les requêtes
de l’API Docker et gère les objets Docker tels
que les images, les conteneurs, les réseaux, et
les volumes.
• Un démon peut également communiquer avec
d’autres démons afin de gérer les services Docker.
50
Introduction à Docker
Le client Docker
• Le client Docker (docker) est le moyen princi-
pal utilisé par les utilisateurs Docker afin d’interagir
avec Docker.
• Lorsque vous utilisez des commandes telles
que :
docker run
le client envoie ces commandes au démon dockerd
qui les exécute.
• La commande docker utilise l’API Docker.
• Le client Docker peut communiquer avec plusieurs
démons.
51
Introduction à Docker
Les registres Docker
• Un registre Docker stocke des images Docker.
• Docker Hub et Docker Cloud sont des registres
publics que tout le monde peut utiliser, et Docker
est configuré pour chercher des images sur le
Docker Hub par défaut.
• Il est possible de g’erer son propre registre
privé. Si vous utilisez Docker Datacenter (DDC),
il inclut Docker Trusted Registry (DTR).
52
Introduction à Docker
Les registres Docker
• Quand vous utilisez les commandes :
docker pull
docker run
les images requises sont extraites de votre reg-
istre configuré.
• Quand vous utilisez :
docker push
votre image est transféré dans le registre con-
figuré.
53
Introduction à Docker
Docker Store
• Docker Store vous permet d’acheter et de
vendre des images Docker ou les distribuer gra-
tuitement.
• Par exemple, vous pouvez acheter une im-
age Docker contenant une application ou un
service auprès d’un fournisseur de logiciels et
utiliser l’image pour déployer l’application dans
vos environnements de test, de stockage et de
production.
• Vous pouvez mettre à jour l’application en
extrayant la nouvelle version de l’image et redé-
-ployer les conteneurs.
https://hub.docker.com/
54
Introduction à Docker
Les objets Docker
• Lorsque vous utilisez Docker, vous créez et
utilisez des images, des conteneurs, des réseaux,
des volumes, des plugins et autres objets tels
que :
- les images, représentant un modèle en lec-
ture seule avec des instructions pour créer un
conteneur Docker ;
- les conteneurs, représentant une instance
exécutable d’une image ;
- les services, permettant de redimensionner
les conteneurs sur plusieurs démons Docker, qui
fonctionnent tous ensemble en groupe (swarm)
avec plusieurs gestionnaires et conteneurs (tra-
vailleurs).
55
Installation de Docker
Docker sur Linux
• Prérequis Sur les versions récentes, la plu-
part des prérequis logiciels font partie des dis-
tributions. Cependant, les deux points princi-
paux à prendre en compte sont un noyau récent
(3.10) minimum et une installation 64 bits.
• Installation par gestionnaire de paquets
La méthode la plus simple consiste à utiliser le
gestionnaire de paquets Aptitude pour installer
Docker, ce dernier étant désormais incorporé
dans certaines distributions.
• Documentation en ligne
https://docs.docker.com/get-docker/
56
Installation de Docker
Docker sur Debian
• Debian Jessie/Wheezy
uname -r
uname -m
lsb release -a
getconf LONG BIT
• Les paquets supplémentaires
sudo apt-get update
sudo apt-get install curl
57
Installation de Docker
Docker sur Debian
• Installation par script Il est possible d’installer
Docker à partir d’un script fourni par Docker
en fonction de la distribution qu’il détecte. Ce
script est obtenu depuis :
https://get.docker.com
• Il est possible possible de télécharger le script
depuis un navigateur et le sauvegarder dans un
fichier ou bien le récupérer en ligne de com-
mande :
wget -O dockerinstall.sh https://get.docker.com
• Il est instructif de consulter les opérations
d’installation réalisées par le script, et con-
stitue également une bonne habitude à prendre
lorsqu’on exécute un fichier téléchargé depuis
l’Internet, pour des raisons de sécurité.
58
Démarrage d’un Conteneur
Hello World, Docker
Validation de l’installation Un exemple de
conteneur qui affiche un message de bienv-
enue. L’intérêt de ce conteneur est de valider
l’installation de Docker et de vérifier que l’ensemble
de la chaı̂ne logicielle fonctionne.
• Démarrer un conteneur Hello World im-
plique une certain nombre d’opérations afin
d’afficher le résultat :
sudo docker run hello-world
• Récupération de l’image Pour commencer,
Docker a besoin de lire l’image nommée hello-world
qui lui a été passée en paramètre de la com-
mande run.
59
Démarrage d’un Conteneur
• Docker dispose d’un dépôt d’images aux-
-quelles il peut accéder par Internet. Ce dépôt,
connu sous le nom de registre, regroupe toutes
les images officielles fournies par Docker, et ac-
cessible par l’URL:
https://registry.hub.docker.com
• Il est possible de stocker vos propres images
si vous souhaitez les partager, ou de créer des
dépôts privés.
60
Démarrage d’un Conteneur
Hello World, Docker
• Constatant que l’image n’était pas déjà présente
sur la machine hôte, Docker l’a téléchargé. Il
est toutefois possible de récupérer l’image au
préalable.
• Télécharger une image sans l’exécuter
sudo docker pull hello-world
• Dans le cas de l’image hello-world, dont la
taille est de moins 1Ko pour certaine versions,
la différence de temps est infime, mais pour
des images volumineuses, il peut être utile de
séparer le téléchargement et le lancement.
• Docker gère un cache des images sur la ma-
chine, et le prochain démarrage d’une instance
de conteneur sur la même image n’aboutira
donc pas nécessairement au rechargement de
celle-ci, sauf si elle a été modifiée entre temps.
61
Démarrage d’un Conteneur
Anatomie de l’image hello-world
• Une recherche sur le registre Docker permet
de localiser la page correspondant à l’image en
ligne, à savoir depuis :
https://hub.docker.com
• Il est aussi possible de passer par un nouveau
service nommé Docker Store qui permet de lo-
caliser l’image :
https://store.docker.com
62
Démarrage d’un Conteneur
Anatomie de l’image hello-world
• La page fait référence à différentes caractéristiques
de l’image, et en particulier à un fichier qui se
nomme Dockerfile. Ce fichier correspond à la
définition textuelle du contenu de l’image. En
suivant le lien vers ce fichier, on accède à sa
version actuelle, qui est stockée sur le dépôt
de code source GitHub :
https://github.com/docker-library/hello-world/...
63
Démarrage d’un Conteneur
Anatomie de l’image hello-world
• Le contenu du fichier Dockerfile :
1 FROM scratch
2 COPY hello /
3 CMD ["/hello"]
• La ligne 1 définit sur quelle image la présente
image va se baser. Dans ce cas, le mot clé
scratch correspond à une machine vide
• La ligne 2 fait en sorte que, lorsque le fichier
Dockerfile sera lu pour générer l’image, le con-
tenu du fichier hello sera ajouté dans la racine
du système de fichiers de l’image
• Enfin, la ligne 3 établit que le démarrage de
l’image provoquera le lancement de la com-
mande /hello, qui exécutera le contenu du
fichier précédemment copié.
64
Démarrage d’un Conteneur
Anatomie de l’image hello-world
• En effet, le fichier Dockerfile doit être trans-
formé en une image utilisable (grâce à la com-
mande build), mais pour cet exemple de simple
lancement d’un conteneur à partir d’une image
préexistante, cette opération de compilation a
déjà été réalisée en amont par Docker, et le
registre nous expose une image déjà compilé.
• En remontant d’un niveau dans l’arborescence
du projet, nous retrouvons le fichier hello. Il
s’agit d’un fichier binaire généré par le Makefile,
celui-ci étant en charge de produire un fichier
exécutable à partir du code assembleur stocké
dans le fichier hello.asm.
• Pour information, ce choix d’utiliser du code
assembleur est dans le but de produire une
image réduite tout en étant compatible avec
n’importe quel système Linux 64 bits.
65
Démarrage d’un Conteneur
Lancement du processus
• Une fois que l’image a été fournie puis récupérée
dans le cache local, la commande run demande
à Docker de créer un conteneur, autrement un
espace étanche dans le système de la machine
hôte, avec ses propres espace de nommage
pour la gestion des processus, des entrées/sorties,
du réseau et autres ressources.
• L’instanciation se poursuit avec le montage
d’un système de fichier en couches, de façon
que le conteneur final dispose des fichiers con-
tenus dans l’image, mais en ajoutant également
une dernière couche qui est la seule en écriture.
• Si des modifications sont apportées dans le
système de fichiers par le processus hébergé
dans le conteneur, c’est cette couche qui sera
modifiée en fonction.
66
Démarrage d’un Conteneur
Lancement du processus
• Dans le cas de l’image Hello-World, aucune
écriture n’est réalisée, mais la couche existe.
• La couche scratch est en fait inexistente,
car il s’agit d’un identifiant particulier précisant
que l’image ne se base sur aucune autre image
existante.
• Docker procède ensuite à la création d’une
interface réseau qui permettra la communica-
tion entre le conteneur et la machine hôte,
il place le conteneur dans une configuration
réseau ainsi que dans le bon système de fichiers
en utilisant la commande chroot et peut passer
à la dernière étape, à savoir le lancement du
processus proprement dit.
67
Démarrage d’un Conteneur
Lancement du processus
• Le processus démaré est celui qui avait été
prévu dans l’image par la commande CMD du
fichier Dockerfile, dans ce cas /hello.
• Le conteneur va donc exécuter cette com-
mande, qui déclenchera le fichier exécutable
en charge d’afficher le texte de bienvenue con-
tenu dans le fichier hello.asm. La redirection
des entrées/sorties de console permettra à la
machine hôte de manipuler plus facilement le
processus isolé.
68
Arrêt d’un Conteneur
Lister les conteneurs
• L’image hello-world contient un processus
prévu pour réaliser une tâche – en l’occurrence
afficher un message de bienvenue – puis s’arrêter.
• Il est possible de retrouver la trace des con-
teneurs exécutés même après que ceux-ci se
soient arrêtés.
• Les commandes suivantes permettent d’afficher
la liste des conteneurs en cours ainsi que tous
les conteneurs respectivement:
sudo docker ps
sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED
94acebe02ea8 hello-world "/hello" 10 seconds ago
STATUS PORTS NAMES
Exited (0) 9 seconds ago awesome beaver
69
Les Conteneurs
Lister les conteneurs
• CONTAINER ID (94acebe02ea8): Représente
l’identifiant unique du conteneur. Docker crée
automatiquement un nouvel identifiant à chaque
lancement d’un conteneur, même s’ils instan-
cient la même image. Cet identifiant peut être
fourni, y compris dans sa forme réduite (les
quatre ou cinq premier caractères suffisent en
général), lorsqu’on souhaite mettre en pause
ou arrêter un conteneur.
• IMAGE (hello-world:latest): Il s’agit du nom
de l’image utilisée pour instancier le conteneur.
Le suffixe :latest indique qu’il s’agit de la dernière
version disponible. Il est possible de spécifier
une version particulière d’une image. Par défaut
la plus récente est utilisée.
70
Les Conteneurs
Lister les conteneurs
• COMMAND ("/hello"): Cette information reprend
le contenu de la ligne CMD du fichier Dockerfile,
dans la commande lançant le processus dans le
conteneur.
• CREATED (10 seconds ago): Donne la date
d’initialisation du conteneur.
• STATUS (Exited(0) 9 seconds ago): le statut
du conteneur contient plusieurs informations.
Dans ce cas, le conteneur s’est arrêté, et le
processus interne est sorti avec le code 0, qui
correspond par convention à un déroulement
sans erreur.
• PORTS: Les ports réseau exposés par le con-
teneur, en l’occurrence aucune dans le cas de
cet exemple n’affichant que du texte.
71
Les Conteneurs
Lister les conteneurs
• NAMES (awesome beaver): Il est possible d’affecter
un nom à un conteneur lors de son lancement,
pour pouvoir les manipuler plus facilement que
par leur identifiant. En l’absence de nom spécifié,
Docker crée un nom à partir d’une combinaison
de noms propres et d’adjectifs.
• Un autre signe de l’exécution du conteneur
est que l’image hello-world a été téléchargée,
et se trouve donc dans la liste des images présentes
sur la machine hôte.
72
Les Conteneurs
Lister les images
sudo docker images
• Le résultat fourni les informations suivantes:
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 48b5124b2768 2 weeks ago 1.84 kB
• REPOSITORY (hello-world): le nom de l’image
dans le dépôt.
• TAG (latest): sa version, qui peut être un
nombre ou une dénomination textuelle. Ces
tags peuvent être multiples par rappot à une
même image.
• IMAGE ID (48b5124b2768): un identifiant unique
pour l’image
73
Les Conteneurs
Lister les images
• CREATED (2 weeks ago): la date de création de
l’image dans la machine hôte Docker. Il s’agit
de la date de création dans le cache local et
non pas celle par le dépôt.
• SIZE (1.84 kB): la taille de l’image. Il s’agit
d’une taille virtuelle représentant toutes les couches
composant successivement l’image. La taille
réellement occupé sur le disque dur par une
image est donc souvent inférieur.
74
Lancement d’un Conteneur In-
teractif
Récupération d’une image dans sa
dernière version
sudo docker pull ubuntu:latest
• Le chargement d’image a lieu une fois pour
toutes, et tout lancement suivant se basera
sur cette image, y compris d’ailleurs – et c’est
l’avantage de l’architecture par couche – toute
les images se basant sur celle-ci. Le client
Docker renvoie des informations sur le téléchargement
en cours comme suit une fois finalisé :
latest: Pulling from library/ubuntu
8aec416115fd: Pull complete
695f074e24e3: Pull complete
946d6c48c2a7: Pull complete
bc7277e579f0: Pull complete
2508cbcde94b: Pull complete
Digest: sha256:71cd81252a3563a03ad8daee81047b62ab5d892ebbfbf
Status: Downloaded newer image for ubuntu:latest
75
Lancement d’un Conteneur In-
teractif
Récupération d’une image dans sa
dernière version
• Le téléchargement réalisé, une commande
permet de voir les images disponibles locale-
ment:
sudo docker images
• Le résultat correspond aux images comme
suit:
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest f49eec89601e 8 days ago 129 MB
hello-world latest 48b5124b2768 2 weeks ago 1.84 kB
76
Lancement d’un Conteneur In-
teractif
Présentation des TAGS
• Le tag associé à l’image ubuntu est latest,
comme précisé dans la commande pull. Le tag
est un marqueur de version de l’image. Toute-
fois, contrairement à un système de version,
il est possible d’avoir plusieur tags pour une
même version.
• Le lancement du conteneur sans option
peut être réalisé par la ligne de commande suiv-
ante:
docker run ubuntu
• Sans l’utilisation d’un tag après le nom de
l’image implique à la commande run qu’il s’agit
de la version latest par défaut.
77
Lancement d’un Conteneur In-
teractif
Liste des conteneurs
• Pour lister les conteneurs actifs et inactifs
respectivement :
docker ps
docker ps -a
• Le résultat indique qu’aucun conteneur est
actif (la commande ps sans option). Pour la
seconde commande, le résultat correspond à
tous les conteneurs y compris ceux qui ne sont
pas actiifs.
• Le STATUS indique que le processus s’est arrêté
sans erreur et la COMMAND correspond à /bin/bash.
78
Lancement d’un Conteneur In-
teractif
• Le contenu du ficher Dockerfile nous indique
que le processus lancé correspond par défaut
est /bin/bash.
https://hub.docker.com/ /ubuntu/
• Sans console associée – entrées/sorties –
le processus shell s’arrête automatiquement.
Donc ce conteneur n’a aucune utilité.
• Suppression d’un conteneur
docker ps -a
docker rm nom conteneur
79
Lancement d’un Conteneur In-
teractif
• Pour exploiter le conteneur ubuntu, et in-
teragir avec le processus shell lancé, nous al-
lons exécuter le conteneur en mode interactif,
en lui associant une console TTY pour assurer
les entrées/sorties.
docker run -i -t ubuntu
• Dans ce cas Docker rend la main mais à
travers l’invite de commande du shell du système
ubuntu du conteneur.
• L’utilisateur n’est plus celui du système hôte,
mais l’utilisateur root de la machine nommé
à travers l’identifiant du conteneur. Comme
toute machine qui serait effectivement distincte,
nous pouvons appeler toute commande par le
shell.
80
Lancement d’un Conteneur In-
teractif
Les modifications par rapport à son
image
• Pour trouver la liste des modifications d’un
conteneur par rapport à son image de lance-
ment:
docker diff identifiant conteneur | nom conteneur
• D pour la suppression, C pour la création de
répertoire, A pour ajout d’un fichier.
• Ces modifications concernent unique l’image
du conteneur et non l’image téléchargée.
• Afin de garder l’état d’un conteneur en une
nouvelle image:
docker commit identifiant conteneur | nom conteneur
81
Manipulation des Conteneurs
Supprimer une image
docker rmi nom image
Suppression automatique à la sortie
docker run rmi hello-world
Affectation d’un nom de conteneur
docker run --name=nom conteneur choisi image instanciée
Modification du point d’entrée par défaut
docker run --rm ubuntu env
Ajout de variable d’environnement
docker run --rm -e HOSTNAME=dada.com ubuntu env
82
Manipulation des Conteneurs
Lancement en mode bloquant
• Ce mode de fonctionnement est adapté aux
images qui fournissent le shell comme point
d’entrée par défaut par exemple, ou n’importe
quel processus avec une durée limitée à son us-
age immédiat telle que l’exécution d’une com-
mande.
Lancement en arrière plan
docker run -i -t -p 88:80 nginx
docker run -d -p 88:80 nginx
Gestion de cycle de vie des conteneurs
docker stop nom conteneur | identifiant
docker start nom conteneur | identifiant
docker restart nom conteneur | identifiant
docker logs nom conteneur | identifiant
docker top nom conteneur | identifiant
83
Manipulation des Conteneurs
Exposition de fichiers
• Remplacer une partie d’arborescence du
conteneur par un emplacement hôte est possi-
ble par l’option de gestion de volume -v comme
suit:
docker run -d -p 88:80 --name web \
-v /var/www/:/usr/share/nginx/html:ro nginx
• Il s’agit de mettre en correspondance le répertoire
/usr/share/nginx/html – à savoir la racine par
défaut de nginx – avec /var/www/ de la machine
hôte.
• Le fonctionnement par défaut de l’image a
été modifié sans la création d’une nouvelle im-
age.
• L’accès au répertoire de la machine hôte est
autorisé uniqument en lecture seule (:ro).
84
Création d’Images avec Docker
Création manuelle d’une nouvelle image
• L’approche la plus simple pour créer une nou-
velle image est d’utiliser la commande commit
pour persister l’état d’un conteneur sous forme
d’une nouvelle image, après avoir ajouté à celui-
ci les modifications nécessaires.
• Une nouvelle image à partir d’une image
ubuntu comme base, en installant un serveur
base de données non relationnelle MongoDB dans
le conteneur. Ensuite, persister le conteneur
sous forme d’une image réutilisable.
85
Création d’Images avec Docker
Installation d’un serveur MongoDB
• Les procédures d’installation d’un serveur MongoDB
sur ubuntu sont décrites dans la documentation
suivante :
https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/
• Les procédures :
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80\
--recv 0C49F3730359A14518585931BC711F9BA15703C6
echo "deb [ arch=amd64 ] http://repo.mongodb.org/apt/ubuntu\
precise/mongodb-org/3.4 multiverse" | \
sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list
sudo apt-get update
sudo apt-get install -y mongodb-org
mongod --config /etc/mongod.conf &
ps
86
Création d’Images avec Docker
Installation d’un serveur MongoDB
• L’appel à la commande ps permet de vérifier
que le démon mongod est bien lancé. La com-
mande précédente permet de lancer le démon
en pointant sur le fichier de configuration par
défaut.
• Une fois exécuté, il sera possible d’utiliser un
client mongo, également installé par la procédure
d’installation, pour se connecter au serveur,
insérer une donnée et lancer une requête, de
façon à valider l’installation.
87
Création d’Images avec Docker
Installation d’un serveur MongoDB
# mongo
...
> use testdb
switched to db testdb
> db.utilisateurs.insert( { nom : "test", prenom : "reussi" } )
WriteResult({ "nInserted" : 1 })
> db.utilisateurs.find()
{ " id" : ObjectId("589758a1ad9a417fe7052d08"), "nom" : "test",
> db.utilisateurs.drop()
true
> exit
# exit
• Les appels à la commande exit respective-
ment permet de sortir du client mongo et de sor-
tir du conteneur, qui arrêtera le shell hébergé.
88
Création d’Images avec Docker
Persistance de l’image
• Afin de créer une image à partir du conteneur
et l’utiliser dans la suite, il faut l’identifier par
la commande ps de Docker.
• La commande commit est ensuite utilisée pour
créer une image, et la validation de sa création
sera faite par appel à la commande images.
sudo docker ps -a
sudo docker commit nom conteneur doclab/mongodb
sudo docker images
89
Création d’Images avec Docker
Utilisation de l’image créée
• L’image nommée doclab/mongodb va être utilisée
pour lancer un nouveau conteneur – le précédent,
qui nous a servi à créer l’image, peut être sup-
primer.
• Afin d’identifier ce nouveau conteneur, il sera
nommé mongo. Il sera démarrer en mode inter-
actif afin de vérifier que le serveur MongoDB est
bien exécuté:
$ sudo docker run -it --name mongo doclab/mongodb
# ls /usr/bin/mongo*
# ps
#
90
Création d’Images avec Docker
Utilisation de l’image créée
• L’exécutable mongod existe dans /usr/bin/,
mais le processus démon n’est pas démarré
comme il était lorsque nous avons arrêter le
précédent conteneur.
• Le comportement est bien attendu, à savoir
que toutes les modifications sur le disque ont
été reprises dans l’image, mais pour ce qui est
du processus, un nouveau conteneur exécute
un nouveau processus.
• Dans notre cas, le processus correspond à
/bin/bash qui est la commande par défaut de
notre nouvelle image. Lorsque le conteneur
est démarré, nous prenons donc bien la main
en mode interactif.
91
Création d’Images avec Docker
Utilisation de l’image créée
• Cependant, pour que le serveur MongoDB soit
accessible, nous devons exécuter à nouveau la
commande mongod --config /etc/mongod.conf.
• Ce mode de fonctionnement n’est pas recom-
mandable : une procédure de déploiement doit
être automatique.
• Une façon de faire serait de rajouter la com-
mande dans le fichier /etc/bash.bashrc par ex-
emple comme suit:
echo "/usr/bin/mongod --config /etc/mongod.conf &">>/etc/bash.bash
tail /etc/bash.bashrc
92
Création d’Images avec Docker
Utilisation de l’image créée
• Pour tester la nouvelle configuration, il faut
relancer le shell, donc un conteneur sans ou-
blier de valider les modifications dans l’image,
sous peine de ne voir aucun changement.
# exit
$ sudo docker commit mongo doclab/mongodb
$ sudo docker rm -f mongo
$ sudo docker run -it --name mongo doclab/mongodb
# ps
• Ainsi, lorsque le conteneur mongo est exécuté,
le processus démon est bien lancé.
93
Création d’Images avec Docker
Connexion depuis la machine hôte
• Afin d’interagir avec la base MongoDB, il con-
vient de le faire depuis l’extérieur du conteneur,
par exemple depuis la machine hôte.
• Il s’agit de configurer le serveur mongod en
modifiant le fichier /etc/mongod.conf en com-
mentant la variable bindIP=127.0.0.1.
• Une fois le conteneur arrêté, reprendre la
commande commit que précédemment. Ensuite,
supprimer le conteneur avec la commande:
sudo docker rm mongo
• Relancer un nouveau conteneur en mode in-
teractif avec la commande:
sudo docker run -it doclab/mongodb
94
Création d’Images avec Docker
Connexion depuis la machine hôte
• L’étape suivante consiste à utiliser un client
MongoDB sur la machine depuis laquelle nous
souhaitons nous connecter, par exemple la ma-
chine hôte.
• Enfin, avant la connexion il s’agit de retrou-
ver l’adresse IP du conteneur Docker, comme
suit:
sudo docker inspect mongo | grep IP
• La connexion sera établie ainsi:
$ mongo --host IP
95
Création d’Images avec Docker
Résultat
• Le mode de fonctionnement mis en œuvre
n’est pas totalement satisfaisant. L’exécution
du client montre des avertissements sur le
fait que le processus serveur est lancé avec
l’utilisateur root, ce qui est à ev’iter en pra-
tique de point de vue de la sécurité.
• Ensuite, le conteneur est lancé en mode in-
teractif, ce qui n’est pas logique vu le type
d’utilisation avec un serveur de base de données.
L’arrêt du shell implique l’arrêt du conteneur
et ainsi le serveur.
96
Création d’Images avec Docker
Résultat
• Cette configuration peut être améliorée avec
la création d’un utilisateur dédié pour le serveur
MongoDB, et donc nécessite plus de temps dans
la documentation et les tests de mises en place.
• Le résultat final n’est peut-être pas garanti
en comparant une mise en œuvre d’un spécialiste
de cette base de données.
• Cependant, cette mise en œuvre propre ex-
iste déjà, sous la forme d’une image Docker
officiel pour MongoDB.
• Cette image fournit les instructions à utiliser
sous forme d’un fichier contenant toutes les
commandes nécessaires à une installation ro-
buste.
97
Utilisation d’un Dockerfile
Intérêt des fichiers Dockerfile
• Le fichier Dockerfile contient toutes les opérations
nécessaires à la préparation d’une image Docker.
• Ainsi, au lieude construite une image manuelle-
ment, il s’agit de compiler une image depuis
une description textuelle de ces opérations.
• Considérant le contenu du fichier Dockerfile
correspondant à l’image officielle MongoDB
https://hub.docker.com/r/ /mongo/
• En comparaison à une installation manuelle,
la mise en place d’un utilsateur et d’un groupe
dédiés a été utilisée.
98
Utilisation d’un Dockerfile
Intérêt des fichiers Dockerfile
• L’affectation des droits correspondants sur
les répertoires pour lesquels cette opération est
nécessaire.
• L’utilisation d’un ENTRYPOINT dédié, qui per-
met de spécifier le script à exécuter lors du
démarrage du conteneur.
• La mise en œuvre d’un processus par défaut
différent du shell.
99
Utilisation d’un Dockerfile
• Bien que, dans le cas d’une image officielle,
le fichier Dockerfile serve au producteur pour
réaliser l’image et montrer publiquement la façon
dont celle-ci a été réalisée.
• Le lien entre les deux étant assuré en partic-
ulier par le fait que c’est Docker Hub qui s’occupe
de compiler les images, il est poosible d’utiliser
ce fichier pour créer une image.
• Les procédures à suivre :
- Sur la machine hôte, création d’un répertoire nommé mongodb
- Se placer dans ce répertoire.
- Recopier les deux fichiers Dockerfile et docker-entrypoint.sh
- Affecter les droits de lecture sur les deux fichiers.
- Affecter les droits d’exécution sur docker-entrypoint.sh.
• La commande de compilation de l’image
depuis le répertoire mongodb
sudo docker build .
100
Utilisation d’un Dockerfile
• L’image créée n’a pas de nom explicite
sudo docker images
sudo docker tag image ID doclab/mongodb
sudo docker images
• L’image créée est identique à l’image offi-
cielle que nous aurions pu télécharger par le
registre Docker Hub.
• Un appel à docker ps montre que le con-
teneur est actif, avec le processus serveur à
l’écoute.
sudo docker run -d --name mongo doclab/mongodb
sudo docker ps
sudo docker inspect mongo | grep IP
mongo --host IP
101
Anatomie d’un Dockerfile
• FROM Les fichiers Dockerfile commencent
toujours par la commande FROM, qui permet de
définir une image de base par-dessus laquelle
la nouvelle image sera construite. Dans ce cas,
il s’agit d’une Debian, version Wheezy.
FROM debian:wheezy
• Si cette image n’est pas présente sur la ma-
chine hôte, elle sera téléchargée lors de l’exécution
de la commande build. Dans le cas où une
image est construite sans partir d’une image
existente : FROM scratch.
• RUN La commande est une des plus utilisées
dans les Dockerfile. Elle permet d’exécuter
n’importe quel processus qui va participer à
l’élaboration de l’image en cours de compila-
tion.
RUN ["exécutable", "paramètre1", . . ., "paramètren"]
102
Anatomie d’un Dockerfile
• ENV permet de déterminer des variables
d’environnement, qui seront disponibles non
seulement pour le reste de l’opération de com-
pilation du Dockerfile, mais aussi dans les con-
teneurs qui seront exécutés depuis l’image générée.
ENV MONGO MAJOR 3.0
ENV MONGO VERSION 3.0.1
• Cette commande correspond aux variables
d’environnement d’un conteneur:
sodu docker inspect mongo | head -22
• Il est aussi possible de passer des variables
d’environnement lor de l’exécution d’un con-
teneur avec l’option --env de la commande
docker run.
103
• VOLUME Dans le cas d’un serveur de base
de données comme Mongodb, il est important
que les fichiers de données soient détachés du
conteneur de base de données lui-même.
sudo docker run -d --name mongo doclab/mongodb
sudo docker inspect mongo | grep IP
...
> use testdb
switched to db testdb
> db.utilisateurs.insert( { nom : "test", prenom : "reussi" } )
WriteResult({ "nInserted" : 1 })
> db.utilisateurs.find()
{ " id" : ObjectId("589758a1ad9a417fe7052d08"), "nom" : "test",
> exit
sudo docker run -d --name mongo doclab/mongodb
sudo docker inspect mongo | grep IP
...
> use testdb
switched to db testdb
> db.utilisateurs.find()
> exit
sudo docker rm -fv mongo
mkdir ~ /donnees
sudo docker run -d --name mongo -v ∼/donnees:/data/db doclab/mongo
. . . sudo docker rm -fv mongo
sudo docker run -d --name mongo -v ∼/donnees:/data/db doclab/mongo
104
Anatomie d’un Dockerfile
• COPY La commande COPY permet de récupérer
des fichiers locaux à la machine sur laquelle la
commande docker build est lancée, et de les
intégrer dans l’image en cours de création.
• Dans notre exemple, le fichier docker-entrypoint.sh
se trouvait au même endroit que le fichier Dockerfile
livré par les mainteneurs de l’image officielle de
MongoDB.
• Comme ce fichier est nécessaire à l’exécution
du conteneur, la commande COPY le recopie
dans la racine de l’image compilée.
• En pratique, les fichiers se trouvant au même
répertoire que Dockerfile sont copiés dans ce
qu’on appelle le contexte, et donc chargés par
la commande build.
105
Anatomie d’un Dockerfile
• ENTRYPOINT Ce mot clé permet de définir
la commande qui va être exécutée lors du démarrage
d’un conteneur, autrement le processus pri-
maire qui sera porté par ce dernier.
• Une machine Non Uniform Memory Access –
l’architecture NUMA permet la mise en commun
de ressources mémoire entre plusieurs machine.
• EXPOSE permet d’exposer un port réseau
à l’extérieur, un peu comme le fait VOLUME avec
les systèmes de fichiers.
• CMD permet de passer au processus spécifié
par ENTRYPOINT les paramètres par défaut, en
l’absence de paramètres explicitement spécifiés
en fin de commande docker run
106
Un exemple de Dockerfile
• Il s’agit d’une image qui une fois instanciée
sous forme de conteneur, émettra des signaux
textuels sur la console de sortie à intervalles
réguliers.
• Le message sera paramétrable au démarrage
du conteneur, avec une valeur par défaut portée
par CMD.
• ENTRYPOINT sera utilisé pour que l’émission de
message puisse être arrêtée, puis reprise.
107
Un exemple de Dockerfile
Le script nommé percussion.sh
#!/bin/bash
if [ -z "$RYTHMEPERCUSSION" ] ; then
echo "RYTHMEPERCUSSION non définie"
return 1;
fi
while true;
do
echo $1 \($(date +%H:%M:%S)\);
sleep "$RYTHMEPERCUSSION";
done
Dockerfile
FROM ubuntu:latest
MAINTAINER Openepo "[email protected]"
COPY percussion.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENV RYTHMEPERCUSSION 2
ENTRYPOINT ["/entrypoint.sh"]
CMD ["percussion"]
108
Construction d’une Image
• Test du script par son exécution sur la ma-
chine hôte
. ./percussion.sh bonjour
RYTHMEPERCUSSION non définie
echo $?
1
• Pour un test fonctionnel
RYTHMEPERCUSSION=2 . ./percussion.sh
(12:24:57)
(12:24:59)
(12:25:01)
(12:25:03)
(12:25:05)
(12:25:07)
(12:25:09)
^C
109
Construction d’une Image
Génération de l’image
• La génération de l’image est réalisée par la
commande docker build
sudo docker build -t doclab/percussion .
sudo docker images -a
• Lancement du conteneur
sudo docker run -it --name percussion doclab/percussion
(12:24:37)
(12:24:39)
(12:25:41)
(12:25:43)
(12:25:45)
(12:25:47)
(12:25:49)
^p^q
sudo docker logs percussion | tail
110
Construction d’une Image
Génération de l’image
• Arrêt et relance du conteneur
sudo docker start percussion
sudo docker stop percussion
sudo docker logs percussion | tail -20
sudo docker pause percussion
sudo docker ps
sudo docker unpause percussion
sudo docker ps
sudo docker logs percussion | tail -20
111
Construction d’une Image
Génération de l’image
• Gestion des paramètres
sudo docker rm -fv percussion
sudo docker run -d --name percussion doclab/percussion
sudo docker rm -fv percussion
sudo docker run -d --name percussion doclab/percussion "Dom Tek"
sudo docker rm -fv percussion
sudo docker run -d --name percussion --env RYTHMEPERCUSSION=1 \
doclab/percussion
112
Construction d’une Image
Reconstruction d’une Image
• La modification de la variable d’environnement
souligne les capacités d’amélioration de la ro-
bustesse de fonctionnement fournies par les
conteneurs Docker.
• Il est en effet possible de modifier la variable
d’environnement, et en même temps, la valeur
par défaut est assurée par le Dockerfile.
• Ainsi, il serait possible de simplifier le script
percussion.sh, en supprimant les premières lignes
car elles ne serviront pas dans une image Docker:
#!/bin/bash
while true;
do
echo $1 \($(date +%H:%M:%S)\);
sleep "$RYTHMEPERCUSSION";
done
113
Construction d’une Image
Reconstruction d’une Image
• Le lancement de la commande build permet
de recréer l’image avec cette nouvelle version
du script:
sudo docker build -t doclab/percussion .
.
.
---> Using cache
...
• Docker utilise le cache chaque fois qu’il est
possible afin d’éviter de relancer des opérations
longues et identiques.
• Il est possible par nécessité de passer outre
le cache avec l’option --no-cache.
114
Construction d’une Image
Reconstruction d’une Image
• Le mécanisme de cache est en lien avec les
images intermédiaires qui s’affichent lors de la
création d’image.
• Les images intermédiaires peuvent être garder
après une compilation correcte, avec l’option
-rm=false de la commande docker build.
115
Construction d’une Image
Commande additionnelle
• ADD Cette commande réalise la même ac-
tion que celle de COPY dans un Dockerfile, mais
offre deux fonctionnalités additionnelles.
• Si la source est une fichier archive tar, son
contenu sera désarchivé vers la destination.
• Si la source est une URL, le contenu sera
téléchargé et déposé dans la destination.
116
Construction d’une Image
Notion de contexte
• La compilation d’une image Docker se fait à
l’intérieur d’un contexte, qui est le répertoire
contenant le Dockerfile qui pilote cette génération
d’image.
• Ainsi, la commande COPY ne pourra pas aller
chercher de fichiers sur la machine hôte, mais
seulement ceux qui se trouvent dans le même
répertoire que Dockerfile.
• Le chargement du contexte est signalé lors de
la compilation d’une image avec la commande
docker build.
• Le contexte permet de sécuriser la produc-
tion d’image, en ne donnant pas accès à d’autres
fichiers. Ainsi ceci implique de bien s’assurer
d’intégrer uniqument les fichiers nécessaires pour
la construction d’image.
117
Construction d’une Image
Processus de démarrage
• Dans l’exemple précédent ENTRYPOINT corre-
spondait au processus à exécuter, et CMD au
paramètre qui devait lui être passé par défaut:
ENTRYPOINT ["/entrypoint.sh"]
CMD ["percussion"]
• La différence entre RUN et CMD/ENTRYPOINT, est
que la commande RUN est exécutée au moment
de la compilation. RUN ne doit pas être utilisée
pour lancer des processus qu’on souhaite voir
actifs.
• La commande RUN est utilisée pour lancer des
commandes de préparation de l’image.
118
Construction d’une Image
Processus de démarrage
• Cependant, les commandes CMD peut être
utilisée sans ENTRYPOINT. L’exécutable à démarrer
lors du lancement du conteneur sera alors spécifié
dans CMD, comme le montre l’exemple:
FROM ubuntu:latest
MAINTAINER Openepo "[email protected]"
COPY percussion.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENV RYTHMEPERCUSSION 2
CMD ["/entrypoint.sh", "percussion"]
119
Construction d’une Image
Processus de démarrage
• L’exécution d’un conteneur sans paramètre
donne le résultat attendu. Par contre, avec
paramètre le résultat ne correspond plus à celui
de la version précédente.
sudo docker run -it --name percussion doclab/percussion
...
sudo docker rm -fv percussion
sudo docker run -it --name percussion doclab/percussion \
"Dom Tek"
...
120
Construction d’une Image
Processus de démarrage
• En effet, Docker considère alors que la sur-
charge remplace tout le tableau JSON – Java
Script Object Notation – avec les deux paramètres
passés à la commande CMD.
http://www.json.org/
http://json.org/example.html
• Une façon de lancer la surcharge est de rem-
placer la totalité de la commande à exécuter
avec le paramètre associé:
sudo docker run -it --name percussion doclab/percussion \
./entrypoint.sh "Dom Tek"
...
sudo docker run -it --name percussion --entrypoint \
./entrypoint.sh doclab/percussion "Dom Tek"
...
121
Construction d’une Image
Processus de démarrage
• Bien que ce passage de paramètres soit utile,
cet usage n’est pas recommandé car il s’éloigne
de l’objectif initiale de la partition entre ENTRYPOINT
et CMD.
• ENTRYPOINT doit porter ce qui ne change pas
d’une exécution à l’autre du conteneur. CMD
est un opérateur précisément dédié à la four-
niture d’une valeur par défaut destinée à être
échangée par une valeur de paramètre fournie
lors de l’exécution.
122
Construction d’une Image
Processus de démarrage
• Dans les cas où une image doit pouvoir changer
de processus, il est recommandé de créer un
script de lancement qui réagit au passage d’un
paramètre et lance lui-même le bon processus,
comme cela a été montré dans l’exemple de
MongoDB.
Format ligne de commande ou exécution
• Soit le Dockerfile suivant qui utilise un tableau
JSON de paramètres:
FROM ubuntu:latest
MAINTAINER Openepo "
[email protected]"
COPY percussion.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENV RYTHMEPERCUSSION 2
CMD ["ps", "-aux"]
123
Construction d’une Image
Processus de démarrage
• L’exécution du conteneur montre que le pro-
cessus principal est ps:
sudo docker run -it --name percussion doclab/percussion
• Par contre l’utilisation de la forme dite shell
de l’opérateur CMD donne le Dockerfile suivant:
FROM ubuntu:latest
MAINTAINER Openepo "
[email protected]"
COPY percussion.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENV RYTHMEPERCUSSION 2
CMD ps -aux
• Le résultat d’exécution montre qu’un shell
a été effectivement lancé pour porter la com-
mande.
124
Construction d’une Image
Processus de démarrage
• ENTRYPOINT et CMD supportent les deux formes
exec et shell. Dans sa forme shell – un sim-
ple texte passé comme paramètre au lieu d’un
tableau au format JSON, c’est /bin/sh -c qui
sera utilisé pour lancer les paramètre de ENTRYPOINT.
• La forme shell a l’avantage que les variables
comme $HOME ou autres seront substituées, mais
l’inconvénient est que les signaux ne seront pas
correctement remontés, car la valeur passée
dans ENTRYPOINT est alors une sous-commande
du processus de PID 1, qui est le /bin/sh.
125
Construction d’une Image
Processus de démarrage
• Afin d’accepter par exemple le signal SIGTERM
envoyé par les touches Ctrl-C en mode interac-
tif, une nouvelle version du script percussion.sh
#!/bin/bash
set -e
trap "echo SIGNAL" HUP INT QUIT KILL TERM
while true;
do
echo $1 \($(date +%H:%M:%S)\);
sleep "$RYTHMEPERCUSSION";
done
• Il est de bon usage que les conteneurs réagissent
de manière propre à un SIGTERM, en annulant la
tâche en cours et en nettoyant ce qui a besoin
de l’être avant de s’arrêter.
126
Construction d’une Image
Commandes diverses
• WORKDIR est utilisé pour fixer le répertoire
courant dans le déroulement du fichier Dockerfile.
Cette commande peut être utilisée plusieurs
fois dans le Dockerfile. Le répertoire de travail
évolue alors au fur et à mesure de la compila-
tion.
• LABEL permet de fournir des couples clé/valeur
qui serviront de métadonnées décrivant l’image
lorsque celle-ci sera diffusée et utilisée. Une
utilisation classique est de faire porter la ver-
sion de l’image
LABEL version="2.0"
• La commande docker inspect qui permet de
retrouver les métadonnées sur une image en
paramètre.
127
Construction d’une Image
Export et import sous forme de fichiers
• Un moyen manuel d’exporter une image sous
forme d’un fichier archive:
sudo docker save -o /tmp/percussion.tar doclab/percussion
• Le moyen d’importer une archive d’image
sudo docker load -i image archive
128
Principe & Architecture
Union file systems
• Union file systems ou UnionFS, sont des sytèmes
de fichiers qui fonctionnent en créant des couches,
ce qui les rend légers et rapides.
• Docker Engine utilise UnionFS pour fournir les
blocs de construction des conteneurs. Docker
Engine peut utiliser plusieurs vairantes de UnionFS,
notamment AUFS, btrfs, vfs et DeviceMapper.
129
Principe & Architecture
Le format de conteneur
• Docker Engine combine les espaces de nom-
mage, les contrôles groupes, et UnionFS dans
une enveloppe (wrapper) nommé format de
conteneur.
• Le format de conteneur par défaut est
libcontainer. À l’avenir, Docker pourrait pren-
dre en charge d’autres formats de conteneur
en s’intégrant à des technologies telles que BSD
Jails ou Solaris Zones.
130
Principe & Architecture
Présentation de Docker
• La technologie de conteneurs et la conteneuri-
sation de données par Docker libère le poten-
tiel de développement (Dev) et d’exploitation
(Ops).
• Docker fournit pour les applications une lib-
erté de choix, des opérations agiles et une sécurité
intégrée de conteneur.
131
Principe & Architecture
Gestion de données dans Docker
• Par défaut tous les fichiers créés dans un
conteneur sont stockés sur une couche de con-
teneur en écriture. Ce qui implique :
- Les données ne sont pas persistentes à l’arrêt
de l’exécution du conteneur et il peut être dif-
ficile d’extraire les données du conteneur si un
autre processus en a besoin.
- Une couche de conteneur en écriture dépend
de la machine hôte sur laquelle le conteneur est
exécuté. On ne peut pas facilement déplacer
les données ailleurs.
132
Principe & Architecture
Gestion de données dans Docker
- L’écriture dans une couche en écriture d’un
conteneur nécessite un pilote de stockage afin
de gérer le système de fichiers. Le pilote de
stockage fournit un système de fichiers union,
utilisant le noyau Linux.
• Cette abstraction supplémentaire réduit les
performances par rapport à l’utilisation de données
de volumes, qui écrivent directement dans le
système de fichier de l’hôte.
133
Principe & Architecture
Gestion de données dans Docker
• Docker a deux options pour les conteneurs
pour stocker les fichiers dans la machine hôte,
pour que les fichiers soient persistents même
après l’arrêt du conteneur :
- volumes ;
- montages liés (bind mounts) ;
- montage tmpfs uniquement sur Linux.
134
Principe & Architecture
Fig 3 : Stockage de données dans Docker
135
Principe & Architecture
Choix de montage
• Quel que soit le type de montage utilisé, les
données sont organisées sous forme d’une ar-
borescence logique de répertoires et de fichiers
dans le système de fichier du conteneur.
• Pour comprendre la différence entre les différents
types de montage, volumes, bind mounts et
tmpfs, il suffit de déterminer l’emplacement de
données sur l’hôte Docker.
136
Principe & Architecture
Choix de montage
• Les volumes sont stockés dans une partie de
système de fichiers de l’hôte, géré par Docker
(/var/lib/docker/volumes/ sur Linux). Les pro-
cessus n’appartenant pas à Docker ne doivent
pas modifier cette partie du système de fichiers.
Les volumes constituent le meilleur moyen de
conserver des données dans Docker.
• Bind mounts peuvent être stockés n’importe
où sur le système de fichiers hôte. Il peut
même s’agir d’un fichier ou répertoire. Les
processus n’appartenant pas à Docker peuvent
modifier à tout moment les données.
• Les montages tmpfs sont uniquement stockés
dans la mémoire du système hôte et ne sont
jamais écrits dans le système de fichiers hôte.
137
Principe & Architecture
• Les systèmes de fichiers superposés
• Présentation de AUFS
• Apports de Docker : Docker Engine pour créer
et gérer des conteneurs Dockers
• Plates-formes supportées
• L’écosystème Docker : Docker Machine, Docker
Compose, Kitematic, Docker Swarm, Docker Registry
138
Principe & Architecture
Le stockage de données
• Les pilotes de stockage vous permettent de
créer des données dans la couche accessible en
écriture de votre conteneur. Les fichiers ne
seront pas conservés après la suppression du
conteneur et les vitesses de lecture et d’écriture
sont faibles.
• Les systèmes de fichiers superposés
• Présentation de AUFS
• Apports de Docker : Docker Engine pour créer
et gérer des conteneurs Dockers
• Plates-formes supportées
• L’écosystème Docker : Docker Machine, Docker
Compose, Kitematic, Docker Swarm, Docker Registry
139
Installation d’un Registre Privé
Image Docker en local
• Pour créer notre propre serveur de registre,
nous utilisons l’image officielle nommée registry.
https://hub.docker.com/ /registry/
• Démarrer un registre privé:
sudo docker run -d --name registre -p88:5000 registry:2.0
• L’URL suivant donne accès à l’API en version
2 du registre, et en l’absence de tout paramètre
ou portion d’URL supplémentaire, L’API en ques-
tion renvoie une liste vide, mais le fait que nous
voyons les séparateurs de liste JSON – les acco-
lades – prouve que le serveur répond correcte-
ment.
140
Installation d’un Registre Privé
Image Docker en local
• Pointer sur un registre donné Pour démontrer
l’usage du registre privé, nous allons déposer
une image sur ce registre.
• La commande push permet d’envoyer une im-
age locale sur le registre Docker Hub
sudo docker push image
• Logiquement on doit se connecter sur le nou-
veau registre et lancer une commande push
d’une image au nom existant. Mais Docker
fonctionne autrement. Lorsqu’on nomme une
image, son nom complet cache le serveur reg-
istre par défaut.
141
Installation d’un Registre Privé
Image Docker en local
• Le serveur registre par défaut est le reg-
istre public Docker Hub. Les images que nous
avons présentées en fonction de leurs contenus
nécessaires à démarrer un conteneur, sont une
association de ces contenus à un dépôt sur un
registre.
• Pour envoyer une image sur le registre privé
nouvellement créé, il va falloir commencer par
lui affecter un nouveau nom complet, grâce à
la commande docker tag, puis seulement réaliser
l’opération push sur ce nouveau nom.
sudo docker tag doclab/percussion localhost:88/percussion
sudo docker push localhost:88/percussion
142
Installation d’un Registre Privé
Image Docker en local
• Les identifiants des images sont similaires
pour les deux dénominations ; Docker garde
bien le contenu en commun, tant qu’il l’est.
sudo docker images
• En revenant au navigateur avec l’URL suivie
du nom de l’image et /tags/list, nous aurons
l’image qui a été déposée avec ses tags, ce
confirme son fonctionnment correct.
http://localhost:88/v2/percussion/tags/list
{"name":"percussion","tags":["latest"]}
• L’image étant désormais stockée sur un reg-
istre, nous pourrons en principe la récupérer
depuis n’importe quelle machine du réseau, sauf
que dans l’exemple il s’agit de localhost.
143
Installation d’un Registre Privé
Registre sur le réseau local
• Afin de partager le contenu d’un registre, son
emplacement doit être sur un serveur accessi-
ble à toutes personnes auxquelles l’administrateur
souhaite mettre à disposition ses images.
• Ce serveur pourra être un serveur central
dans un réseau d’entreprise, un serveur sécurisé
sur un cloud, ou n’importe quelle autre ma-
chine accessible au groupe de personnes ciblées
comme clientes.
• Scénario et préparation des machines La
machine virtuelle Linux qui a servi pour les ex-
emples jusqu’à maintenant va se comporter
comme fournisseur d’une image qui sera déposée
sur le registre privé démarré sur une seconde
machine virtuelle utilisant CentOS.
144
Installation d’un Registre Privé
Registre sur le réseau local
• Enfin, en tant que client Docker, la machine
physique hôte des machines virtuelles sera utilisée
pour vérifier que l’image est effectivement
disponible. Les trois machines font partie du
même réseau.
• Il existe un lien entre le nom du registre
privé et le nom de la machine qui supporte
son processus. Ainsi, la première étape sera
de déclarer le nom doclabregistre sur les trois
machines afin d’accéder à cette machine reg-
istre.
• La solution passe par le configuration d’un
service de résolution de nom – un serveur DNS.
Sinon, dans un cadre de création d’une con-
figuration de tests, on peut se contenter d’une
déclaration dans les fichiers hosts des différentes
machines – ping pour validation.
145
Installation d’un Registre Privé
Démarrage du registre
• La seconde étape consiste à démarrer le reg-
istre privé sur la machine CentOS. Il s’agit de la
même procédure que l’approche tout en local
montrée précédemment, sauf pour le port qui
sera 5000
ping doclabregistre
sudo docker run -d --name registre -p 5000:5000 registry:2.0
...
sudo docker ps
• Dépôt de l’image depuis une autre ma-
chine Depuis la première machine virtuelle, on
peut lancer une vérification d’accès au registre
par l’URL comme précédemment. Il est aussi
possible de le vérifier par ligne de commande
curl http://doclabregistre:5000/v2/
{}
146
Installation d’un Registre Privé
Démarrage du registre
• Une fois vérifié, la suite est identique que
précédemment, à savoir utiliser la commande
tag pour donner un nouveau nom à l’image. La
vérification peut se faire en listant les images.
• Ensuite, la commande push pour envoyer cette
image dans le registre.
• Enfin, pour valider que la commande d’envoie
a bien atteint sa destination:
http://doclabregistre:5000/v2/percussion/tags/list
147
Installation d’un Registre Privé
Utilisation de l’image depuis une
troisième machine
• Il s’agit de récupérer l’image depuis la ma-
chine hôte. Dans le cas où il s’agit de machines
Windows ou Mac OS X, il serait possible d’installer
Boot2Docker
http://boot2docker.io/
• Dans le cas d’une machine Windows ou Mac
OS, il faut rajouter dans la configuration de
Docker dans le /etc/default/docker, la variable
DOCKER OPTS
--insecure-registry=doclabregistre:5000
• Il s’agit ensuite de relancer le serveur Docker
sudo service docker restart
148
Installation d’un Registre Privé
Suppression de l’image sur la ma-
chine source
• Une fois que l’image a été intégrée – poussée
– dans le registre, elle peut être supprimée du
cache local.
sudo docker images
sudo docker rmi ID IMAGE
sudo docker rmi -f ID IMAGE
sudo docker images
sudo docker rmi -f ID IMAGE
sudo docker images
• La liste des images fait apparaı̂tre les deux
tags pour le même identifiant d’image : il s’agit
de la même Docker à laquelle il a été associé
un nom pour la pousser dans le registre privé.
149
Installation d’un Registre Privé
Suppression de l’image sur la ma-
chine source
• En utilisant la commande rmi avec l’identifiant
et non le nom, implique la suppression de tous
les tags, mais un message explique que comme
le tag est associé à des dépôts multiples, il faut
utiliser l’option -f.
• Le premier appel avec cette option -f sup-
prime le premier tag.
• Le second supprime le second tag, ainsi que
toutes les images intermédiaires nécessaires,
puisque plus aucun tag n’y fait référence.
150
Installation d’un Registre Privé
Gestion de la persistance
• Gestion locale par volume Le stockage
des images se fait dans le conteneur Docker
lui même. Dès lors, que se passe t-il si le con-
teneur est arrêté et qu’on oublie de valider son
état dans une nouvelle image ? Cette situation
implique la perte du contenu du registre.
• L’approche la plus simple pour éviter la perte
du contenu du registre consiste à utiliser les
volumes pour rediriger l’endroit où le conteneur
du registre stocke les images qui lui sont en-
voyées vers un emplacement plus pérenne.
151
Installation d’un Registre Privé
Gestion de la persistance
• Une solution possible serait de choisir un
répertoire de la machine hôte qui sera régulièrement
sauvegardé, voir synchronisé en contenu sur
une machine distante. Dans un contexte pro-
fessionnel, la cible pourrait être une baie SAN,
un partage NFS par exemple.
• Le comportement par défaut du registre fourni
par Docker est de stocker sur /var/lib/registry.
Il s’agit donc de substituer ce répertoire par un
autre.
152
Installation d’un Registre Privé
Gestion de la persistance
• Il s’agit de procéder par la création d’une
nouvelle instance de registre comme précédemment
mais en précisant la gestion de volume avec
l’option -v, de façon que le stockage du reg-
istre soit réalisé sur répertoire choisi.
• Ensuite, il s’agit d’envoyer par la commande
push du contenu dans le registre.
docker run -d --name registre-volume -p5000:5000 \
-v /home/doclabregistre/contenu:/var/lib/registry \
registry
docker tag doclab/percussion doclabregistre:5000/percussion
docker push doclabregistre:5000/percussion
153
Installation d’un Registre Privé
Gestion de la persistance
• Une fois la configuration finalisée, il est pos-
sible de vérifier le résultat à travers le contenu
du répertoire volume choisi pour le stockage
du registre.
cd /home/doclabregistre/contenu
tree -d
• L’arborescence fait apparaı̂tre le nom de l’image
sur laquelle nous avons réalisé l’opération de
push, en l’occurrence percussion, dans le répertoire
repositories.
154
Installation d’un Registre Privé
Gestion de la persistance
• SELinux pour Security Enhanced Linux, est
un module de sécurité intégré à Linux, et qui
permet de définir des politiques de droits d’accès
aux différentes ressources du système.
• En fonction de votre configuration, SELinux
peut bloquer l’écriture par le processus du reg-
istre sur le répertoire fourni par le mécanisme
des volumes, en dehors de tout problème de
droits d’écriture sur le répertoire lui-même.
• Il est possible que la machine hébergeant
le conteneur registre vous envoie un avertisse-
ment SELinux lorsqu’on exécute la commande
push depuis une machine distante.
• Pour une approche de test, on peut se con-
tenter de passer SELinux en mode permissif ou
de le désactiver temporairement.
155
Administration
Présentation de Compose
• Utiliser Compose est fondamentalement un pro-
cessus en trois étapes :
-Définissez l’environnement de votre applica-
tion avec un fichier Dockerfile afin qu’elle puisse
être reproduite n’importe où ;
-Définissez les services qui composent votre
application dans docker-compose.yml afin qu’ils
puissent être exécutés ensemble dans un envi-
ronnement isolé ;
-Exécutez docker-compose up et Compose démarre
et exécute l’intégralité de votre application.
156
Administration
Les caractéristiques de Compose
Plusieurs environnements isolés sur un seul
hôte
• Compose utilise un nom de projet pour isoler
les environnements les uns des autres. Vous
pouvez utiliser ce nom de projet dans plusieurs
contextes différents :
-Sur un hôte dev, pour créer plusieurs copies
d’un même environnement, par exemple, lorsque
vous souhaitez exécuter une copie stable pour
chaque branche de fonctionnalité d’un projet ;
-Sur un serveur CI, pour éviter toute interférence
des versions, vous pouvez définir le nom du
projet sur un numéro de version unique ;
157
Administration
Plusieurs environnements isolés sur un seul
hôte
-Sur un hôte partagé ou un hôte dev, pour
éviter que différents projets, pouvant utiliser
les mêmes noms de service, n’interfèrent entre
eux.
• Le nom de projet par défaut est le nom de
base du répertoire du projet. Vous pouvez
définir un nom de projet personnalisé à l’aide
de l’option de ligne de commande -p ou de la
variable d’environnement COMPOSE PROJECT NAME.
158
Administration
Préserver les données de volume
• Préserver les données de volume lors de la
création de conteneurs. Compose préserve tous
les volumes utilisés par vos services.
• Lorsque docker-compose up s’exécute, s’il trouve
des conteneurs d’anciennes exécutions, il copie
les volumes de l’ancien conteneur dans le nou-
veau conteneur.
• Ce processus garantit que toutes les données
que vous avez créées dans des volumes ne sont
pas perdues.
159
Administration
Recréer uniquement les conteneurs qui ont
changé
• Compose met en cache la configuration utilisée
pour créer un conteneur. Lorsque vous redémarrez
un service qui n’a pas changé, Compose réutilise
les conteneurs existants.
• La réutilisation des conteneurs signifie que
vous pouvez modifier rapidement votre envi-
ronnement.
160
Administration
Variables et déplacement d’une composi-
tion entre environnements
• Compose prend en charge les variables dans
le fichier Compose. Vous pouvez utiliser ces
variables pour personnaliser votre composition
pour différents environnements ou différents
utilisateurs.
• Vous pouvez étendre un fichier Compose à
l’aide du champ extend ou en créant plusieurs
fichiers Compose.
161
Administration
Cas d’utilisation
• Compose peut être utilisé de différentes manières.
Certains cas d’utilisation courants tels que :
-Environnements de développement : Lorsque
vous développez un logiciel, il est essentiel de
pouvoir exécuter une application dans un envi-
ronnement isolé et d’interagir avec elle. Compose
peut être utilisé pour créer l’environnement et
interagir avec celui-ci.
Le fichier Compose permet de documenter et de
configurer toutes les dépendances de service de
l’application (bases de données, files d’attente,
caches, API de service Web par exemple). Avec
Compose, vous pouvez créer et démarrer un ou
plusieurs conteneurs pour chaque dépendance
à l’aide d’une seule commande :
docker-compose up
162
Administration
Cas d’utilisation
Ensemble, ces fonctionnalités constituent un
moyen pratique pour les développeurs de se
lancer dans un projet.
Compose peut réduire un guide de démarrage
pour les développeurs comprenant plusieurs pages
à un seul fichier Compose lisible par machine et
à quelques commandes.
163
Administration
Cas d’utilisation
-Environnements de test automatisés : La
suite de tests automatisés est un élément im-
portant de tout processus de déploiement con-
tinu ou d’intégration continue.
Les tests automatisés de bout en bout nécessitent
un environnement dans lequel exécuter les tests.
Compose constitue un moyen pratique de créer
et de détruire des environnements de test isolés
pour votre suite de tests.
En définissant l’environnement complet dans
un fichier Compose, vous pouvez créer et détruire
ces environnements en quelques commandes
seulement :
docker-compose up -d
./run tests
docker-compose down
164
Administration
Cas d’utilisation
-Déploiements à hôte unique : Tradition-
nellement, Compose était axé sur les étapes de
développement et de test, mais avec chaque
version, nous progressons vers des fonction-
nalités plus orientées production.
Vous pouvez utiliser Compose pour déployer sur
un Docker Engine distant. Le Docker Engine peut
être une instance unique provisionnée avec Docker
Machine ou un cluster entier de Docker Swarm.
165
Administration
Docker Compose : installation
• Vous pouvez exécuter Compose sous des ma-
chines Linux/Windows/MacOs 64 bits.
• Docker Compose s’appuie sur Docker Engine.
Assurez-vous donc que Docker Engine est bien
installé.
https://docs.docker.com/compose/install/#install-compose
Vérification de l’installation
docker-compose --version
166
Administration
Docker Compose : Étude de cas
• Il s’agit de créer une application Web Python
s’exécutant sur Docker Compose. L’application
utilise le framework Flask et gère un compteur
d’accès dans Redis.
Configuration
Définir les dépendances de l’application.
• Créez un répertoire pour le projet :
mkdir composetest
cd composetest
• Créez un fichier nommé app.py dans votre
répertoire de projet.
167
Administration
Docker Compose : le fichier app.py
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host=’redis’, port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr(’hits’)
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route(’/’)
def hello():
count = get_hit_count()
return
’Hello World! I have been seen {} times.\n’.format(count)
if __name__ == ‘‘__main__’’:
app.run(host=’’0.0.0.0’’, debug=True)
168
Administration
Docker Compose : le fichier app.py
• Dans cet exemple, redis est le nom d’hôte du
conteneur redis sur le réseau de l’application.
Nous utilisons le port par défaut pour Redis,
6379.
Docker Compose : le fichier requirement.txt
• Créez un autre fichier appelé requirement.txt
dans votre répertoire de projet contenant :
flask
redis
169
Administration
Docker Compose : le fichier Dockerfile
Création de Dockerfile
• Dans cette étape, vous créez un fichier Dockerfile
qui crée une image Docker. L’image contient
toutes les dépendances requises par l’application
Python, y compris Python :
FROM python:3.4-alpine
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
170
Administration
Docker Compose : le fichier Dockerfile
• Le fichier indique à Docker de :
-Construire une image en commençant par l’image
Python 3.4. ;
-Ajouter le répertoire courant (.) dans le chemin
/code de l’image ;
-Définir le répertoire de travail sur /code ;
-Installer les dépendances Python ;
-Définir la commande par défaut du conteneur
sur python app.py.
171
Administration
Définir les services dans un fichier de com-
position
• Créer un fichier nommé docker-compose.yml
dans votre répertoire de projet contenant :
version: ’3’
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
172
Administration
Le fichier docker-compose.yml
• Ce fichier Compose définit deux services, Web
et Redis. Le service web :
-Utilise une image construite à partir du fichier
Docker dans le répertoire en cours ;
-Transférer le port exposé 5000 du conteneur
au port 5000 de la machine hôte. Nous utilisons
le port par défaut pour le serveur Web Flask,
5000.
• Le service redis utilise une image publique
Redis extraite du registre de Docker Hub.
173
Administration
Construire et exécuter l’application avec
Compose
• À partir du répertoire de votre projet, démarrez
l’application en exécutant :
docker-compos up
Compose extrait une image Redis, construit une
image pour votre code et lance les services que
vous avez définis. Dans ce cas, le code est
copié de manière statique dans l’image au mo-
ment de la création.
174
Administration
Construire et exécuter l’application avec
Compose
• Utiliser un client HTTP pour tester l’application,
par exemple :
curl http://0.0.0.0:5000/
L’application Web doit être à l’écoute sur le port
5000 de l’hôte démon Docker. On peut aussi
utiliser l’adresse suivante :
curl http://localhost:5000/
175
Administration
Construire et exécuter l’application avec
Compose
• Actualiser la page. Le résultat devrait changer
par incrémentation d’un entier.
• Utiliser un autre terminal et exécuter la com-
mande suivante pour répertorier les images lo-
cales :
docker image ls
La liste des images à ce stade devrait renvoyer
redis et web.
• Vous pouvez inspecter les images avec :
docker inspect ID
176
Administration
Construire et exécuter l’application avec
Compose
• (4.5) Arrêter l’application, soit en exécutant
depuis votre répertoire de projet d’un autre ter-
minal :
docker-compose down
soit en appuyant sur CTRL + C dans le terminal
où vous avez démarré l’application.
177
Administration
Ajouter un volume bind mount
• Le nouveau fichier docker-compose.yml avec
un volume pour le service web :
version: ’3’
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
redis:
image: "redis:alpine"
• volumes monte le répertoire du projet (répertoire
courant) de l’hôte sur /code à l’intérieur du
conteneur, vous permettant de modifier le code
à la volée, sans avoir à reconstruire l’image.
178
Administration
Reconstruire et exécuter l’application
• Pour créer l’application avec le fichier Compose
mis à jour, exécuter dans le répertoire projet :
docker-compose up
Mettre à jour l’application
• Comme le code de l’application est main-
tenant monté dans le conteneur à l’aide d’un
volume, vous pouvez modifier son code et voir
les modifications instantanément, sans avoir
à reconstruire l’image. On peut par exemple
modifier le message affiché à partir du fichier
app.py.
179
Administration
Des commandes annexes
• Pour exécuter vos services en arrière-plan,
vous pouvez passer l’option -d (pour le mode
détaché) pour composer de manière fixe et
utiliser d’autres commandes par exemple ce qui
est en cours d’exécution :
docker-compose up -d
docker-compose ps
docker-compose run web env
docker-compose stop
docker-compose down
180
Compose et WordPress
• Vous pouvez utiliser Docker Compose pour exécuter
WordPress dans un environnement isolé con-
struit avec des conteneurs Docker.
Définir le projet
• Créer un nouveau répertoire de projet, par
exemple wpress. Ce répertoire est le contexte
de votre image d’application. Le répertoire ne
doit contenir que des ressources pour constru-
ire cette image.
• Ce répertoire de projet contient un fichier
docker-compose.yml qui est complet pour un
projet de démarrage wordpress.
• Dans le répertoire wp, créer un fichier
docker-compose.yml qui lance votre WordPress et
une instance MySQL distincte avec un montage
en volume pour la persistance des données.
181
Compose et WordPress
Le fichier docker-compose.yml
version: ’3.3’
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
volumes:
db_data: {}
182
Compose et WordPress
• Le volume fixe db data conserve toutes les
mises à jour apportées par WordPress à la base
de données.
Construire le projet
• Exécution à partir du répertoire de votre pro-
jet de :
docker-compos up -d
• Ceci exécute docker-compose en mode détaché,
extrait les images Docker nécessaires et démarre
les conteneurs wordpress et de base de données,
comme indiqué lors de l’exécution.
183
Compose et WordPress
Afficher WordPress
• À ce stade, WordPress devrait être exécuté sur
le port 8000 de votre hôte Docker et vous pour-
rez effectuer l’installation en tant qu’administrateur
WordPress.
Arrêt
• La commande qui supprime les conteneurs et
le réseau par défaut, mais préserve votre base
de données WordPress :
docker-compose down
• La commande qui supprime les conteneurs,
le réseau par défaut et la base de données
WordPress :
docker-compose down --volumes
184
Administration
Orchestration avec Docker Machine
• Docker Machine est un outil qui vous permet
d’installer Docker Engine sur des hôtes virtuels
et de gérer les hôtes à l’aide de commandes
docker-machine.
• Vous pouvez utiliser Docker Machine pour créer
des hôtes Docker sur votre système Mac ou Windows
local, sur le réseau, dans votre centre de données
ou chez des fournisseurs de cloud, tels que
Azure, AWS ou Digital Ocean.
• À l’aide des commandes de Docker-Machine,
vous pouvez démarrer, inspecter, arrêter et
redémarrer un hôte géré, mettre à jour le client
et le démon Docker et configurer un client Docker
pour qu’il puisse communiquer avec votre hôte.
185
Administration
Utilisation de Docker Machine
• Docker Machine vous permet de provisionner
plusieurs hôtes Docker distants sous différentes
versions de Linux.
• Docker Engine s’exécute de manière native sur
les systèmes Linux. Si vous utilisez un système
Linux comme système principal et souhaitez
exécuter des commandes Docker, il vous suf-
fit de télécharger et d’installer Docker Engine.
• Toutefois, si vous souhaitez un moyen effi-
cace de provisionner plusieurs hôtes Docker sur
un réseau, dans le cloud ou même localement,
vous avez besoin de Docker Machine.
186
Administration
Utilisation de Docker Machine
• Que votre système principal soit Mac, Windows
ou Linux, vous pouvez y installer Docker Machine
et utiliser les commandes docker-machine pour
provisionner et gérer un grand nombre d’hôtes
Docker.
Fig 4 : Utilisation de Docker-Machine
• Il crée automatiquement des hôtes, y installe
Docker Engine, puis configure les clients docker.
Chaque hôte géré (machine) est la combinai-
son d’un hôte Docker et d’un client configuré.
187
Administration
Docker Machine & Docker Engine
• Docker désigne généralement Docker Engine,
l’application client-serveur constituée du démon
Docker, d’une API REST qui spécifie les inter-
faces permettant d’interagir avec le démon et
d’un client d’interface de ligne de commande
qui communique avec le démon.
Fig 5 : Docker-Machine & Docker-Engine
• Docker Machine est un outil de provisioning et
de gestion de vos hôtes dockerisés (hôtes sur
lesquels Docker Engine est installé).
188
Administration
Présentation de Swarm pour le clustering
• Les versions actuelles de Docker incluent la
gestion native d’un cluster de Docker Engine
nommé swarm. Utiliser la ligne de commande
Docker pour créer un swarm, déployer des ser-
vices d’application sur un swarm et gérer son
comportement.
• Les principales fonctionnalités de Docker swarm
sont :
-Gestion de cluster intégrée à Docker Engine.
Utilisez la CLI Docker Engine pour créer un swarm
de Docker Engine dans lesquels vous pouvez déployer
des services d’application. Pas besoin d’application
d’orchestration supplémentaire pour créer ou
gérer un swarm ;
189
Administration
Docker Swarm
-Découverte de services. Les nœuds Swarm manager
attribuent à chaque service de cluster un nom
DNS unique et équilibrent la charge des con-
teneurs en cours d’exécution. Vous pouvez in-
terroger tous les conteneurs exécutés dans le
cluster via un serveur DNS intégré au cluster ;
-Equilibrage de la charge. Vous pouvez ex-
poser les ports des services à un équilibreur
de charge externe. En interne, le cluster vous
permet de spécifier le mode de répartition des
conteneurs de service entre les nœuds ;
190
Administration
Docker Swarm
-Sécurisé par défaut. Chaque nœud de swarm
applique l’authentification et le cryptage mutuels
TLS pour sécuriser les communications entre
lui et tous les autres nœuds. Vous avez la
possibilité d’utiliser des certificats racine auto-
signés ou des certificats provenant d’une au-
torité de certification racine personnalisée.
-Mises à jour progressives. Au moment du
déploiement, vous pouvez appliquer des mises
à jour de service aux nœuds de manière incré-
-mentielle. Le gestionnaire swarm vous per-
met de contrôler le délai entre le déploiement
du service sur différents ensembles de nœuds.
En cas de problème, vous pouvez rétablir une
tâche dans une version précédente du service.
191
Docker Swarm
Configurer les hôtes Docker
• Avant d’installer les packages Docker nécessaires
pour le cluster swarm, nous allons configurer
le fichier hosts sur tous les nœuds Linux.
Noeud de gestionnaire 192.168.1.103 (nom d’h^
ote dockerm)
Noeud collaborateur1 192.168.1.107 (nom d’h^
ote dockerc1)
Noeud collaborateur2 192.168.1.108 (nom d’h^
ote dockerc2)
• Éditer le fichier /etc/hosts pour déclarer les
trois noeuds comme suit :
192.168.1.103 dockerm
192.168.1.107 dockerc1
192.168.1.108 dockerc2
• Après avoir modifié les informations ci-dessus
dans le fichier hosts, vérifier la connectivité
avec ping entre tous les noeuds.
192
Docker Swarm
Installer et exécuter le service Docker
• Pour créer le cluster swarm, nous devons in-
staller docker sur tous les noeuds de serveur.
Nous installerons la plate-forme docker-ce —
Docker Community Edition sur les trois ma-
chines Linux.
Configurer le noeud du gestionnaire pour
l’initialisation du cluster Swarm
• Dans cette étape, nous allons créer le groupe
d’essaims de nos noeuds (docker swarm). Pour
créer le cluster swarm, nous devons initialiser le
mode swarm sur le noeud dockerm, puis associer
les noeuds dockerc1 et dockerc2 au cluster.
• Initialiser le mode Docker Swarm en exécutant
la commande suivante de Docker sur le noeud
dockerm.
docker swarm init --advertise-addr 192.168.1.103
193
Docker Swarm
Installer et exécuter le service Docker
• Le gestionnaire dockerm a généré un join
token par le dockerm qui devra joindre les noeuds
collaborateurs ou de travail au gestionnaire de
grappes — gestionnaire cluster.
Configurer les noeuds collaborateurs pour
rejoindre le cluster Swarm
• Pour joindre les noeuds collaborateurs ou de
travail à l’essaim — swarm, il faut exécuter
la commande docker swarm join sur tous les
noeuds collaborateurs de travail que nous avons
reçus à l’étape d’initialisation de l’essaim :
docker swarm join --token xyz 192.168.1.103:2377
194
Docker Swarm
Vérifier le cluster Swarm
• Pour voir le statut du noeud, afin que nous
puissions déterminer si les noeuds sont actifs
et/ou disponibles, à partir du noeud du ges-
tionnaire, répertorier tous les noeuds de l’essaim :
docker node ls
• Si vous avez perdu votre jeton de jointure
— join token, vous pouvez le récupérer en
exécutant la commande suivante sur le noeud
de gestionnaire :
docker swarm join-token manager -q
• Pour récupérer le jeton de collaborateur de
la même manière, exécuter la commande suiv-
ante sur le noeud du gestionnaire :
docker swarm join-token worker -q
195
Docker Swarm
Déployer un nouveau service sur le cluster
Swarm
• Dans cette étape, nous allons créer et déployer
notre premier service sur le cluster swarm. Le
nouveau service Web avec nginx s’exécutera
sur le port HTTP 80 par défaut, puis sur le port
8081 de la machine hôte.
• Nous allons créer ce service nginx avec 2
réplicas, ce qui signifie qu’il y aura 2 conteneurs
de nginx en cours d’exécution dans notre es-
saim — swarm.
• Si l’un de ces conteneurs échoue, il sera à
nouveau généré pour avoir le nombre souhaité
défini dans l’option de réplica.
docker service create --name web\
--publish 8081:80 --replicas 2 nginx
196
Docker Swarm
• Pour vérifier le service nginx créé récemment
à l’aide des commandes de service de docker
comme suit :
docker service ls
docker service ps web
• Pour vérifier si le service nginx fonctionne
correctement, nous pouvons utiliser la com-
mande curl ou vérifier à partir d’un navigateur
de la machine hôte la page d’accueil du serveur
Web nginx.
curl http://dockerm:8081
197
Docker Swarm
• Si nous devons redimensionner le service nginx,
nous allons créer 3 réplicas. Pour ce faire,
exécuter la commande suivante sur le noeud
du gestionnaire :
docker service scale web=3
• Pour vérifier le résultat après la mise à l’échelle,
nous pouvons utiliser les commandes suivantes :
docker service ls
docker service ps
• Pour vérifier les détails étendus d’un service
déployé sur l’essaim, on utilise la commande
suivante :
docker service inspect
• Par défaut, tous les résultats sont affichés
dans un tableau JSON.
198
Administration
Configuration réseau et sécurité dans Docker
Docker inspect
• La commande docker inspect permet de fournir
des informations détaillées de bas niveau sur les
objets Docker et les constructions contrôlées
par Docker. Par défaut, la commande retourne
les résultats dans un tableau JSON.
Obtenir l’adresse IP d’une instance
• Dans la plupart des cas, vous pouvez sélectionner
n’importe quel champ du JSON comme suit :
docker inspect --format=’\
{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}’ ID
199
Administration
Obtenir l’adresse MAC d’une instance
docker inspect --format=’\
{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}’ ID
Obtenir le chemin de journal d’une instance
docker inspect --format=’{{.LogPath}}’ ID
Obtenir le nom de l’image d’une instance
docker inspect --format=’{{.Config.Image}}’ ID
Lister toutes les liaisons de ports
• Vous pouvez parcourir les tableaux et les
cartes dans les résultats pour produire une sor-
tie texte simple :
docker inspect --format=’{{range $p,\
$conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}}\
{{end}}’ ID
200
Administration
Trouver un mappage de port spécifique
• La syntaxe .Field ne fonctionne pas lorsque
le nom du champ commence par un nombre,
contrairement à la fonction d’index du langage
de template.
• La section .NetworkSettings.Ports contient
une carte des mappages de ports internes sur
une liste d’objets d’adresse/de port externes.
Pour saisir uniquement le port public numérique,
vous utilisez index pour rechercher la carte de
port spécifique, puis l’index 0 contient le pre-
mier objet à l’intérieur de celui-ci.
• Ensuite, nous demandons au champ HostPort
d’obtenir l’adresse publique.
docker inspect --format=’\
{{(index (index .NetworkSettings.Ports "8787/tcp") 0).HostPort}}’ ID
201
Administration
Obtenir une sous-section au format JSON
• Si vous demandez un champ qui est lui-même
une structure contenant d’autres champs, vous
obtenez par défaut un dump de type Go des
valeurs internes.
• Docker ajoute une fonction de modèle, json,
qui peut être appliquée pour obtenir des résultats
au format JSON.
docker inspect --format=’json .Config’ ID
202