Mon cours de virtualisation des conteneurs explore les bases et les technologies avancées de la virtualisation, en mettant l'accent sur l'utilisation de conteneurs pour l'efficacité et la portabilité des applications. Les participants acquièrent des compétences essentielles pour déployer, gérer et optimiser des environnements conteneurisés.
3. Vous avez déjà été confronté
à des problèmes de
compatibilité avec votre code
?
Docker va vous permettre de
résoudre cette situation !
Dans ce cours, nous allons
apprendre ensemble à utiliser
les conteneurs Docker pour
déployer facilement une
application.
4. Ce cours est décomposée en 3 parties, dont voici les éléments que vous
retrouverez :
• Dans la première partie du cours, nous allons commencer par découvrir ce qu'est un conteneur,
ce qu'est Docker et comment l'installer sur votre poste de développeur.
• Dans la deuxième partie, vous allez lancer votre premier conteneur sur votre machine en
utilisant des images Docker stockées sur le Docker Hub. Puis, vous apprendrez à écrire votre
premier Dockerfile, afin de créer votre propre imageDocker personnalisée.
• Enfin, dans la troisième partie, vous utiliserez Docker Compose pour orchestrer vos conteneurs.
Grâce au fichier docker-compose.yaml , vous ferez fonctionner plusieurs conteneurs ensemble.
5. Historiquement, quand nous avions besoin de serveurs,
nous achetions des serveurs physiques avec une
quantité définie de CPU, de mémoire RAM ou de
stockage sur le disque.
6. Le CPU est l’unité centrale de
traitement, soit le cerveau d’un
ordinateur. C’est le composant
électronique qui s’assure que
toutes les tâches demandées sont
effectuées.
Le CPU, Central Processing Unit, se
traduit littéralement par « unité
centrale de traitement » (UCT) en
français.
7. La RAM est l'abréviation, en
anglais, de Random Access
Memory (mémoire vive). C'est
l'un des éléments
fondamentaux de
l'informatique. La RAM est une
banque de mémoire
temporaire où votre
ordinateur stocke les données
qu'il doit retrouver rapidement
8. Or, on avait souvent besoin
d'avoir de la puissance
supplémentaire pour des
périodes de forte charge (fête de
Noël, par exemple). Ainsi, vous
deviez acheter plus de serveurs
pour répondre aux pics
d'utilisation. Une solution a alors
été créée : la machine virtuelle.
9. Une machine virtuelle est un
environnement virtualisé qui
fonctionne sur une machine
physique. Elle permet d’émuler un
OS sans l’installer physiquement
sur l’ordinateur.
10. Lorsque vous utilisez une machine virtuelle (VM), vous faites ce qu’on
appelle de la virtualisation lourde. En effet, vous recréez un système
complet dans le système hôte, pour qu’il ait ses propres ressources.
11. L'isolation avec le système hôte est donc totale ; cependant, cela
apporte plusieurs contraintes :
• ❌une machine virtuelle prend du temps à démarrer ;
• ❌une machine virtuelle réserve les ressources (CPU/RAM) sur le système
hôte.
12. Mais cette solution présente aussi de nombreux avantages :
• ✅une machine virtuelle est totalement isolée du système hôte ;
• ✅les ressourcesattribuées à une machine virtuelle lui sont totalement
réservées ;
• ✅vous pouvez installer différents OS (Linux, Windows, BSD, etc.).
13. Mais il arrive très souvent que l'application qu'elle fait tourner ne
consomme pas l'ensemble des ressources disponibles sur la machine
virtuelle. Alors est né un nouveau système de virtualisation plus léger : les
conteneurs.
14. Un conteneur ?
Un conteneur Linux est un processus ou
un ensemble de processus isolés du
reste du système, tout en étant légers.
Le conteneur permet de faire de la
virtualisationlégère, c'est-à-dire qu'il
ne virtualise pas les ressources, il ne
crée qu'une isolationdes processus. Le
conteneur partage donc les ressources
avec le systèmehôte.
15. Attention, les conteneurs
existent depuis plus longtemps
que Docker. OpenVZ ou LXC
sont des technologies de
conteneur qui existent depuis
de nombreuses années.
17. Ne réservez que les ressources nécessaires
Une autre différence importante avec les machines virtuelles est
qu'un conteneur ne réserve pas la quantité de CPU, RAM et disque
attribuée auprès du système hôte. Ainsi, nous pouvons allouer 16 Go
de RAM à notre conteneur, mais si celui-ci n'utilise que 2 Go, le reste
ne sera pas verrouillé.
18. Démarrez rapidement vos conteneurs
Les conteneurs n'ayant pas besoin d'une virtualisation des ressources
mais seulement d'une isolation, ils peuvent démarrer beaucoup plus
rapidement et plus fréquemment qu'une machine virtuelle sur nos
serveurs hôtes, et ainsi réduire encore un peu les frais de
l'infrastructure.
19. Donnez plus d'autonomie à vos développeurs
En dehors de la question pécuniaire, il y a aussi la possibilité
de faire tourner des conteneurs sur le poste des
développeurs, et ainsi de réduire les différences entre la
"sainte" production, et l'environnement local sur le poste
des développeurs.
20. Pourquoi utiliser des conteneurs ?
Les conteneurs permettent de réduire les coûts, d'augmenter
la densité de l'infrastructure, tout en améliorant le cycle de
déploiement.
21. En résumé
• Vous connaissez maintenant la différence entre
conteneur et machine virtuelle ; vous avez ainsi pu
voir les différences entre la virtualisation lourde et la
virtualisation légère.
• Un conteneur doit être léger, il ne faut pas ajouter de
contenu superflu dans celui-ci afin de le démarrer
rapidement, mais il apporte une isolation moindre. À
contrario, les machines virtuelles offrent une très
bonne isolation, mais elle sont globalement plus
lentes et bien plus lourdes.
22. Petite histoire
Docker a été créé pour les
besoins d'une société de
Platform as a Service
(PaaS) appelée DotCloud.
Finalement, en mars 2013,
l'entreprise a créé une
nouvelle structure
nommée Docker Inc et a
placé en open source son
produit Docker.
23. Docker apporte une notion importante dans le monde du
conteneur. Dans la vision Docker, un conteneur ne doit faire
tourner qu'un seul processus. Ainsi, dans le cas d'une stack
LAMP (Linux, Apache, MySQL, PHP), nous devons créer
3 conteneurs différents, un pour Apache, un pour MySQL et un
dernier pour PHP. Alors que dans un conteneur LXC ou OpenVZ,
nous aurions fait tourner l'ensemble des 3 services dans un seul
et unique conteneur.
24. Pourquoi utiliser Docker ?
Docker répond à une problématique forte dans le monde du
développement.
Prenons un exemple : vous avez développé votre projet de Twitter Lite
en local. Tout fonctionne bien, mais au moment de mettre en
production, vous vous rendez compte que vous ne savez pas comment
déployer votre projet. Un autre exemple : vous êtes dans une équipe de
10 personnes et chacun utilise un OS différent (Ubuntu, macOS,
Windows, CentOS, etc.). Comment faire pour avoir un environnement
unifié et fonctionnel chez l'ensemble des développeurs ?
25. Docker répond à ces problématiques en créant des
conteneurs. Grâce à Docker, vous n'aurez plus de problème de
différence d'environnement, et votre code marchera partout !
26. Les conteneurs Docker vous apportent aussi les notions de
stateless et d'immutabilité.
27. Stateless vs Stateful
Dans le monde de Docker, vous allez souvent entendre parler de stateless et
stateful, deux catégories de conteneurs, et vous devez savoir à quoi correspond
chaque catégorie.
Si nous prenons le cas d'une base de donnée MySQL, celle-ci est stateful car
elle stockeun état. Ainsi, si vous éteignez et rallumez votre base de données,
vous la retrouverez dans le même état de fonctionnement.
Stateless est donc l'inverse : l'application ne stocke pas d'état. Vous pouvez
prendre le cas du protocole HTTP, celui-ci est stateless. À chaque nouvelle
requête HTTP, les mêmes séries d'actions seront réalisées.
28. L'immutabilité : d'un conteneur est aussi importante. Un conteneur ne
doit pas stocker de données qui doivent être pérennes, car il les perdra
(à moins que vous les ayez pérennisées). Mais si vous souhaitez en local
mettre une base de données dans un conteneur Docker, vous devez
créer un volume pour que celui-ci puisse stocker les données de façon
pérenne.
29. Docker Inc distribue 3 versions de Docker différentes :
• Docker Community Edition (Linux seulement) ;
• Docker Desktop (Mac ou Windows) ;
• Docker Enterprise (Linux seulement).
31. Installer les paquets pré-requis
Une fois qu’on a mis à jour le système, on doit installer
quelques paquets nécessaires avant d’installer Docker. Vous
pouvez le faire avec une seule commande :
sudo apt-get install curl apt-transport-https ca-certificates
software-properties-common
32. Ajouter les dépôts Docker
Maintenant, nous devons ajouter les dépôts Docker. Le processus d’installation sera ainsi beaucoup plus
facile. Cela nous permet d’utiliser la méthode d’installation officiellement supportée.
D’abord, nous ajoutons la clé GPG avec la commande suivantedans la ligne de commande :
D’abord, nous ajoutons la clé GPG avec la commande suivantedans la ligne de commande :
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Ensuite, nous ajoutons le dépôt :
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu
$(lsb_release -cs) stable"
Après cela, il suffit de mettre à jour les informations du dépôt :
sudo apt update
33. On a presque fini ! Utilisez la commande apt pour installer Docker :
sudo apt install docker-ce
Une fois l’installation terminée, il est conseillé de vérifier l’état du service.
sudo systemctl status docker
t voilà, vous savez maintenant comment installer Docker sur Ubuntu 18.04.
Pas trop compliqué, n’est-ce pas ? Découvrons maintenant les bases de
Docker !
37. Ensuite, pour télécharger l’image sur notre ordinateur, nous utiliserons le nom de
l’image avec la commande suivante :
38. Normalement, les utilisateurs auront plusieurs images dans leur
système. Nous pouvons les lister avec cette commande :
sudo docker images
La liste ressemblera beaucoup à celle que vous recevez lorsque vous
entrez une requête de recherche.
39. Après cela, nous pouvons exécuter notre image en utilisant la commande
pull et le ID de l’image.
sudo docker run -i -t [image]
Il existe des options qui étendent la fonctionnalité de la commande elle-
même. Par exemple, l’option -i rend l’exécution de l’image interactive. Ou
l’option -d qui permet de l’exécuter en arrière-plan.
40. Le Docker Hub c'est quoi ?
Le Docker Hub est le registre officiel de Docker. Il s'agit d'un répertoire
SaaS permettant de gérer et de partager les conteneurs. On peut y
trouver des images Docker de projets open source ou de vendeurs
logiciels. Il est possible de télécharger ces images et de partager les vôtres.
Le lien : https://hub.docker.com
41. répertoireSaaS définition
Une solution dite SaaS (« Software as a Service » ou en français : « logiciel
en tant que service ») est une solution logicielle applicative hébergée
dans le cloud et exploitée en dehors de l'organisation ou de l'entreprise
par un tiers, aussi appelé fournisseur de service.
42. Rechercher et exécuter
l'image Whalesay
Ouvrez votre navigateur et
accédez au Docker Hub .
Le Docker Hub contient des
images de personnes comme
vous et des images officielles
d'organisations comme
RedHat, IBM, Google et bien
d'autres encore.
44. Cliquez sur l' image docker/whalesay dans les résultats.
Le navigateur affiche le référentiel de l' image Whalesay .
45. Exécuter l'image Whalesay
• Ouvrez un terminal de ligne de commande.
• Tapez le docker run docker/whalesay cowsay boo commande et appuyez sur RETOUR.
Cette commande exécute l' image Whalesay dans un conteneur. Votre terminal devrait ressembler à ceci :
46. La première fois que vous exécutez une image logicielle, le docker la
commande le recherche sur votre système local. Si l'image n'est pas
là, alors docker l'obtient de le moyeu.
47. Toujours dans le terminal de ligne de commande, tapez docker images
commande et appuyez sur RETOUR.
La commande répertorie toutes les images de votre système local. Tu devrais
voir docker/whalesay dans la liste.
Lorsque vous exécutezune image dans un conteneur, Docker télécharge l'image sur votre
ordinateur. Cette copie locale de l'image vous fait gagner du temps. Docker uniquement
télécharge à nouveau l'image si la source de l'image change sur le hub.
48. Les commandes de base docker : run et ps
$ docker run image_name
Permet d créer et démarre un conteneur nouvelle instance de l'image.
Si l'image n'existe pas, elle sera d'abord téléchargée à partir du docker hub
$ docker run –d image_name
Permet de demarrer le conteneur comme service de fond.
La valeur par défaut de la version de l'image est latest
Pour spécifier la version (tag)
$ docker run image_name:tag
Exemple : $ docker run redis:4.0
docker ps
Permet de lister les conteneurs qui sont en cours d'exécution
Chaque conteneur créé dispose d'un identifiant unique et d'un nom du conteneur
docker ps –a
Permet de lister tous les conteneurs avec leurs status (Up, Exited, Created)
49. Exécuter NGINX dans un conteneur Docker
Vous pouvez créer une instance NGINX dans un conteneur Docker à
l'aide de l'image Open Source NGINX du Docker Hub.
• Lancez une instance de NGINX exécutée dans un conteneur et utilisant
la configuration NGINX par défaut avec la commande suivante :
$ docker run --name mynginx1 -p 80:80 -d nginx
50. • Mynginx1 est le nom du conteneur créé basé sur l'image NGINX
• le –d L'option spécifie que le conteneur s'exécute en mode détaché :
le conteneur continue de s'exécuter jusqu'à son arrêt mais ne répond
pas aux commandes exécutées sur la ligne de commande.
• le –p L'option indique à Docker de mapper les ports exposés dans le
conteneur par l'image NGINX (port 80) vers le port spécifié sur l'hôte
Docker. Le premier paramètre spécifie le port dans l'hôte Docker, le
deuxième paramètre est mappé au port exposé dans le conteneur
51. La commande renvoie la forme longue de l'ID du conteneur :
fcd1fb01b14557c7c9d991238f2558ae2704d129cf9fb97bb4fadf673a
58580d.
Cette forme d'identification est utilisée dans le nom des fichiers
journaux.
52. Vérifiez que le conteneura été créé et s'exécute avec le docker ps commande:
53. Les commandes stop et rm
docker stop <<containerID or container Name >>
docker rm <<containerID or container Name >>
54. Démarrer une instance de serveur MySQL
$ docker run --name some-mysql -e
MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
some-mysql est le nom que vous souhaitez attribuer à votre
conteneur,
my-secret-pw est le mot de passe à définir pour l'utilisateur,
tag est la balise spécifiant la version MySQL souhaitée. Consultez
la liste ci-dessus pour les balises pertinentes.
55. Exécuter le conteneur
sudo docker exec -it my2sql mysql --password
mysql : l'appliquation mysql dans le conteneur mysql
show databases;create database testmydb;
58. Le système réseau de Docker
utilise des drivers (pilotes).
Plusieurs drivers existent et
fournissent des fonctionnalités
différentes.
59. Le driver Bridge
Tout d'abord, lorsque vous installez Docker
pour la première fois, il crée
automatiquement un réseau bridge nommé
bridge connecté à l'interface réseau docker0
( consultable avec la commande
ip addr show docker0
). Chaque nouveau conteneur Docker est
automatiquement connecté à ce réseau,
sauf si un réseau personnalisé est spécifié.
60. Par ailleurs, le réseau bridge est le
type de réseau le plus
couramment utilisé. Il est limité
aux conteneurs d'un hôte unique
exécutant le moteur Docker. Les
conteneurs qui utilisent ce driver,
ne peuvent communiquer qu'entre
eux, cependant ils ne sont pas
accessibles depuis l'extérieur.
Pour que les conteneurs sur le
réseau bridge puissent
communiquer ou être accessibles
du monde extérieur, vous devez
configurer le mappage de port.
61. Le driver none
C'est le type de réseau idéal, si vous souhaitez interdire
toute communication interne et externe avec votre
conteneur, car votre conteneur sera dépourvu de toute
interface réseau (sauf l'interface loopback).
62. Le driver host
Ce type de réseau permet
aux conteneurs d'utiliser la
même interface que l'hôte. Il
supprime donc l'isolation
réseau entre les conteneurs
et seront par défaut
accessibles de l'extérieur. De
ce fait, il prendra la même IP
que votre machine hôte.
63. Le driver overlay
Si vous souhaitez une mise
en réseau multi-hôte
native, vous devez utiliser
un driver overlay. Il crée un
réseau distribué entre
plusieurs hôtes possédant
le moteur Docker. Docker
gère de manière
transparente le routage de
chaque paquet vers et
depuis le bon hôte et le
bon conteneur.
64. Le driver macvlan
L'utilisation du driver macvlan est
parfois le meilleur choix lorsque
vous utilisez des applications qui
s'attendentà être directement
connectéesau réseau physique,
car le driver Macvlan vous permet
d'attribuer une adresse MAC à un
conteneur, le faisant apparaître
comme un périphérique physique
sur votre réseau. Le moteur
Docker route le trafic vers les
conteneurs en fonction de leurs
adresses MAC.
65. Manipulation du réseau dans Docker
Une fois les présentations finies, il est temps de pratiquer
un peu en manipulant le réseau dans Docker.
66. Créer et récolter des informationsd'un réseau
Docker
La commande pour créer un réseau Docker est
la suivante :
docker network create --driver <DRIVER TYPE> <NETWORK NAME>
67. Dans cet exemple nous allons créer un réseau de type bridge nommé mon-bridge :
docker network create --driver bridge mon-bridge
On va ensuite lister les réseaux docker avec la commande suivante :
docker network ls
68. Il est possible de récolter des informations sur
le réseau docker, comme par exemple la config
réseau, en tapant la commande suivante :
docker network inspect mon-bridge
69. docker network inspect mon-bridge
Pour cet exemple, nous allons connecter deux conteneurs à notre
réseaubridge créé précédemment :
docker run -dit --name alpine1 --network mon-bridge alpine
docker run -dit --name alpine2 --network mon-bridge alpine
71. D'après le résultat, on peut s'apercevoir que notre conteneur
alpine1 possède l'adresse IP 172.21.0.2,et notre conteneur
alpine2 possède l'adresse IP 172.21.0.3. Tentons de les faire
communiquer ensemble à l'aide de la commande ping :
docker exec alpine1 ping -c 1 172.21.0.3
73. Pour information !,
vous ne pouvez pas créer un network host, car vous utilisez l'interface de votre machine hôte.
D'ailleurs si vous tentez de le créer alors vous recevrez l'erreur suivante :
docker network create --driver host mon-host
74. On peut ne peut qu'utiliser le driver host mais pas le créer. Dans cet exemple
nous allons démarrer un conteneurApache sur le port 80 de la machine hôte.
Du point de vue de la mise en réseau, il s’agit du même niveau d’isolation que si
le processus Apache s’exécutait directementsur la machine hôte et non dans un
conteneur. Cependant, le processus reste totalement isolé de la machine hôte.
Cette procédure nécessite que le port 80 soit disponible sur la machine hôte :
docker run --rm -d --network host --name my_httpd httpd
Sans aucun mappage, vous pouvez accédez au serveur Apache en accédant à
http://localhost:80/, vous verrez alors le message "It works!"
75. Depuis votre machine hôte, vous pouvez vérifier quel processus est lié au port 80 à l'aide de la
commande netstat :
76. Enfin arrêtez le conteneur qui sera supprimé automatiquement car il a été
démarré à l'aide de l'option --rm :
docker container stop my_httpd
77. Supprimer, connecter et connecter un réseau Docker
Avant de supprimer votre réseau docker, il est nécessaire au préalable
de supprimer tout conteneur connecté à votre réseau docker, ou sinon
il suffit juste de déconnecter votre conteneur de votre réseau docker
sans forcément le supprimer.
Nous allons choisir la méthode 2, en déconnectant tous les conteneurs
utilisant le réseau docker mon-bridge :
docker network disconnect mon-bridge alpine1
docker network disconnect mon-bridge alpine2
78. Maintenant, si vous vérifiez les interfaces réseaux de vos conteneurs
basées sur l'image alpine, vous ne verrez que l'interface loopback
comme pour le driver none :
79. Une fois que vous avez déconnecté tous vos conteneurs du réseau
docker mon-bridge, vous pouvez alors le supprimer :
docker network rm mon-bridge
Cependant vos conteneurs se retrouvent maintenant sans interface
réseau bridge, il faut donc reconnecter vos conteneurs au réseau
bridge par défaut pour qu'ils puissent de nouveau communiquer entre
eux :
docker network connect bridge alpine1
docker network connect bridge alpine2
80.
81. Créer ses propres images Docker avec le
Dockerfile
Comprendre les différentes instructions du
Dockerfile et apprendre à créer vos propres
images Docker avec le Dockerfile, et pusher vos
images vers le Hub Docker.
82. Introduction
Il est temps de créer vos propres images Docker à l'aide du fichier Dockerfile.
Petit rappel, une image est un modèle composé de plusieurs couches, ces
couches contiennent notre application ainsi que les fichiers binaires et les
bibliothèques requises.
Pour s'exercer, nous allons créer notre propre stack LAMP (Linux Apache MySQL
PHP) au moyen de Docker. Voici les différentes couches de cette image :
83. La première chose que vous devez faire est de créer un
fichier nommé "Dockerfile",puis de définir dans celui-ci
l'image que vous allez utiliser comme base, grâce à
l'instruction FROM . Dans notre cas, nous allons utiliser
une image de base Debian 9.
84. L'instruction FROM n'est utilisable qu'une seule fois dans un Dockerfile.
Ensuite, utilisez l'instruction RUN pour exécuter une commande dans votre
conteneur.
85. Puis, utilisez l'instruction ADD afin de copier ou de télécharger des
fichiers dans l'image. Dans notre cas, nous l'utilisons pour ajouter les
sources de notre application locale dans le dossier /app/ de l'image.
86. Utilisez ensuite l'instruction WORKDIR qui permet de modifier le
répertoire courant. La commande est équivalente à une
commande cd en ligne de commande. L'ensemble des
commandes qui suivront seront toutes exécutées depuis le
répertoire défini.
88. Maintenant que le code source et les dépendances sont bien
présents dans votre conteneur, nous devons indiquer à notre image
quelques dernières informations.
L'instruction EXPOSE permet d'indiquer le port sur lequel votre
application écoute. L'instruction VOLUME permet d'indiquer quel
répertoire vous voulez partager avec votre host.
89. Les instructions EXPOSE et VOLUME ne sont pas nécessaires au bon
fonctionnement de notre image Docker. Cependant, les ajouter permet
une meilleure compréhension pour l’utilisateur des ports d'écoute
attendus, ainsi que des volumes partageables.
90. Nous allons conclure par l'instruction qui doit toujours être présente, et
la placer en dernière ligne pour plus de compréhension : CMD . Celle-ci
permet à notre conteneur de savoir quelle commande il doit exécuter
lors de son démarrage.
92. Lancez votre conteneur personnalisé !
Vous pouvez maintenant créer votre première image Docker !
L'argument -t permet de donner un nom à votre image Docker.
Cela permet de retrouver plus facilement votre image par la suite.
Le . est le répertoire où se trouve le Dockerfile ; dans notre cas, à la racine de
notre projet.
93. Maintenant, vous pouvez lancer votre conteneur avec la
commande docker run :
vous pourrez y accéder sur le port 2368 , soit via
l'URL http://127.0.0.1:2368.
94. En résumé
Pour créer une image Docker, vous savez utiliser les instructions suivantes :
97. Vous avez un nouveau projet de site avec WordPress.Pour
simplifierla gestionde l'infrastructure,vous souhaitez déployer
l'ensemble des composants dans des conteneurs Docker. Pour
cela, nous allons avoir besoin de deux conteneurs :
• un conteneur MySQL ;
• un conteneur WordPress.
98. Docker Compose va vous permettre d'orchestrer vos conteneurs, et ainsi
de simplifier vos déploiements sur de multiples environnements.
Docker Compose est un outil écrit en Python qui permet de décrire, dans
un fichier YAML, plusieurs conteneurs comme un ensemble de services.
99. Docker Compose va vous permettre d'orchestrervos conteneurs, et ainsi de simplifier
vos déploiements sur de multiples environnements.
Docker Compose est un outil écrit en Python qui permet de décrire, dans un fichier
YAML, plusieurs conteneurs comme un ensemble de services.
sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-
compose-$(uname-s)-$(uname -m)" -o /usr/bin/docker-compose&& sudo chmod +x
/usr/bin/docker-compose
100. Vous pouvez vérifier la version de Docker Compose installée sur
votre poste via :
101. À la découverte du CLI de Docker Compose
Pour utiliser le CLI (Command Line Interface) de Docker Compose,
nous avons besoin d'un fichier docker-compose.yml que nous
allons créer dans le prochain chapitre ! Mais avant de le créer,
nous allons commencer par découvrir ensemble l'interface en
ligne de commande (CLI) qui nous permet d'utiliser le
fichier docker-compose.yml .
102. Le CLI de Docker Compose et celui de Docker sont très proches.
Par exemple, si vous souhaitezrécupérer l'ensemble des images
décrites dans votre fichier docker-compose.yml et les télécharger
depuis le Docker Hub, vous devez faire un docker-compose pull .
Du côté de Docker, la commande serait un docker pull .
103. Le fait que les deux interfaces
en ligne de commande soient
très similaires nous évite
d'apprendre un nouveau CLI.
Si vous connaissez celui de
Docker, vous savez
globalement utiliser celui de
Docker Compose !
104. Démarrer une stack Docker Compose
Si vous souhaitez lancer la création de l'ensemble des conteneurs, vous
devez lancer la commande docker-compose up (pour rappel, vous faites
un docker run pour lancer un seul conteneur). Vous pouvez ajouter
l’argument -d pour faire tourner les conteneurs en tâche de fond.
105. Voir le statut d'une stack Docker Compose
Après avoir démarré une stack Docker Compose, vous aurez
certainement besoin de voir si l'ensemble des conteneurs
sont bien dans un état fonctionnel, et prêts à rendre un
service.
Pour cela, vous allez utiliser la commande docker-compose
ps qui vous affichera le retour suivant :
106. Voir les logs d'une stack Docker Compose
Votre stack Docker Compose est maintenant fonctionnelle, et
l'ensemble des services répondent bien ; mais vous pourriez
avoir besoin de voir les logs de vos conteneurs. Pour cela, vous
devez utiliser la commande docker-compose logs -f --tail 5.
107. Celle-ci permet de voir l'ensemble des logs sur les différents
conteneurs de façon continue, tout en limitant l'affichage aux
5 premières lignes.
Ainsi, si nos conteneurs fonctionnent depuis longtemps, nous
n'aurons pas à attendre plusieurs secondes, ni à voir de nombreux
logs qui ne nous intéressent pas.
108. Arrêter une stack Docker Compose
Si vous souhaitez arrêter une stack Docker Compose, vous devez utiliser la
commande docker-compose stop . Cependant, celle-ci ne supprimera pas les
différentes ressources créées par votre stack.
Ainsi, si vous lancez à nouveau un docker-compose up -d , l'ensemble de
votre stack sera tout de suite à nouveau fonctionnel.
Si vous souhaitez supprimer l'ensemble de la stack Docker Compose, vous
devez utiliser la commande docker-compose down qui détruira l'ensemble
des ressources créées.
110. Vous devez maintenant réaliser un
déploiement en production, où
l'ensemble des composantssont dans
des conteneurs Docker. Pour cela, vous
allez avoir besoin de
plusieurs composants:
• une base de données MySQL ;
• le systèmede fichiers WordPress.
111. Vous devez commencerpar créer un fichier docker-compose.ymlà la
racine de votre projet. Dans celui-ci, nous allons décrire l'ensemble des
ressourceset services nécessaires à la réalisation de votre POC.
112. Décrivez votre premier service : db
Un fichier docker-compose.ymlcommence toujours par les informations
suivantes :
L'argument version permet de spécifier à Docker Compose quelle
version on souhaite utiliser, et donc d'utiliser ou pas certaines versions.
Dans notre cas, nous utiliserons la version 3, qui est actuellement la
version la plus utilisée.
113. Déclarezle premier service et son image
Nous allons maintenant déclarer notre premier service, et donc créer notre stack
WordPress !
L'ensemble des conteneurs qui doivent être créés doivent être définis sous
l'argument services . Chaque conteneur commence avec un nom qui lui est propre ; dans
notre cas, notre premier conteneur se nommera db .
114. Puis, vous devez décrire votre conteneur ; dans notre cas, nous utilisons
l’argument image qui nous permet de définir l'image Docker que nous
souhaitons utiliser.
Nous aurions pu aussi utiliser l’argument build en lui spécifiant le
chemin vers notre fichier Dockerfile ; ainsi, lors de l’exécution de Docker
Compose, il aurait construit le conteneur via le Dockerfile avant de
l’exécuter.
116. Les conteneurs Docker ne sont pas faits pour faire fonctionner des
services stateful, et une base de données est par définition un service
stateful. Cependant, vous pouvez utiliser l'argument volumes qui vous
permet de stocker l'ensemble du contenu du dossier /var/lib/mysql dans un
disque persistant. Et donc, de pouvoir garder les données en local sur notre
host.
117. Cette description est présente grâce à la ligne
db_data:/var/lib/mysql . db_data est un volume créé par Docker
directement, qui permet d'écrire les données sur le disque hôte sans
spécifier l'emplacement exact. Vous auriez pu aussi faire
un /data/mysql:/var/lib/mysql qui serait aussi fonctionnel.
118. Définissez la politique de redémarrage du conteneur
Un conteneur étant par définition monoprocessus, s'il rencontre une
erreur fatale, il peut être amené à s'arrêter. Dans notre cas, si le serveur
MySQL s'arrête, celui-ci redémarrera automatiquement grâce à
l'argument restart: always .
119.
120. L'image MySQL fournie dispose de plusieurs variables
d'environnement que vous pouvez utiliser ; dans votre cas, nous
allons donner au conteneur les valeurs des différents mots de passe et
utilisateurs qui doivent exister sur cette base. Quand vous souhaitez
donner des variables d'environnement à un conteneur, vous devez
utiliser l'argument environment , comme nous l'avons utilisé dans le
fichier docker-compose.yml ci-dessus.
121. Dans le second service, nous créons un
conteneurqui contiendra le nécessaire
pour faire fonctionner votre site avec
WordPress. Cela nous permet d'introduire
deux arguments supplémentaires.
122. Le premier argument, depends_on , nous permet de créer
une dépendance entre deux conteneurs. Ainsi, Docker
démarrera le service db avant de démarrer le service
WordPress. Ce qui est un comportement souhaitable, car
WordPress dépend de la base de données pour
fonctionner correctement.
123. Le second argument, ports , permet
de dire à Docker Compose qu'on veut
exposer un port de notre machine
hôte vers notre conteneur, et ainsi le
rendre accessible depuis l'extérieur.
Voici le fichier docker-compose.ymldans sa
version finale :
124. Quand vous lancerez vos conteneurs avec
la commande docker-compose up -d ,
vous devriez avoir le résultat suivant :
125. Lors de l'exécution de cette commande, Docker Compose
commence par vérifier si nous disposons bien en local
des images nécessaires au lancement des stacks. Dans le
cas contraire, il les télécharge depuis une registry, ou les
build via un docker build .
126. Puis celui-ci lance les deux conteneurs sur votre système ; dans notre cas, vous
pourrez voir le résultat en vous ouvrant l'URL suivante dans votre
navigateur : http://127.0.0.1:8000 .
127. Vous savez maintenant utiliser les commandes de base de Docker
Compose, et créer un fichier docker-compose.yml pour orchestrer vos
conteneurs Docker.
128. Si vous êtes intéressé par la suite de ce cours ou si vous
avez besoin de plus d'informations, n'hésitez pas à me
contacter ...