title | author | company | contributors | sources | |
---|---|---|---|---|---|
Docker - Docker Compose |
Alexandre Devos |
Octocorn |
|
- Il est rare que tout le contenu d'une app (font, back, bdd, ...) soit dans un seul conteneur.
- Il est donc nécessaire de pouvoir lancer plusieurs conteneurs en même temps.
Si je devais lancer une app web n tiers classique, je devrais :
- Lancer un conteneur pour la base de données
- Lancer un conteneur pour le back
- Lancer un conteneur pour le front
- Créer les images de chacun de ces conteneurs
- Créer des volumes de persistence
- Créer un network et le lier à tous les conteneurs
- Et tout refaire à chaque mise à jour !
- Docker Compose permet de faire tout ça en une seule commande !
- Ce fichier est nommé
docker-compose.yml
, écrit en YAML. - Il peut être partagé, inséré dans un dépôt git, etc.
- Yet Another Markup Language
- Format .yaml ou .yml
- Format de données textuelles, comparable au JSON
- Utilisé pour la configuration de nombreux outils (Ansible, Docker, Kubernetes, etc.)
- Il s'agit d'un langage de sérialisation
- Il sert à stocker des données brutes de manière structurée
- Fonctionne avec des clés et des valeurs
- Utilise l'indentation pour structurer les données
formation:
titre: Docker
duree: 2 jours
niveau: débutant
author:
nom: Alexandre Devos
societe: Octocorn
stack:
- Ecosystème Java
- Ecosystème Javascript
- DevOps
{
"formation": {
"titre": "Docker",
"duree": "2 jours",
"niveau": "débutant"
},
"author": {
"nom": "Alexandre Devos",
"societe": "Octocorn",
"stack": [
"Ecosystème Java",
"Ecosystème Javascript",
"DevOps"
]
}
}
- Les types d'objets primaires (int, str, float, bool etc.)
- Beaucoup de types de données (tableaux, listes ...)
- Pris en charge par le JavaScript, Python, Ruby, Java ...
Il n'est pas destiné à remplacer le JSON, chacun ayant ses avantages.
Si votre conteneur ne build pas : vérifiez votre indentation !
- L'utilisateur écrit un fichier
docker-compose.yml
- Il tape la commande
docker-compose up
- Docker compose va :
- Lire le fichier
docker-compose.yml
- Créer les conteneurs
- Créer les volumes
- Créer le network
- Lancer les conteneurs
- Lire le fichier
- L'utilisateur peut accéder à l'application
- Si on peut mettre 'ce que l'on veut' dans un fichier YAML, il faut tout de même respecter une structure.
- Concernant Docker Compose, il y a des attributs obligatoires et d'autres facultatifs.
- Il existe beaucoup d'attributs, nous n'en verrons que quelques uns.
Liste complète ici
## Version de docker-compose
version: "3.9"
services: ## Obligatoire : liste des services.
permierService: ## Nom du service (conteneur)
## Obligatoire : image de base. Equivbalent du FROM
image: nginx:latest
ports: ## Ports à exposer, comme pour le -p de docker run
- 8080:80
volumes: ## Volumes à monter. Même fonctionnement que docker run -v
- ./nginx.conf:/etc/nginx/nginx.conf
secondService:
## ...
troisiemeService:
## ...
Attention à l'indentation !
- Indique la version de docker-compose utilisée
- La version 3.9 correspond à la version 19.03+ du moteur Docker
Voir la doc
services:
monservice:
- Liste des services (conteneurs) à créer
- Obligatoire
- Chaque service est un objet, avec ses propres attributs
services:
monservice:
attribut:
attribut:
- Il y a une indentation entre le nom du service et ses attributs
- Le nom du service est libre, mais il est conseillé de le nommer comme le conteneur qu'il va créer
services:
monservice:
image: nginx:latest
- Indique l'image de base du conteneur
- Equivalent du
FROM
d'un Dockerfile
services:
monservice:
ports:
- 8080:80
- Indique les ports à exposer
- Equivalent du
-p
dedocker run
- Le premier port est celui de l'hôte, le second celui du conteneur
services:
monservice:
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- Indique les volumes à monter
- Equivalent du
-v
dedocker run
- Le premier chemin est celui de l'hôte, le second celui du conteneur
services:
monservice:
volumes:
- nomVolume:/etc/nginx/nginx.conf
volumes:
nomVolume:
- Permets ici de monter un volume Docker
- Equivalent du
-v
dedocker run
- Le volume doit être déclaré dans la section
volumes
services:
monservice:
depends_on:
- serviceA
- serviceB
- Indique les dépendances entre les services
- Le service démarrera après les services dont il dépend
services:
monservice:
environment:
- PORT=8080
- Indique les variables d'environnement à passer au conteneur
- Equivalent du
-e
dedocker run
NB : beaucoup de conteneurs ont besoin de variable d'environnement !
docker-compose up
: lance les conteneurs du contexte courantdocker-compose up -d
: lance les conteneurs en mode détachédocker-compose down
: arrête et supprime les conteneurs du contexte courant
Docker run VS docker compose
Réalisez l'exercice 2.
services:
monservice:
build: ./chemin/vers/Dockerfile
- Indique le chemin vers le Dockerfile à utiliser
- Equivalent du
docker build
d'un Dockerfile - Le fichier doit être présent dans le contexte courant
services:
monservice:
context: ./chemin/vers/contexte
- Indique le chemin vers le contexte à utiliser
- Permet de spécifier un contexte différent du répertoire courant
- Equivalent du
docker build -f ./chemin/vers/Dockerfile
d'un Dockerfile
services:
monservice:
dockerfile: Dockerfile.dev
- Indique le nom du Dockerfile à utiliser
- Permet de spécifier un Dockerfile différent de
Dockerfile
- Utile quand on a plusieurs dockerfile dans le même contexte
- Docker conserve en cache les images buildées
- Cela permet de ne pas avoir à tout refaire à chaque fois : il ne build que les couches modifiées
- Concernant les docker-compose, il faut utiliser l'option
--build
pour lui indiquer explicitement de rebuild les images
docker-compose up --build
Rendez vous sur ce repository. Vous y trouverez les énoncés de l'exercice !
- Il reste encore beaucoup de choses à voir sur Docker, mais vous avez les bases !
- Certains éléments ont en effet été volontairement omis pour ne pas vous noyer.
- Si vous souhaitez m'aider à améliorer ce cours, n'hésitez pas à me contacter ou à consulter la charte de contribution