DevOps
Les conteneurs
1 . 1
References
Les ressources suivantes ont été utilisées pour préparer ces slides:
Les formations proposées par Jérôme Petazzoni
En particulier, les slides sur Docker
Une version étendue de cette présentation est disponible ici
2
Agenda
Pourquoi les conteneurs?
Une appartée sur le Cloud
Introduction à Docker
Les images Docker
La création d'images
Publier des images sur Docker Hub
Manipuler des conteneurs
Gérer les données dans Docker
Docker Compose
Les utilisations des conteneurs?
3
Pourquoi les conteneurs?
4
Evolution de l'industrie logicielle
Avant
Applications monolitiques
Cycles de dev long
Un seul environnement
Après
Ensemble de services
Améliorations rapides, cycles itératifs
De nombreux environnements
Des serveurs de prod (dans le cloud?)
Des laptops de dev
Des serveurs de test (gitlab?)
etv.
5
Le déploiement devient complexe
Des piles logicielles di érentes
Langages
Frameworks
Databases
De nombreux environnements!
6
Le déploiement devient complexe
Credits: B. Golub
7
The matrix from hell
8
Transport de marchandise (pré 1960)
Credits: B. Golub
9
Une autre matrice ...
10
Solution: des conteneurs!
Manipulation simpli ée d'un ensemble d'objets (ou d'applications) grâce à une interface
standardisée.
Credits: B. Golub
11
Des conteneurs pour le logiciel
Credits: B. Golub
12
Fin du "pourtant ça marche sur ma machine"
1. Ecrire les instructions d'installation dans un chier [Link]
2. Créer un script [Link] qui fonctionne
3. Le transformer en un Dockerfile
4. Créer une image Docker à partir de ce Dockerfile
Vous êtes prêts à exécuter sur n'importe quelle machine
13
Etre opérationel sur un projet rapidement
1. Ecrire des Dockerfile pour vos composants
2. Utiliser des images dispo sur Docker Hub (mysql, ect.)
3. Décriver votre application avec un Compose
N'importe qui devient opérationel en 2 commandes
git clone ...
docker-compose up
14
Une apparté sur le Cloud
Computing
15
Avant les nuages
Chaque entreprise gère ses propres ressources informatiques.
Des coûts importants:
Achat de nouveau matériel
Moyens humains pour administrer ces ressources
Taux d'utilisation faible:
En moyenne, moins de 10% des ressources utilisées
Nécessaire pour être capable d'absorber les pics de charge.
16
La révolution dans les nuages
Definition du Cloud Computing
Le cloud computing (l'informatique dans les nuages) est un modèle
dans lequel un fournisseur de service fournit un accès à des
ressources informatiques au travers d'une connexion Internet.
On parle aussi d'Utility Computing.
Idée d'un fournisseur de service -- on paye pour ce qu'on consomme
Le Cloud Computing fait aussi référence à l'infrastructure logicielle et matérielle mise en place
pour fournir ce service.
Émergence à la fin des années 2000
Amazon Elastic Compute Cloud en 2006
Microsoft Azure en 2010
17
Avantages/Inconvénients
Avantages
Économique
Mutualisation des coûts
Facturation des ressources réellement utilisées
Qualité de service
Ressources à jour
Haute disponibilité
Élasticité
Possibilité de démarrer petit
Quantité de ressources accessibles potentiellement in ni
Inconvénients
Con dentialité
Déploiement d'applications sur infrastructure distante? (Complexité)
18
Différents types de services fournis
Software-as-a-service (SaaS)
Accès à un logiciel au travers d'une connexion à un serveur distant
Exemples: Service mail, Éditeur en ligne, Github
Platform-as-a-service (PaaS)
Mise à disposition de briques logicielles de base pour construire une application
L'utilisateur con gure ces briques selon ses besoins
Exemples: Base de donnée, le de messages, etc.
Infrastructure-as-a-service (IaaS)
Le fournisseur donne accès à des ressources informatiques
Accès sous forme de machines virtuelles
Le client installe sa propre pile logicielle sur les ressources obtenues
19
Problèmes à résoudre
Du point de vue du fournisseur
Controler les ressources comsommées par les utilisateurs
Eviter que des utilisateurs compromettent le bon fonctionnement de la plateforme
Du point des utilisateurs
Déployer facilement leur application sur une infrastructure distante
Assurer un bon niveau d'isolation par rapport aux autres utilisateurs
20
Virtualisation et conteneurs
La virtualisation
Abstraire (virtualiser) le matériel à l'aide de couches logicielles
Virtualisation de type II
La virtualisation est une des technologies clés sur laquelle se fonde le Cloud
Computing
21
Intérêts de la virtualisation
Portabilité sur di érents matériels
Isolation entre les utilisateurs
Sécurité
Performance
Manipulations d'images de VMs
L'état complet de la VM sauvegardée dans un chier (OS, applications, données)
Migration
Clonage
Con gurer une seule fois pour de multiples exécutions (templates)
22
Le cas des conteneurs
Une image de conteneur ne contient que les bibliothèques nécessaires au composant
Environnement d'exécution isolé au dessus du système d'exploitation
Les conteneurs partagent le même noyau et une grande partie des services de l'OS hôte
Virtualisation de l'environnement d'exécution (espace de nommage, système de chier
isolé, quotas, etc )
23
Avantages des conteneurs
Meilleures performances
Accès direct au matériel
Démarrage beaucoup plus rapide
Pas besoin de démarrer un système complet
Images plus légères
Ne contient que les informations en lien avec l'application
Moins coûteux en terme d'espace de stockage
Plus rapide à transférer
24
Introduction à Docker
25
Créé en 2011
A popularisé l'utilisation de conteneurs
D'autres technologies de conteneurs existent
Singularity
Podman
etc.
Une partie gratuite et une partie payante
26
Services fournis par Docker
Construction d'images
Gestion d'images
Localement sur une machine
Globalement (Registre -- Docker hub)
Exécution et gestion de conteneurs
27
Qu'est ce qu'un conteneur?
Les technologies de conteneurs o rent une solution de packaging pour une application et
ses dépendances.
Les images de conteneurs
Package de l'application et de ces dépendances
Peut être exécutée sur di érents environnements
Décrites par un chier texte.
Infrastructure-as-code
Un Conteneur
Une instance d'une image de conteneur
S'exécute dans un environnement isolé
Analogie POO
Une image = une classe
Un conteneur = une instance
28
Docker: les briques principales
Docker engine
Un environnement d'exécution et un ensemble de services pour manipuler des conteneurs
docker sur une machine
Une application client-serveur
Le serveur -- Un daemon (processus persistant) qui gère les conteneurs sur une machine
Le client -- Une interface en ligne de commande
Un/des registres d'images docker
Bibliothèque d'images disponibles
Docker Hub
29
Registre Docker
Principe
Un serveur stockant des images docker
Possibilité de récupérer des images depuis ce serveur (pull)
Possibilité de publier de nouvelles images (push)
Docker Hub
Dépôt publique d'images Docker
30
Principes de fonctionnement de Docker
Crédits: B. Golub
31
Architecture de Docker
Crédits: [Link]
32
Les images Docker
33
Images Docker vs Images de VM
Les images de machines virtuelles
Sauvegarde de l'état de la VM (Mémoire, disques virtuels, etc) à un moment donné
La VM redémarre dans l'état qui a été sauvegardé
Les images Docker
Une copie d'une partie d'un système de chier
Pas de notion d'état
34
Principes des images Docker
Fondé sur l'utilisation d'un Union File System
Crée la vision d'un système de chier cohérent à partir de chiers/répertoires appartenant à des
systèmes de chiers di érents
Un ensemble de couches
Une image est composée d'un ensemble de couches (layers)
L'Union File System est utilisé pour combiner ces couches
Le le system utilisé par défaut s'appelle overlay2
Chaque couche correspond à une instruction dans le chier Dockerfile décrivant l'image.
35
Les couches
36
Les couches
Images de base
Toute image est dé nie à partir d'une image de base
Des images de base o cielles sont déjà fournies
Exemples: ubuntu:latest, ubuntu:14.04, opensuse:latest, alpine:latest
alpine: Image de base minimaliste (5MB) -- intéressant pour les performances
Relation avec le système d'exploitation hôte
Une image n'inclut que les bibliothèques et services du système d'exploitation mentionné
Le conteneur utilise le noyau du système hôte
37
Les autres couches
Les couches correspondent aux di érentes modi cations qui sont faites pour construire l'image à
partir de l'image de base.
Pour sauvegarder une nouvelle image, il su t de sauvegarder les nouvelles couches qui
ont été créées au dessus de l'image de base
Chaque couche capture les écritures faites par une commande exécutée lors de la
création de l'image
Faible espace de stockage utilisé
Dans un conteneur en cours d'exécution, il existe une couche supplémentaire accessible en
écriture
Toutes les écritures vers le système de chier faites à l'exécution du conteneur sont
stockées dans cette couche.
Les autres couches, dé nies au sein de l'image utilisée pour instancier le
conteneur, ne sont accessibles qu'en lecture.
Cette couche est supprimée à la suppression du conteneur.
38
Partage de couches
Crédits: [Link]
39
Optimisation des performances
Partage des couches identiques entre conteneurs
Diminue l'espace de stockage utilisé par les conteneurs
Copie sur écriture (Copy-on-Write -- COW)
Un chier accédé en lecture reste dans sa couche
Copie dans la couche du dessus lors d'un accès en écriture
Mécanisme utilisé lors de la création de l'image et de l'exécution des conteneurs
Une couche ne contient vraiment que les données écrites/modi ées
40
Plus d'informations sur les couches
Affichage de l'ensemble des couches d'une image
$ docker history image_name
Avantages liés aux mécanismes de couches
Chaque couche est stockée une seule fois localement
Si certaines couches nécessaires pour une image à télécharger sont déjà présentes, pas
besoin de les télécharger à nouveau.
Réduction de l'espace de stockage
Optimisations à l'exécution
Démarrage rapide
Démarrer un conteneur nécessite simplement de créer la couche accessible en
écriture
Faible utilisation de l'espace disque
Si plusieurs containers sont instanciés à partir de la même image, ils partagent
les couches en lecture seule.
41
Liste d'images stockées localement
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jekyll-github-page latest 65736152d458 4 days ago 735MB
maven 3.8.1-jdk-11 4e8fadf07a8c 7 months ago 658MB
openjdk 11-jdk a9c7e4ad6720 8 months ago 647MB
ubuntu 20.04 7e0aa2d69a15 8 months ago 72.7MB
42
Télécharger des images
docker pull: télécharge une image explicitement
docker run: Commande servant à créer un conteneur à partir d'une image
Télécharge l'image si elle n'est pas présente localement
43
Télécharger des images
$docker pull redis
Using default tag: latest
latest: Pulling from library/redis
a2abf6c4d29d: Pull complete
c7a4e4382001: Pull complete
4044b9ba67c9: Pull complete
c8388a79482f: Pull complete
413c8bb60be2: Pull complete
1abfd3011519: Pull complete
Digest: sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339
Status: Downloaded newer image for redis:latest
[Link]/library/redis:latest
Par défaut, si aucun tag n'est dé ni, l'image avec le tag lastest est téléchargée
Exemples de tags: redis:6.2.6, redis:alpine
44
A propos des tags
Pas besoin de tags quand
On prototype/teste
On veut la dernière version d'une image
Tags à utiliser quand
Quand on va en production
Pour s'assurer que la même version va être utilisée partout
Pour avoir de la reproductibilité
45
La création d'images
46
Créer des images
2 manières:
Interactivement
En utilisant un Dockerfile
47
Avant de commencer: Premiers pas avec docker
L'outil à la ligne de commande pour exécuter des commandes Docker:
$ docker
docker run hello-world
docker: Nous voulons exécuter une commande docker
run: Commande pour créer et exécuter un conteneur docker
hello-world: Nom de l'image à partir de laquelle est construit le conteneur
48
Premiers pas
$ docker run hello-world
Que va-t-il se passer?
L'image à charger est hello-world:latest
Véri cation: est ce que l'image est présente localement?
Sinon, télécharger l'image depuis Docker Hub
Charger l'image dans le conteneur et exécuter la commande par défaut dé nie pour ce conteneur
49
Construire une image interactivement
Objectifs
Créer une image à partir d'une image de base dans laquelle nous allons installer cowsay
Les étapes
1. Créer un conteneur à partir de l'image de base
2. Installer le logiciel manuellement dans le conteneur et en faire une nouvelle image
3. Jouer avec:
docker commit
docker tag
docker diff
50
Configuration du conteneur
Démarrer un conteneur Ubuntu
$ docker run -it ubuntu
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
ea362f368469: Pull complete
Digest: sha256:b5a61709a9a44284d88fb12e5c48db0409cfad5b69d4ff8224077c57302df9cf
Status: Downloaded newer image for ubuntu:latest
root@f461e2e7afff:/#
f461e2e7afff est l'id du conteneur créé
Installer le programme dans le conteneur
root@f461e2e7afff:/# apt-get update
root@f461e2e7afff:/# apt-get install cowsay
51
Inspection des changements
Quitter la session interactive:
root@f461e2e7afff:/# exit
Inspecter les changements:
$ docker diff f461e2e7afff
C /var
C /var/log
C /var/log/apt
C /var/log/apt/[Link]
A /var/log/apt/[Link]
C /var/log/apt/[Link]
C /var/log/[Link]
...
Doc de docker di
C: chier ou répertoire modi é
A: chier ou répertoire ajouté
Rappel: ensemble des changements dans la couche accessible en écriture du conteneur
52
Sauvegarder les changements dans une
nouvelle image
$ docker commit <yourContainerId>
<newImageId>
Sauvegarde les changements dans une nouvelle couche et sauvegarde l'image
Exécution de la nouvelle image
$ docker run -it <newImageId>
root@7267696dc8c6:/# /usr/games/cowsay bonjour
... ca marche
53
Tagger une image
On peut tagger une image pour lui associer un nom (plus facile à manipuler qu'un
identi ant)
$ docker tag <newImageId> cowsay
On peut aussi tagger lors de la création de l'image
$ docker commit <containerId> cowsay
L'image peut maintenant être exécutée en utilisant ce nom:
$ docker run -it cowsay
Il faut maintenant automatiser le processus!
54
Les Dockerfile
Un Dockerfile est une recette décrivant comment construire une image
Contient une suite d'instructions
Le commande docker build permet de créer une image à partir d'un Docker le
55
Éléments de syntaxe
FROM: Dé nit l'image à partir de laquelle la nouvelle image est créée
LABEL: Associe des meta-données à la nouvelle image (par exemple, l'auteur de l'image)
RUN: Dé nie une commande exécutée dans la couche au dessus de l'image courante lors de la
construction de l'image
CMD: Dé nie la commande exécutée au démarrage du conteneur
EXPOSE: Informe docker que le conteneur va écouter sur le port réseau dé ni
COPY: Copier un chier/répertoire depuis le contexte de construction de l'image vers la nouvelle
couche
La destination peut être un chemin absolu ou un chemin relatif depuis WORKDIR
Les commandes de Dockerfile ne sont pas semsibles à la casse. On les note en majuscule par convention (facilite la lecture)
56
Notre premier Dockerfile
1. La création d'un Dockerfile doit se faire dans un nouveau répertoire vide
mkdir my_image
2. Créer le Dockerfile
FROM ubuntu
RUN apt-get update
RUN apt-get -y install cowsay
Les commandes RUN doivent être non-interactives
L'option -y de apt évite qu'il demande si on est sur de vouloir installer
57
Construire notre image
$ docker build -t cowsay .
-t permet de tagger l'image qui va être créée
. indique le contexte de construction de l'image (où se trouve le Dockerfile)
58
Que se passe-t-il?
$ docker build -t cowsay .
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM ubuntu
---> d13c942271d6
Step 2/3 : RUN apt-get update
---> Running in 80f5510281d9
Removing intermediate container 80f5510281d9
---> cb1643c4393c
Step 3/3 : RUN apt-get -y install cowsay
---> Running in 01834650511b
Removing intermediate container 01834650511b
---> 9ca55c5ccc54
Successfully built 9ca55c5ccc54
Successfully tagged cowsay:latest
59
Que se passe-t-il?
Le build context est envoyé vers le démon docker (contenu du répertoir .)
A chaque étape:
Un conteneur est créé pour exécuter l'étape (Running in ...)
Les modi cations sont committées dans une nouvelle image (---> ...)
Le conteneur est supprimé
La nouvelle image est utilisée pour la prochaine étape
60
Construire une image
docker build
Crée une image à partir d'un cher Dockerfile
docker build -t docker-whale .
Crée l'image docker-whale avec le contexte correspondant au répertoire courant (le ``.'' est
nécessaire)
Par défaut, le Dockerfile est cherché à la racine du contexte
Option -f pour changer le chemin
Dans tous les cas le chier doit se trouver dans le contexte
Voir [Link]
61
Construire une image
Build à partir d'une URL:
docker build [Link]/creack/docker-firefox
L'URL peut pointer vers un dépot git, une archive, un chier texte
Cas d'un dépôt git:
Clone le dépôt et utilise le clone comme context
docker build [Link]
Utilise le répertoire docker de la branche container comme contexte
Voir la doc pour plus de détails
62
Manipuler les images
Quelques commandes
docker image COMMAND
docker image ls
liste des images existantes localement
Option -a permet d'a cher toutes les images locales
docker image ls ubuntu: liste des images nommées ubuntu
Les images <none>:<none> sont des images intermédiaires nécessaires à la
constructions d'images locales
docker image rm
Supprime une image
63
Dangling image ("image qui pendouille")
Dé nition: Une image intermédiaire qui n'est plus référencée par aucune image ni aucun
conteneur
Supprimer ces images:
docker image prune
64
A propos du contexte
Lors de la construction d'une nouvelle image, un contexte de construction de l'image est
dé ni:
Souvent le répertoire dans lequel on exécute la commande pour créer l'image
Tous les chiers appartenant au contexte sont envoyés au daemon docker
Seuls les chiers appartenant au contexte peuvent être copiés vers la nouvelle image
Bonne pratique
Créer un répertoire contenant le Dockerfile et seulement les chiers dont vous avez
besoin dans le contexte
Ne pas utiliser "/" comme contexte !!
Un chier .dockerignore peut être utilisé
Dé ni des règles pour ignorer certains chiers du contexte
65
Voir l'historique d'une image
$ docker history mycowsay
IMAGE CREATED CREATED BY SIZE COMMENT
5439d59a9167 31 minutes ago /bin/sh -c #(nop) CMD ["hello world"] 0B
62cf4b34d556 31 minutes ago /bin/sh -c #(nop) ENTRYPOINT ["/usr/games/c… 0B
68dd4625b571 37 minutes ago apt-get -y install cowsay 45.4MB
cb1643c4393c 8 hours ago /bin/sh -c apt-get update 32.6MB
d13c942271d6 38 hours ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 38 hours ago /bin/sh -c #(nop) ADD file:122ad323412c2e70b… 72.8MB
Montre l'ensemble des couches composants une image
Avec des infos sur chaque couches
Chaque couche correspond à une commande dans le Dockerfile
66
Exemple d'utilisation de COPY
Docker le:
FROM ubuntu
RUN apt-get update
RUN apt-get install -y build-essential
COPY hello.c /
RUN make hello
CMD /hello
hello.c doit appartenir au contexte
Le répertoire de travail par défaut du conteneur est "/"
67
Optimiser les images
Nombre de couches
Chaque commande du Dockerfile crée une nouvelle couche:
Limiter le nombre de couches peut améliorer les performances
Commentaire surtout valable pour les anciennes versions de Docker
Build multi-stages
Permet de réduire la taille des images.
Permet par exemple de sélectionner seulement certaines des modi cations générées lors d'une
étape de construction pour les intégrer dans l'image nale.
[Link]
68
Publier des images sur
Docker Hub
69
Publier mon image sur Docker Hub
Tagger l'image à publier:
docker tag mycowsay mydockeraccount/cowsay:latest
mydockeraccount: Mon login sur Docker Hub
Se connecter à docker hub:
docker login
Publier l'image:
docker push mydockeraccount/cowsay
L'image peut maintenant être récupérée par d'autres:
docker pull mydockeraccount/cosway
Voir [Link]
70
Manipuler des conteneurs
71
Démarrer un conteneur
docker run --name mytest mycowsay
Démarre un conteneur nommé mytest
Si on ne spé cie pas l'option --name un nom aléatoire est assigné au conteneur
Un numéro d'identi ant est aussi assigné au conteneur
Exécute la commande spéci ée par ENTRYPOINT/CMD dans le Dockerfile
Plusieurs options (par exemple pour limiter les ressources utilisées)
-it: Crée une session interactive avec le conteneur et ouvre un pseudo-terminal
docker run --name test -it debian
72
Manipuler des conteneurs
Commande parent
docker container COMMAND
Quelques commandes
ls: Montre les conteneurs en cours d'exécution
start: Démarre un conteneur arrêté
stop/restart: Arrête/redémarre un conteneur en cours d'exécution
rm: Supprime un conteneur arrêté
prune: Supprime tous les conteneurs arrêtés
logs: Récupère les logs d'un conteneur
stats: Obtenir les informations sur la consommation de ressources d'un conteneur
top: a che la liste des processus du conteneur
Voir [Link]
73
Débugger dans un conteneur
Comment observer ce qu'il se passe dans un conteneur:
Se connecter à un conteneur en cours d'exécution avec docker exec
Permet d'exécuter un commande ou d'ouvrir un shell
$ docker exec -it f136fa721110 bash
root@f136fa721110:/#
74
La gestion du réseau
75
Remarques introductives
Conteneurs souvents utilisés pour déployer des applications communiquant sur le réseau
Des applis web
Des applis composées de plusieurs services
Des bases de données
Etc.
Plusieurs questions:
Comment communiquer avec un appli conteneurisé depuis l'extérieur?
Comment communiquer entre conteneurs?
Sur un même noeud?
Sur des noeuds di érents?
76
Exemple avec un server web
Lancer un serveur web en arrière plan
$ docker run -d -P nginx
-d lance le conteneur en arrière plan
-P rend accessible tous les ports exposés par le conteneur au niveau de la machine hôte
Observation du conteneur créé
docker ps
CONTAINER ID IMAGE COMMAND PORTS NAMES
f136fa721110 nginx "/docker-entrypoint.…" [Link]:49153->80/tcp, :::49153->80/tcp xenodo
Le serveur utilise le port 80 du conteneur
Ce port a été associé au port 49153 de la machine hote
Envoyer un requête sur le port 49153 de la machine permet d'atteindre le serveur web
dans le conteneur
curl localhost:49153
77
Quelques commentaires
Autre manière d'obtenir le port de la machine hôte
$ docker port <containerID> 80
Choisir le numéro de ports sur la machine hote
$ docker run -d -p 8000:80 nginx
Port 8000 de la machine hôte associé au port 80 du conteneur
-p port-on-host:port-on-container
78
Les réseaux docker
Docker fournit des fonctionalités avancées de gestion du réseau:
Possibilité de créer plusieurs réseaux docker sur une machine
Di érents types de réseaux avec di érentes fonctionalités
Un service DNS se charge de la résolution de noms
Nous ne couvrons pas ce sujet dans ce cours
79
Gérer les données dans
Docker
80
Ecriture dans le conteneur
On peut stocker les données manipulées par une application directement dans le
conteneur.
Les inconvénients:
Inclure des données en lecture seule dans les images augmente leur taille et leur font perdre leur
généricité.
Pour les données écrites pendant l'exécution du conteneur:
Elles disparaissent avec le conteneur
Elles sont di cilement accessibles depuis l'extérieur du conteneur
C'est peu e cace en terme de performance (coût de la gestion des couches)
81
Les alternatives pour le stockage des données
Les volumes:
Stockage géré par Docker dans le système de cher hôte
Partager des données entre plusieurs conteneurs
Stocker des données sur un support distant (ex: dans un cloud) en utilisant un driver
Les bind mounts
Stockage à n'importe quel endroit du système de chier hôte
Partager des chiers de con guration avec le système hôte
Utiliser du code source présent sur la machine hôte
Les montages tmpf:
Stockage en mémoire
Plus e cace qu'un volume lorsque les données n'ont pas besoin de persistance
Voir [Link]
82
Les solutions pour le stockage des données
83
Les volumes
Création d'un volume:
$ docker volume create my-vol
Utilisation d'un volume
Option --mount pour la commande docker run
Utilisation du volume my-vol avec comme répertoire destination au sein du conteneur
/app:
docker run -d --name devtest --mount source=my-vol,target=/app debian
Commentaires:
Le volume n'a pas besoin d'être créé à l'avance
Si le répertoire destination contient déjà des données, elles sont copiées dans le conteneur
L'option readonly peut être utilisée pour empêcher les données d'un volume d'être modi ées
Voir [Link]
84
Les bind mounts
Option --mount pour la commande docker run avec l'option type=bind
$ docker run -d -it --name devtest \
--mount type=bind,source="$(pwd)"/code,target=/app debian:latext
Commentaires
Si le répertoire /app existe déjà au sein du conteneur, son contenu est remplacé celui du
répertoire de l'hôte qui est bindé.
85
Docker Compose
86
Motivations
Con gurer correctement une application multi-services peut être complexe
Démarrage de l'ensemble des conteneurs avec les bonnes options
Con guration du réseau
Con guration des volumes
Etc.
Solution
Une approche Infrastructure-as-code
Docker Compose
87
Qu'est ce que Docker Compose?
Un outil complémentaire du Docker Engine
Permet de décrire une application construite à base de conteneurs dans un chier YAML
Déploiement sur une seule machine
Scénario visé
Checkout du code sur un dépot
Executer docker-compose up
... Et c'est tout!
L'application est con gurée et démarrée
88
Principes de Docker Compose
L'utilisateur décrit son application (multi) conteneurs dans un chier YAML appelé docker-
[Link]
Executer docker-compose up pour démarrer l'application
Compose télécharge automatique les images, les build (si nécessaire), et démarre les
conteneurs
Compose peut con gurer des volumes, le réseau, et toutes autres options liées à Docker
Compose aggrège les sorties des di érents conteneurs (si applicable)
89
Un exemple
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
depends_on:
- redis
redis:
image: redis
volumes:
logvolume01:
Voir: [Link]
90
Sur l'exemple précédent
2 services: web et redis
Par défaut, Compose créé un réseau bridge indépendant du réseau par défaut
La découverte de service fonctionne sur ce réseau
web peut contacter redis en utilisant son nom
Un conteneur pour chaque service est créé
Pour web, une image est d'abord re-créé à partir du Dockerfile présent dans le
répertoire courant
Pour redis, l'image redis est récupérée depuis Docker Hub
Con guration du réseau
Le port 5000 de la machine hote est associé au port 5000 du conteneur web
91
Dans un environnement distribué
Services permettant de déployer des applications multi-conteneurs sur plusieurs machines:
Docker swarm
Kubernetes
Services fournis (Kubernetes)
Déploiement automatique des conteneurs
Placement en fonction des besoins de ressources
Monitoring et redémarrage automatique de conteneurs
Équilibrage de charge entre instances d'un service
etc.
92
Les utilisations des
conteneurs
93
Passage du dev à la production
1. Créer une image de conteneur et une composition
2. L'image peut être directement déployé en production
Même environnement pour le dev, le test, et la production
Deploiement simpli é
Les devs peuvent se charger du déploiement
3. Le passage en production est uidi é
94
Infrastructure as code
L'infrastructure est décrite dans des chiers texte
Les Dockerfile (= du code)
Sert aussi de documentation de l'infrastructure
Cette description peut etre versionnée (dépot git)
Suivi des modi ciations
Possibilité de revenir en arrière
Mise en place automatique de l'infrastructure
Déterministe
Reproductible
95
Utilisation pour de l'intégration continue (CI)
1. Environnement de test créé à partir d'une image Docker
Les tests peuvent être exécutés sur n'importe quelle plateforme (plateforme de CI)
2. Un nouveau conteneur créé pour chaque étape de tests
Pas de polution entre les étapes d'un test
Pas de polution entre plusieurs exécutions des tests
3. Les tests peuvent être exécutés très souvent
96
Utilisation pour la distribution d'artefacts
1. Contruire notre application à partir de Docker les
2. Stocker les images dans un registre
Stockage pérenne
Accessible pour tout le monde
3. Exécuter en production
Les images contiennent toutes les dépendances pour vos applications
4. Versionage
Possibilité de tagger les images
97
Découplage de la "plomberie" et de la logique
applicative
1. Utiliser des noms de services dans votre code (bd, api, etc)
2. Utiliser une composition pour démarrer votre application
(ou un orchestrateur si sur plusieurs serveurs)
3. Résolution de nom faite de manière automatique
4. On peut redimensionner, faire de l'équilibrage de charge, répliquer sans changer le
code
98
Des slides en plus
99
Syntaxe shell vs exec
Les commandes telles que RUN ou CMD ont 2 syntaxes possibles
La syntaxe shell
RUN apt-get install cowsay
Le commande est exécutée dans un shell
/bin/sh -c est utilisé par défaut
La syntaxe exec
RUN ["apt-get", "install", "cowsay"]
Commande parsée en JSON et exécutée directement
Nécessite " pour chaque chaine de caractères
100
Syntaxe shell vs exec
La syntaxe shell
Plus facile à lire
Interprète les expressions shell (ex: $HOME)
La syntaxe exec
N'essaye pas d'interpréter les arguments
Ne nécessite pas que /bin/sh soit présent dans l'image
101
CMD et ENTRYPOINT
A propos de CMD
Dé ni la commande par défaut à exécuter dans le conteneur quand aucune
commande n'est fournie à l'exécution de docker run
Peut être insérée à n'importe quel endroit dans le Docker le mais seul la dernière
est conservée
A propos de ENTRYPOINT
Permet de dé nir une commande toujours exécutée par le conteneur
A utiliser quand le conteneur est utilisé comme exécutable
Il est recommandé d'utiliser la syntaxe exec
102
CMD et ENTRYPOINT
Les règles principales
Chaque Dockerfile doit spéci er au moins CMD ou ENTRYPOINT
Quand CMD ou ENTRYPOINT sont utilisés en même temps
ENTRYPOINT dé nit la commande de base
CMD dé nit les paramètres par défaut
Ils doivent tous les 2 utiliser la syntaxe exec
A l'éxécution seule la partie CMD sera écrasée si des paramètres sont passés.
Voir [Link]
103
CMD et ENTRYPOINT : illustration
FROM ubuntu
RUN apt-get update
RUN ["apt-get", "-y", "install", "cowsay"]
ENTRYPOINT ["/usr/games/cowsay", "-e", "%%"]
CMD ["hello world"]
docker build -t mycowsay .
104
CMD et ENTRYPOINT : illustration
$ docker run mycowsay
< hello world >
-------------
\ ^__^
\ (%%)\_______
(__)\ )\/\
||----w |
|| ||
# Commande exécutée: /usr/games/cowsay -e %% hello world
$ docker run mycowsay salut
_______
< salut >
-------
\ ^__^
\ (%%)\_______
(__)\ )\/\
||----w |
|| ||
# Commande exécutée: /usr/games/cowsay -e %% salut
105