SlideShare une entreprise Scribd logo
Docker
Réalisé par Mr Jaouad ASSABBOUR
Bienvenue dans ce
cours consacré à Docker !
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.
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.
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.
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.
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
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.
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.
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.
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.
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.).
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.
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.
Attention, les conteneurs
existent depuis plus longtemps
que Docker. OpenVZ ou LXC
sont des technologies de
conteneur qui existent depuis
de nombreuses années.
• machine virtuelle VS conteneur
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é.
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.
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.
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.
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.
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.
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.
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 ?
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 !
Les conteneurs Docker vous apportent aussi les notions de
stateless et d'immutabilité.
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.
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.
Docker Inc distribue 3 versions de Docker différentes :
• Docker Community Edition (Linux seulement) ;
• Docker Desktop (Mac ou Windows) ;
• Docker Enterprise (Linux seulement).
installer Docker sur Ubuntu
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
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
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 !
Utiliser Docker sur Ubuntu
Maintenant, si nous voulons rechercher des images disponibles, il suffit d’utiliser la
commande suivante :
Exemple :
Ensuite, pour télécharger l’image sur notre ordinateur, nous utiliserons le nom de
l’image avec la commande suivante :
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.
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.
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
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.
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.
Entrez le mot whalesay dans la barre de recherche.
Cliquez sur l' image docker/whalesay dans les résultats.
Le navigateur affiche le référentiel de l' image Whalesay .
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 :
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.
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.
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)
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
• 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
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.
Vérifiez que le conteneura été créé et s'exécute avec le docker ps commande:
Les commandes stop et rm
docker stop <<containerID or container Name >>
docker rm <<containerID or container Name >>
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.
Exécuter le conteneur
sudo docker exec -it my2sql mysql --password
mysql : l'appliquation mysql dans le conteneur mysql
show databases;create database testmydb;
Reseaux
Introduction
Le système réseau de Docker
utilise des drivers (pilotes).
Plusieurs drivers existent et
fournissent des fonctionnalités
différentes.
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é.
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.
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).
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.
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.
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.
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.
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>
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
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
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
docker network inspect mon-bridge
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
docker exec alpine2 ping -c 1 172.21.0.2
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
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!"
Depuis votre machine hôte, vous pouvez vérifier quel processus est lié au port 80 à l'aide de la
commande netstat :
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
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
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 :
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
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.
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 :
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.
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.
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.
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.
Puis, l'instruction RUN suivante permet d'installer le package du projet
Node.js.
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.
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.
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.
En résumé, voici notre Dockerfile une fois terminé :
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.
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.
En résumé
Pour créer une image Docker, vous savez utiliser les instructions suivantes :
TP, a vous de jouer !
Découvrez et installez Docker Compose
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.
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.
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
Vous pouvez vérifier la version de Docker Compose installée sur
votre poste via :
À 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 .
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 .
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 !
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.
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 :
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.
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.
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.
En résumé
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.
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.
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.
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 .
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.
Définissez le volume pour faire persister vos données
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.
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.
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 .
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.
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.
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.
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 :
Quand vous lancerez vos conteneurs avec
la commande docker-compose up -d ,
vous devriez avoir le résultat suivant :
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 .
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 .
Vous savez maintenant utiliser les commandes de base de Docker
Compose, et créer un fichier docker-compose.yml pour orchestrer vos
conteneurs Docker.
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 ...

Contenu connexe

Tendances

Kubernetes Introduction
Kubernetes IntroductionKubernetes Introduction
Kubernetes Introduction
Peng Xiao
 
Docker 101 - Nov 2016
Docker 101 - Nov 2016Docker 101 - Nov 2016
Docker 101 - Nov 2016
Docker, Inc.
 
Virtualisation
VirtualisationVirtualisation
Virtualisation
Tsubichi
 
Serveur Zabbix
Serveur ZabbixServeur Zabbix
Serveur Zabbix
Damien Morisseau
 
Metasploit et Metasploitable2 : exploiter VSFTPD v2.3.4
Metasploit et Metasploitable2 : exploiter VSFTPD v2.3.4 Metasploit et Metasploitable2 : exploiter VSFTPD v2.3.4
Metasploit et Metasploitable2 : exploiter VSFTPD v2.3.4
Khalid EDAIG
 
Docker
DockerDocker
QCM de question sur examen red hat 7.pptx
QCM de question sur examen red hat 7.pptxQCM de question sur examen red hat 7.pptx
QCM de question sur examen red hat 7.pptx
loffyhacker
 
Docker Explained | What Is A Docker Container? | Docker Simplified | Docker T...
Docker Explained | What Is A Docker Container? | Docker Simplified | Docker T...Docker Explained | What Is A Docker Container? | Docker Simplified | Docker T...
Docker Explained | What Is A Docker Container? | Docker Simplified | Docker T...
Edureka!
 
kubernetes, pourquoi et comment
kubernetes, pourquoi et commentkubernetes, pourquoi et comment
kubernetes, pourquoi et comment
Jean-Baptiste Claramonte
 
Installation et configuration d'apache tomcat
Installation et configuration d'apache tomcatInstallation et configuration d'apache tomcat
Installation et configuration d'apache tomcat
Manassé Achim kpaya
 
Examen sybase - Administration base de donnees
Examen sybase - Administration base de donneesExamen sybase - Administration base de donnees
Examen sybase - Administration base de donnees
webreaker
 
T1 corrections-qcm
T1 corrections-qcmT1 corrections-qcm
T1 corrections-qcminfcom
 
Gitlab CI : Integration et Déploiement Continue
Gitlab CI : Integration et Déploiement ContinueGitlab CI : Integration et Déploiement Continue
Gitlab CI : Integration et Déploiement Continue
Vincent Composieux
 
QCM Sécurité Informatique
QCM Sécurité InformatiqueQCM Sécurité Informatique
QCM Sécurité Informatique
Zakariyaa AIT ELMOUDEN
 
Présentation DEVOPS.pptx
Présentation DEVOPS.pptxPrésentation DEVOPS.pptx
Présentation DEVOPS.pptx
boulonvert
 
Docker Basics
Docker BasicsDocker Basics
Docker Basics
DuckDuckGo
 
memoire utilisation de Puppet et Nagios
memoire utilisation de Puppet et Nagiosmemoire utilisation de Puppet et Nagios
memoire utilisation de Puppet et Nagios
abouaalexis
 
Intro docker
Intro dockerIntro docker
Intro docker
Fedir RYKHTIK
 
BigData_TP1: Initiation à Hadoop et Map-Reduce
BigData_TP1: Initiation à Hadoop et Map-ReduceBigData_TP1: Initiation à Hadoop et Map-Reduce
BigData_TP1: Initiation à Hadoop et Map-Reduce
Lilia Sfaxi
 
Docker 101 : Introduction to Docker and Containers
Docker 101 : Introduction to Docker and ContainersDocker 101 : Introduction to Docker and Containers
Docker 101 : Introduction to Docker and Containers
Yajushi Srivastava
 

Tendances (20)

Kubernetes Introduction
Kubernetes IntroductionKubernetes Introduction
Kubernetes Introduction
 
Docker 101 - Nov 2016
Docker 101 - Nov 2016Docker 101 - Nov 2016
Docker 101 - Nov 2016
 
Virtualisation
VirtualisationVirtualisation
Virtualisation
 
Serveur Zabbix
Serveur ZabbixServeur Zabbix
Serveur Zabbix
 
Metasploit et Metasploitable2 : exploiter VSFTPD v2.3.4
Metasploit et Metasploitable2 : exploiter VSFTPD v2.3.4 Metasploit et Metasploitable2 : exploiter VSFTPD v2.3.4
Metasploit et Metasploitable2 : exploiter VSFTPD v2.3.4
 
Docker
DockerDocker
Docker
 
QCM de question sur examen red hat 7.pptx
QCM de question sur examen red hat 7.pptxQCM de question sur examen red hat 7.pptx
QCM de question sur examen red hat 7.pptx
 
Docker Explained | What Is A Docker Container? | Docker Simplified | Docker T...
Docker Explained | What Is A Docker Container? | Docker Simplified | Docker T...Docker Explained | What Is A Docker Container? | Docker Simplified | Docker T...
Docker Explained | What Is A Docker Container? | Docker Simplified | Docker T...
 
kubernetes, pourquoi et comment
kubernetes, pourquoi et commentkubernetes, pourquoi et comment
kubernetes, pourquoi et comment
 
Installation et configuration d'apache tomcat
Installation et configuration d'apache tomcatInstallation et configuration d'apache tomcat
Installation et configuration d'apache tomcat
 
Examen sybase - Administration base de donnees
Examen sybase - Administration base de donneesExamen sybase - Administration base de donnees
Examen sybase - Administration base de donnees
 
T1 corrections-qcm
T1 corrections-qcmT1 corrections-qcm
T1 corrections-qcm
 
Gitlab CI : Integration et Déploiement Continue
Gitlab CI : Integration et Déploiement ContinueGitlab CI : Integration et Déploiement Continue
Gitlab CI : Integration et Déploiement Continue
 
QCM Sécurité Informatique
QCM Sécurité InformatiqueQCM Sécurité Informatique
QCM Sécurité Informatique
 
Présentation DEVOPS.pptx
Présentation DEVOPS.pptxPrésentation DEVOPS.pptx
Présentation DEVOPS.pptx
 
Docker Basics
Docker BasicsDocker Basics
Docker Basics
 
memoire utilisation de Puppet et Nagios
memoire utilisation de Puppet et Nagiosmemoire utilisation de Puppet et Nagios
memoire utilisation de Puppet et Nagios
 
Intro docker
Intro dockerIntro docker
Intro docker
 
BigData_TP1: Initiation à Hadoop et Map-Reduce
BigData_TP1: Initiation à Hadoop et Map-ReduceBigData_TP1: Initiation à Hadoop et Map-Reduce
BigData_TP1: Initiation à Hadoop et Map-Reduce
 
Docker 101 : Introduction to Docker and Containers
Docker 101 : Introduction to Docker and ContainersDocker 101 : Introduction to Docker and Containers
Docker 101 : Introduction to Docker and Containers
 

Similaire à docker.pdf

Livre blanc docker
Livre blanc docker Livre blanc docker
Livre blanc docker
JEAN-GUILLAUME DUJARDIN
 
docker-workshop-by-rbk.pdf jhuhiuguigugyug
docker-workshop-by-rbk.pdf jhuhiuguigugyugdocker-workshop-by-rbk.pdf jhuhiuguigugyug
docker-workshop-by-rbk.pdf jhuhiuguigugyug
amine17157
 
709469716-Docker-Intro.pptx709469716-Docker-Intro.pptx
709469716-Docker-Intro.pptx709469716-Docker-Intro.pptx709469716-Docker-Intro.pptx709469716-Docker-Intro.pptx
709469716-Docker-Intro.pptx709469716-Docker-Intro.pptx
AbdellahELMAMOUN
 
optimadata.nl-Comment exécuter Postgres sur Docker partie 1.pdf
optimadata.nl-Comment exécuter Postgres sur Docker partie 1.pdfoptimadata.nl-Comment exécuter Postgres sur Docker partie 1.pdf
optimadata.nl-Comment exécuter Postgres sur Docker partie 1.pdf
Pascal Ponzoni
 
A la découverte de docker, 2ème partie
A la découverte de docker, 2ème partieA la découverte de docker, 2ème partie
A la découverte de docker, 2ème partie
Samuel Desseaux
 
Geek Time Mars 2017 : Workshop Docker
Geek Time Mars 2017 : Workshop DockerGeek Time Mars 2017 : Workshop Docker
Geek Time Mars 2017 : Workshop Docker
Nizar GARRACHE
 
Introduction à docker.io
Introduction à docker.ioIntroduction à docker.io
Introduction à docker.io
Nicolas Hennion
 
Docker en Production (Docker Paris)
Docker en Production (Docker Paris)Docker en Production (Docker Paris)
Docker en Production (Docker Paris)
Jérôme Petazzoni
 
A la découverte de docker, 1ère partie
A la découverte de docker, 1ère partieA la découverte de docker, 1ère partie
A la découverte de docker, 1ère partie
Samuel Desseaux
 
5390997 Support formation : Construire et administrer vos conteneurs avec Doc...
5390997 Support formation : Construire et administrer vos conteneurs avec Doc...5390997 Support formation : Construire et administrer vos conteneurs avec Doc...
5390997 Support formation : Construire et administrer vos conteneurs avec Doc...
AbdellahELMAMOUN
 
docker.pptx
docker.pptxdocker.pptx
docker.pptx
kohay75604
 
Oxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassinOxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassin
Ludovic Piot
 
Oxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassinOxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide
 
Intro to docker
Intro to dockerIntro to docker
Intro to docker
Abderrahmane Mechri
 
JFTL-2018-Comment-mettre-en-place-des-plateformes-de-test-gr__ce-__-Docker.pptx
JFTL-2018-Comment-mettre-en-place-des-plateformes-de-test-gr__ce-__-Docker.pptxJFTL-2018-Comment-mettre-en-place-des-plateformes-de-test-gr__ce-__-Docker.pptx
JFTL-2018-Comment-mettre-en-place-des-plateformes-de-test-gr__ce-__-Docker.pptx
AnisSalhi3
 
A la découverte de docker
A la découverte de dockerA la découverte de docker
A la découverte de docker
jean pasqualini
 
Support : introduction à docker
Support : introduction à dockerSupport : introduction à docker
Support : introduction à docker
Boubker ABERWAG
 
Introduction à docker - Meetup WP Rennes
Introduction à docker - Meetup WP RennesIntroduction à docker - Meetup WP Rennes
Introduction à docker - Meetup WP Rennes
Yann Nave
 
Prise en main de Docker
Prise en main de DockerPrise en main de Docker
Prise en main de Docker
BakeliMarketingTeam
 
DevOps 3 - Docker.pdf
DevOps 3 - Docker.pdfDevOps 3 - Docker.pdf
DevOps 3 - Docker.pdf
GhofraneFerchichi2
 

Similaire à docker.pdf (20)

Livre blanc docker
Livre blanc docker Livre blanc docker
Livre blanc docker
 
docker-workshop-by-rbk.pdf jhuhiuguigugyug
docker-workshop-by-rbk.pdf jhuhiuguigugyugdocker-workshop-by-rbk.pdf jhuhiuguigugyug
docker-workshop-by-rbk.pdf jhuhiuguigugyug
 
709469716-Docker-Intro.pptx709469716-Docker-Intro.pptx
709469716-Docker-Intro.pptx709469716-Docker-Intro.pptx709469716-Docker-Intro.pptx709469716-Docker-Intro.pptx
709469716-Docker-Intro.pptx709469716-Docker-Intro.pptx
 
optimadata.nl-Comment exécuter Postgres sur Docker partie 1.pdf
optimadata.nl-Comment exécuter Postgres sur Docker partie 1.pdfoptimadata.nl-Comment exécuter Postgres sur Docker partie 1.pdf
optimadata.nl-Comment exécuter Postgres sur Docker partie 1.pdf
 
A la découverte de docker, 2ème partie
A la découverte de docker, 2ème partieA la découverte de docker, 2ème partie
A la découverte de docker, 2ème partie
 
Geek Time Mars 2017 : Workshop Docker
Geek Time Mars 2017 : Workshop DockerGeek Time Mars 2017 : Workshop Docker
Geek Time Mars 2017 : Workshop Docker
 
Introduction à docker.io
Introduction à docker.ioIntroduction à docker.io
Introduction à docker.io
 
Docker en Production (Docker Paris)
Docker en Production (Docker Paris)Docker en Production (Docker Paris)
Docker en Production (Docker Paris)
 
A la découverte de docker, 1ère partie
A la découverte de docker, 1ère partieA la découverte de docker, 1ère partie
A la découverte de docker, 1ère partie
 
5390997 Support formation : Construire et administrer vos conteneurs avec Doc...
5390997 Support formation : Construire et administrer vos conteneurs avec Doc...5390997 Support formation : Construire et administrer vos conteneurs avec Doc...
5390997 Support formation : Construire et administrer vos conteneurs avec Doc...
 
docker.pptx
docker.pptxdocker.pptx
docker.pptx
 
Oxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassinOxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassin
 
Oxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassinOxalide Workshop #4 - Docker, des tours dans le petit bassin
Oxalide Workshop #4 - Docker, des tours dans le petit bassin
 
Intro to docker
Intro to dockerIntro to docker
Intro to docker
 
JFTL-2018-Comment-mettre-en-place-des-plateformes-de-test-gr__ce-__-Docker.pptx
JFTL-2018-Comment-mettre-en-place-des-plateformes-de-test-gr__ce-__-Docker.pptxJFTL-2018-Comment-mettre-en-place-des-plateformes-de-test-gr__ce-__-Docker.pptx
JFTL-2018-Comment-mettre-en-place-des-plateformes-de-test-gr__ce-__-Docker.pptx
 
A la découverte de docker
A la découverte de dockerA la découverte de docker
A la découverte de docker
 
Support : introduction à docker
Support : introduction à dockerSupport : introduction à docker
Support : introduction à docker
 
Introduction à docker - Meetup WP Rennes
Introduction à docker - Meetup WP RennesIntroduction à docker - Meetup WP Rennes
Introduction à docker - Meetup WP Rennes
 
Prise en main de Docker
Prise en main de DockerPrise en main de Docker
Prise en main de Docker
 
DevOps 3 - Docker.pdf
DevOps 3 - Docker.pdfDevOps 3 - Docker.pdf
DevOps 3 - Docker.pdf
 

Plus de Jaouad Assabbour

Kubernetes (k8s).pdf
Kubernetes (k8s).pdfKubernetes (k8s).pdf
Kubernetes (k8s).pdf
Jaouad Assabbour
 
test-formulaire-angular.pdf
test-formulaire-angular.pdftest-formulaire-angular.pdf
test-formulaire-angular.pdf
Jaouad Assabbour
 
spring-api-rest.pdf
spring-api-rest.pdfspring-api-rest.pdf
spring-api-rest.pdf
Jaouad Assabbour
 
JWT-spring-boot-avancer.pdf
JWT-spring-boot-avancer.pdfJWT-spring-boot-avancer.pdf
JWT-spring-boot-avancer.pdf
Jaouad Assabbour
 
js.pdf
js.pdfjs.pdf
ajax.pdf
ajax.pdfajax.pdf
Angular.pdf
Angular.pdfAngular.pdf
Angular.pdf
Jaouad Assabbour
 
nodejs.pdf
nodejs.pdfnodejs.pdf
nodejs.pdf
Jaouad Assabbour
 
cours java complet-2.pdf
cours java complet-2.pdfcours java complet-2.pdf
cours java complet-2.pdf
Jaouad Assabbour
 
git.pdf
git.pdfgit.pdf
SQL.pdf
SQL.pdfSQL.pdf
React-cours.pdf
React-cours.pdfReact-cours.pdf
React-cours.pdf
Jaouad Assabbour
 

Plus de Jaouad Assabbour (12)

Kubernetes (k8s).pdf
Kubernetes (k8s).pdfKubernetes (k8s).pdf
Kubernetes (k8s).pdf
 
test-formulaire-angular.pdf
test-formulaire-angular.pdftest-formulaire-angular.pdf
test-formulaire-angular.pdf
 
spring-api-rest.pdf
spring-api-rest.pdfspring-api-rest.pdf
spring-api-rest.pdf
 
JWT-spring-boot-avancer.pdf
JWT-spring-boot-avancer.pdfJWT-spring-boot-avancer.pdf
JWT-spring-boot-avancer.pdf
 
js.pdf
js.pdfjs.pdf
js.pdf
 
ajax.pdf
ajax.pdfajax.pdf
ajax.pdf
 
Angular.pdf
Angular.pdfAngular.pdf
Angular.pdf
 
nodejs.pdf
nodejs.pdfnodejs.pdf
nodejs.pdf
 
cours java complet-2.pdf
cours java complet-2.pdfcours java complet-2.pdf
cours java complet-2.pdf
 
git.pdf
git.pdfgit.pdf
git.pdf
 
SQL.pdf
SQL.pdfSQL.pdf
SQL.pdf
 
React-cours.pdf
React-cours.pdfReact-cours.pdf
React-cours.pdf
 

docker.pdf

  • 1. Docker Réalisé par Mr Jaouad ASSABBOUR
  • 2. Bienvenue dans ce cours consacré à Docker !
  • 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.
  • 16. • machine virtuelle VS conteneur
  • 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 !
  • 35. Maintenant, si nous voulons rechercher des images disponibles, il suffit d’utiliser la commande suivante :
  • 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.
  • 43. Entrez le mot whalesay dans la barre de recherche.
  • 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
  • 72. docker exec alpine2 ping -c 1 172.21.0.2
  • 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.
  • 87. Puis, l'instruction RUN suivante permet d'installer le package du projet Node.js.
  • 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.
  • 91. En résumé, voici notre Dockerfile une fois terminé :
  • 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 :
  • 95. TP, a vous de jouer !
  • 96. Découvrez et installez Docker Compose
  • 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.
  • 115. Définissez le volume pour faire persister vos données
  • 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 ...