Docker
Docker
• Objectifs :
– Comprendre le positionnement de Docker et des conteneurs
– Manipuler l'interface en ligne de commande de Docker pour créer des
conteneurs
– Mettre en œuvre et déployer des applications dans des conteneurs
– Administrer des conteneurs
• Prérequis :
– Connaissances de base de l'administration Linux.
1
Sommaire
De la virtualisation à Docker
Présentation de Docker
Mise en œuvre en ligne de commande
Interfaces d'administration
DE LA VIRTUALISATION
À DOCKER
2
De la virtualisation à Docker
3
La virtualisation
● Hyperviseur de type 2
● Isolateur
4
Hyperviseur de type 2
● Isole bien les OS invités, mais a un coût en performance (surtout si le CPU est
émulé).
● On peut faire cohabiter des OS hétérogènes et les faires communiquer via le
réseau.
● Ex: Vmware Fusion, Oracle Virtualbox, Parallels Desktop, Microsoft VirtualPC, …
Hyperviseur de type 1
5
Noyau en espace utilisateur
● Solution très peu performante et l’isolation des environnements n’est pas gérée et
l’indépendance par rapport à l’OS hôte est inexistante.
● Surtout utilisé pour le développement du noyau Linux.
● Ex: User Mode Linux, coLinux, Adeos, L4Linux, …
Isolateur
● Liés aux systèmes Linux, les isolateurs sont composés de plusieurs éléments et
peuvent prendre plusieurs formes.
● Ex: Linux-Vserver, chroot, BSD Jail, OpenVZ, LXC, Docker, …
6
La petite histoire des conteneurs.
7
La petite histoire des conteneurs. (2/ 7)
8
La petite histoire des conteneurs. (4/ 7)
● Si Solaris n’a pas eu la même popularité que les BSD auprès du grand
public, il disposait d’un budget de R&D important et a eu des
fonctionnalités innovantes.
● Parmi celles-ci, les « zones » ont été introduit dans Solaris 10 en 2005.
● Assez similaires aux « jails » BSD mais couplés au système de fichier ZFS, il
devient très simple de faire des snapshots et de cloner une zone.
● On pouvait avoir plusieurs OS Solaris (voir d’autres système comme Linux
avec les « Branded Zones ») sur le même hôte avec un « overhead » très
faible.
● Cela n’a toutefois pas permis à Solaris de s’imposer face aux autres
systèmes d’exploitation.
9
La petite histoire des conteneurs. (6/ 7)
● En 2008, les « Linux Containers» (LXC) sont les premiers à combiner les
« cgroups » et les « namespaces ».
● Son point faible en 2008 : la sécurité. Il est en effet possible pour
l’utilisateur « root » de lancer un processus sur l’hôte… en « root ».
● La sécurité a été renforcée depuis la version 1.0 (02/2014).
● Son utilisation reste trop centrée sur les technologies et pas assez sur un
écosystème capable de le rendre attrayant.
● « Let Me ContainThat For You» (LMCTFY) a été lancé comme projet open
par Google en 2013 comme version open-source de leur outil interne.
● Malgré des fonctionnalités intéressantes, Google a considéré qu’il serait
mieux de se consacrer à un outil plus simple : libcontainer (Docker).
10
Le positionnement de Docker.
Le positionnement de Docker.
● Docker est devenu un des outils les plus en vue dans le paysage informatique.
● Docker est un ensemble d’outil facilitant la mise en œuvre d’une virtualisation
légère.
● Dans une virtualisation classique (hyperviseur de type 2), les OS invités
consomment un très grande quantité de ressources (CPU, RAM, HDD, …) pour
nombre de fonctionnalités non utilisées.
● D’autant plus que l’on déploie rarement des OS invités dans une
infrastructure, ce qui renforce le « gâchis ».
● Des optimisations peuvent être mises en place dans ces outils (ex: sur-
provisionning de mémoire, mutualisation de portions d’images, …) mais cela
reste intrinsèquement limité.
11
Le positionnement de Docker.
● Bien sûr des failles peuvent exister, comme dans tout processus logiciel, il faut
donc suivre l’apparition de correctifs.
PRÉSENTATION DE DOCKER
12
Présentation de Docker
● L'architecturede Docker.
● Disponibilité et installation de Docker sur différentes plateformes
(Windows, Mac et Linux).
L'architecture de Docker.
13
L'architecture de Docker.
L'architecture de Docker.
14
Le démon et le client Docker
15
Les images Docker
● Les images sont des notices de montage, en lecture seule, pour la création de
conteneur.
● La plupart du temps les images se basent sur une autre image, et rajoutent
simplement de la configuration supplémentaire (fichiers, variables
d’environnements, …).
● On peut créer ses propres images ou utiliser celles disponibles dans le registre.
● Pour créer sa propre image, on crée un fichier « Dockerfile » avec une
syntaxe simple décrivant les instructions nécessaires à la création et au
lancement de celle-ci.
16
Les services Docker
17
Les éditions de Docker
● “Docker Community Edition (CE) is ideal for individual developers and small
teams looking to get started with Docker and experimenting with container-
based apps.”
● “Docker Enterprise Edition (EE) is designed for enterprise development and IT
teams who build, ship, and run business critical applications in production at
scale.”
Docker CE
● Debian
● Fedora
● Ubuntu
● Windows
● Mac
18
Docker CE Linux (CentOS 7)
● InstallezDocker CE :
sudo yum install docker-ce docker-ce-cli containerd.io
Docker CE W indows
19
Docker CE Mac
● La version la plus « actuelle » pour installer Docker sous Mac est « Docker
Desktop ».
● Ses prérequis sont :
● Un hardware datant de 2010 ou plus récent avec les fonctionsde virtualisation Intel.
Docker CE Toolbox
20
La ligne de commande et l'environnement.
● Quelques options :
● --config string Location of client config files (default "/root/.docker")
● -l, --log-level string Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info")
● …
21
La ligne de commande du client Docker (2/ 2)
● Quelques commandes :
● pull : récupère une image depuis le registre
● run : démarre un nouveau conteneur
● stop : arrête un ou plusieurs conteneurs
● rm : supprime un ou plusieurs conteneurs
● commit : crée une nouvelle image depuis l’état actuel d’un conteneur
● build : crée une nouvelle image depuis un Dockerfile
● container : gère les conteneurs
● image : gère les images
● network : gère les réseaux
● volume : gère les volumes
● …
● Chaque commande accepte ces propres arguments.
L’environnement
● PATH Includes popular directories, such as / usr/ local/ sbin:/ usr/ local/ bin:/ usr/ sbin:/ usr/ bin:/ sbin:/ bin
22
MISEEN ŒUVREEN
LIGNEDE COMMANDE
23
Mise en place d'un premier conteneur.
24
Gestion des images (2/2)
25
Le mode interactif.
26
Docker Hub
● Docker Hub est un site web fourni par Docker pour rechercher et partager
des images de conteneur avec son équipe et le monde si on le souhaite.
● Teams & Organizations: pour gérer l'accès aux référentiels privés d'images de conteneurs.
● Official & Publisher Images: pour tirer des images de conteneurs fournies respectivement par Docker et
par des fournisseurs externes. Les images certifiées incluent également une assistance et garantissent la
compatibilité avec Docker Enterprise.
● Webhooks: pour déclencher des actions après une insertion réussie dans un repository.
Repositories (1/ 2)
● mongo:4.0.10-xenial
27
Repositories (2/ 2)
● On peut chercher des images dans le Docker Hub via le web ou via la ligne
de commande :
docker search <imagename>
Official Images
● Les images « officielles » sont des images qui sont conçues pour :
● Fournir des images de base d’OS servant de point de départ à la majorité des autres images.
● Fournir des solutionsprêtes à l’emploi pour des langages de programmation, bases de
donnéeset autres services populaires.
28
Publisher Images
● Les éditeurs peuvent également être « Docker Certified » s’ils atteignent les
critères de qualité, sécurité et support de ce programme.
● Cette team peut gérer l’organisation, créer d’autre équipes et gérer les
repositories.
● C’est via les teams que l’on accorde des droits de lecture, lecture/écriture ou
d’administration sur un repository.
29
Gestion de données dans un conteneur.
● Par défaut, tous les fichiers créés dans un conteneur sont stockés dans un
calque de conteneur en écriture.
● Ecrire dans un calque de conteneur en écriture nécessite un pilote de stockage pour gérer le
système de fichiers. Le pilote de stockage fournit un système de fichiers « union » utilisant le
noyau Linux.
30
Gestion de données dans un conteneur. (2/3)
● Les « binds mounts » peuvent être stockés n’importe où sur le système hôte. Les autres
processus peuvent modifier les fichiers.
● Si vous utilisez Docker sous Linux, vous pouvez également utiliser un « tmpfs
mount ».
31
Volumes (1/2)
● Les volumes ont pour avantages par rapport aux « bind mounts » :
● Les volumes sont plus facilesà sauvegarderou à migrer.
● On peut les gérer via la ligne de commande et l’API Docker.
● Peuvent être partagés entre plusieurs conteneurs d’une manière plus sécurisée.
● Peuvent être situés sur des hôtes distants ou sur des fournisseurs cloud, être chiffrés, etc…
Volumes (2/2)
32
Bind mounts
● Les « bind mounts » ont des fonctionnalités plus limitées que les volumes.
tmpfs mounts
● Cela est utile pour stocker temporairement les fichiers sensibles que vous ne
souhaitez pas conserver dans l'hôte ou dans la couche en écriture du conteneur.
33
Gestion du réseau dans un conteneur.
● Il est également possible d’utiliser des plugins tiers pour accéder à d’autres
types de réseaux.
34
Bridge networking. (1/ 3)
● Résolution DNS automatique entre les conteneursdu même réseau (en plus de l’adresse ip).
● Les conteneurspeuvent être attachés et détachés d’un réseau à chaud (sinon recréés).
● Les réseaux personnalisés peuvent être configurés différemment les uns des autres.
35
Bridge networking. (3/ 3)
● Pour exposer des ports à l’extérieur d’un réseau « bridge », il suffit d’ajouter
une ou plusieurs options « --publish » au lancement des conteneurs
concernés :
docker run --network <network-name> --publish <host-
port>:<container-port> --publish <host-port>:<container-port>
36
Host networking.
● Dans le réseau « host », le conteneur n’est pas isolé en terme réseau et n’a
donc pas d’adresse IPpropre.
● Les services dans les conteneurs utilisent directement les ports de l’hôte.
● Il y a des limitations :
● Un seul service sur l’hôte peut s’approprier un port donné.
CRÉATION DE CONTENEUR
PERSONNALISÉ
37
Création de conteneur personnalisé
38
Produire l'image de l'état d'un conteneur.
39
Qu'est- ce qu'un fichier Dockerfile ? (1/ 2)
● Docker peut créer des images à partir des instructions contenues dans un
fichier « Dockerfile ».
● C’est un fichier texte qui peut contenir les différentes instructions que l’on
utilise dans le ligne de commande pour créer une image.
● La commande « docker build context » crée une image à partir d’un
Dockerfile et d’un contexte.
● Le contexte est un ensemble de fichiers contenu dans un dossier ou dans un
dépôt Git (les sous-dossiers sont inclus récursivement).
● L’ensemble du contexte est envoyé au démon Docker pour construire l’image :
il faut donc mettre dans le dossier uniquement ce qui est nécessaire pour
construire l’image.
40
Format du fichier Dockerfile
● Les instructions ne sont pas sensibles à la casse mais par convention sont
écrites en majuscule.
● Les instructions sont exécutées dans l’ordre du fichier.
● La première instruction doit être « FROM » : elle précise l’image de base au
dessus de laquelle vous construisez votre image.
● Les lignes commençant par « # » sont considérées comme des commentaires,
sauf si ce sont des directives de parser valides.
Directive de parser
41
Utilisation de variable d’environnement
● COPY ● USER
● ENV ● VOLUME
● EXPOSE ● WORKDIR
42
ARG
FROM
43
SHELL
RUN
44
ADD / COPY
EXPOSE
45
VOLUME
CMD / ENTRYPOINT
46
Mise en œuvre d'un conteneur.
● A noter qu’il est également possible de publier une image sous forme d’un
archive tar :
docker save -o <fichier> <image>
● Une image sous forme d’une archive TAR peut ensuite être importée ailleurs :
docker load -i <fichier>
47
Conteneur hébergeant plusieurs services :
supervisor.
● Utiliser un gestionnaire de processus tel que « supervisord » qui managera les processus pour
vous (supervisord étant le point d’entré du Dockerfile »).
48
Supervisord (1/2)
[program:process1]
command=/path/to/exec -option
[program:process2]
command=/path/to/exec2 -option
Supervisord (2/2)
49
METTREEN ŒUVRE
UNEAPPLICATION
MULTICONTENEUR
50
Utilisations de Docker Compose.
Docker Compose.
● Avec Compose, vous utilisez un fichier YAML pour configurer les conteneurs de
votre application.
● Ensuite, avec une seule commande, vous créez et démarrez ceux-ci.
● Compose propose des commandes permettant de gérer l’ensemble du cycle
de vie de votre application:
● Démarrer, arrêter et reconstruire desconteneurs
51
Fonctionnalités de Docker Compose.
52
Installation de Docker Compose.
● Docker Compose est inclus dans Docker Desktop sur Windows et Max.
● Sous Linux, l’installation se fait séparément après celle du démon Docker.
● Téléchargez tout d’abord l’exécutable :
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-
compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
● Testez l’installation :
docker-compose --version
53
Création d'un fichier YML de configuration.
54
Structure de base
Les conteneurs
55
Les conteneurs : image
● Pour créer un conteneur, le plus simple est de se baser sur une image
disponible dans le DockerHub.
● Pour cela, on précise l’image avec la ligne « image » :
service:
container_name:
image: <repository>/<image_name>
● Pour créer un conteneur, il est aussi possible de construire une image à partir
d’un Dockerfile.
● Pour cela, le plus simple est de définir le dossier contenant le Dockerfile:
services:
container_name:
build: ./service_dir
56
Les conteneurs : command et entrypoint
● On peut remplacer la commande et le point d’entrée par défaut avec les lignes
« command » et « entrypoint »:
service:
container_name:
..
command: bundle exec thin -p 3000
// ou
57
Les conteneurs : environnement et env_file
● On peut fournir des variables d’environnement aux conteneurs avec les lignes
« environnement » et « env_file »:
service:
container_name:
..
environnement:
ENV1: value1
ENV2: value2
// ou
env_files: .env
● On peut préciser les réseaux qu’un conteneur doit rejoindre avec la ligne
« networks » :
services:
web:
networks:
- front
app-server:
networks:
- front
- back
db:
networks:
- back
58
Les conteneurs : ports
● On peut monter des volumes et des « bind mounts » pour chaque conteneur
avec la ligne « volumes » :
services:
web:
volumes:
- datavolume:/var/lib/mysql (volume nommée)
- /var/lib/mysql (volume créé auto...)
- /opt/data:/var/lib/mysql (bind mount)
- ~/configs:/etc/configs/:ro (bind mount read-only)
● Pour des besoins avancés, les volumes peuvent être l’objet d’une section
propre.
59
Les conteneurs : restart
● unless-stopped : similaire à « always » sauf que le conteneur n’est pas redémarré lorsque le
démonDocker est redémarré.
Les réseaux
● Pour chaque réseau, le point essentiel est le type de réseau choisi, définissable
avec la ligne « driver », par exemple :
networks:
some-network:
driver: bridge
60
Déployer une application
multiconteneur.
● down : pour arrêter et supprimer les conteneurs et réseaux, images et volumes associés
61
Déployer une application multiconteneur (2/2)
62
Lier tous les conteneurs de l'application
● Pour rendre cela possible, le nom de chaque conteneur sera utilisé comme
nom d’hôte au sein de ce réseau et sera référencé auprès des autres.
● Pour lier un conteneur à un autre (dans le même réseau), il suffit généralement
de fournir le nom d’hôte du conteneur à consommer au conteneur qui doit le
consommer via une variable d’environnement.
wordpress: db:
image: wordpress image: mysql:5.7
restart: always restart: always
ports: environment:
- 8080:80 MYSQL_DATABASE: exampledb
environment: MYSQL_USER: exampleuser
WORDPRESS_DB_HOST: db MYSQL_PASSWORD: examplepass
... MYSQL_RANDOM_ROOT_PASSWORD: '1'
INTERFACES
D'ADMINISTRATION
63
Interfaces d'administration
64
L'API Docker et les W eb Services
● Le démon Docker expose une API qui est utilisée par le client Docker ainsi que
par les SDKs.
● Par défaut, le démon Docker Linux écoute uniquement sur le socket UNIX
« /var/run/docker.sock ».
● Pour exposer celui- ci en HTTP, il faut « overrider » son service :
sudo systemctl edit docker.service
65
Interfaces graphiques d'administration.
66
Interface graphiques d'administration
● Beaucoup d’autres outils en mode web sont proposés par des sociétés /
communautés tiers :
● Portainer : permet de gérer conteneurs Docker, images, volumes, réseaux, etc…
Distribué sous forme d’une image Docker. Gère Docker Engine et Docker Swarm.
● ...
67
Héberger son propre registre
● Pour publier ses images dans son propre registre privé, il y a plusieurs
possibilités :
● DockerHub : en payant, on peut héberger plus d’une image privée avec une
interface web permettant de gérer équipes et repository.
● Docker Registry : une application serveur sans état qui vous permet de stocker et
de distribuer vos images.
● Docker Trusted Registry : fait partie de Docker Entreprise, permet en plus : LDAP,
signature des images, scan de sécurité, …
● Des services web tiers, telque Gitlab, vous permettant de stocker et de distribuer
vos images.
● Pour mettre en œuvre son propre registre avec Docker Registry, il suffit de lancer
l’image Docker correspondante :
docker run -d -p 5000:5000 --name registry registry
● Pour construire une image, il faut préciser le registre pour le pousser ensuite :
docker build –t localhost:5000/myfirstimage
docker push localhost:5000/myfirstimage
68
Docker Registry (2/ 3)
● Par défaut, le Registry stocke ses données dans un volume Docker. Pour faire un
« bind mount », rajoutez par exemple le paramètre :
-v /mnt/registry:/var/lib/registry
● On crypte les communications avec le registre à l’aide d’un certificat TLS via les
paramètres :
-v "$(pwd)"/certs:/certs
-e REGISTRY_HTTP_ADDR=0.0.0.0:443
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key
69
ADMINISTRERDES
CONTENEURSEN PRODUCTION
70
Automatiser le démarrage
des conteneurs au boot.
● Pour lancer des conteneurs au boot, il faut tout d’abord s’assurer que le démon
Docker soit lancé au boot (enabled) :
systemctl list-unit-files | grep docker
● Si ce n’est pas le cas, activez-le :
systemctl enable docker
71
Gérer les ressources affectées
aux conteneurs
● Par défaut, un conteneur n’a pas de contraintes d’accès aux ressources et peut
donc utiliser autant de ressources que le noyau Linux lui permet.
● Il est possible de limiter :
● La mémoire utilisée
● Les cycles CPU utilisés
72
Out Of Memory Exception (1/2)
● S’assurant que les conteneurs ne s'exécutent que sur des hôtes disposant de
ressources suffisantes.
● Limitant la quantité de mémoire que les conteneurs peuvent utiliser.
● Soyez averti lors de la configuration du swap sur vos hôtes Docker :
Le swap est plus lent et moins performant que la mémoire, mais peut fournir
une mémoire tampon contre le manque de mémoire système.
73
Limiter la mémoire
● Les limites de mémoires sont exprimées sous forme d’entier, suivi d’une lettre:
b, k, m, g (octet, kilo- octet, mega- octet, giga- octet)
● L’option « -m » ou « --memory » permet de définir le maximum de mémoire
utilisable par un conteneur (mini : 4m).
● L’option « --memory-swap » permet de définir la taille maximum de swap.
Le chiffre est exprimé mémoire incluse. (non définie : x3, 0: pas de swap, -1:
swap illimité).
● L’option « --memory-reservation » permet de définir une limite logicielle
de mémoire plus faible que « --memory ». Cette dernière servant de filet de
sécurité dans ce cas.
● L’option « --kernel-memory » permet de définir le maximum de
« kernel memory » utilisable par un conteneur (mini : 4m).
Limiter le CPU
74
Gestion des logs des conteneurs
● Si vous ne voyez rien, il se peut que le processus écrive ses logs autre part
que dans STDIN et STDERR.
● Quelques options utiles :
● --since : pour afficher le contenu du log depuis une date donnée
75
Configurer les logs (1/ 2)
● Si le driver choisi à des options de configuration, vous pouvez les fournir via le
champ « log- opts » :
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3",
"labels": "production_status",
"env": "os,customer"
}
}
76
Les drivers de log
● local : les logs sont stockés en fichiers dans un format interne optimisé pour la performance.
● gelf : les logs sont envoyés à une destination GELF tel que Graylog ou Logstash
● awslogs : les logs sont envoyés vers Amazon CloudW atch Logs
● gcplogs : les logs sont envoyés vers Google Cloud Platform Logging
● splunk, etwlogs
77
Log driver « json- file »
● Le driver « journald » envoie les logs au démon « journald ». Les logs peuvent
être lus ensuite via les commandes « journalctl » ou « docker logs ».
● En plus du message, le driver ajoute des métadonnées au journal :
● CONTAINER_ID : l’id du conteneur tronqué à 12 caractères.
● CONTAINER_ID_FULL : l’id complet du conteneur.
● CONTAINER_NAME : le nom du conteneur.
78
Sauvegardes :
quels outils et quelle stratégie ?
79
Sauvegarder les changements d’un conteneur
80
Sauvegarder les données via les outils du fournisseurs de service
ORCHESTRATION ET
CLUSTÉRISATION
81
Orchestration et clustérisation
82
Présentation de Docker Machine (1/3)
● Docker Machine est un outil qui vous permet d'installer le démon Docker sur
des hôtes virtuels et de gérer les hôtes à l'aide de commandes « docker-
machine ».
● Vous pouvez l’utiliser pour créer des hôtes Docker sur votre ordinateur Mac ou
Windows, sur le réseau de votre entreprise, dans votre centre de données ou
sur des fournisseurs de cloud, tels qu'Azure, AW S , ...
● À l'aide des commandes « docker-machine », vous pouvez démarrer,
inspecter, arrêter et redémarrer un hôte géré, mettre à niveau le client et le
démon Docker et configurer un client Docker pour qu'il puisse communiquer
avec votre hôte.
● Docker Machine était le seul moyen d’exécuter Docker sur Mac ou Windows
avant la version 1.12
● Depuis la version 1.12 (au départ sous forme de beta), Docker Desktop pour
Mac et Docker Desktop pour Windows sont disponibles en tant qu'applications
natives et constituent un meilleur choix.
● Ces installeurs incluent le démon docker, le client Docker, Docker Compose,
Docker Machine, …
● Les machines virtuelles provisionnées par Docker Machine ont le démon
Docker pré-installé et peuvent donc être manipulés par Docker Machine.
● Exemple pour créer une machine dans VitualBox :
docker-machine create --driver virtualbox machine1
83
Présentation de Docker Machine (3/3)
● Une fois une machine lancée, les commandes Docker lancé sur l’hôte sont
exécutées sur cette dernière.
● La technologie Docker Machine est considéré obsolète par Docker lui-même et
même plus en avant « Docker Sw arm ».
L'orchestrateur Swarm :
nodes, services, secrets, configs
84
L'orchestrateur Swarm (1/3)
● Pour chaque service, on peut déclarer le nombre de tâches que l’on veut lancer
(c.a.d. le nombre de conteneur). Avec le « manager » du swarm, on peut
redimensionner le service (c.a.d. ajouter des tâches ou en supprimer).
● Le manager s’assure que l’état du swarm correspond à l’état que vous avez
demandé (c.a.d. si 2 taches d’un service crashent, le manager créera 2
nouvelles tâches).
● Les communications entre les services passent par un réseau « overlay »
(réseau virtuel regroupant plusieurs nœuds physiques). Le manager assigne
automatiquement aux conteneurs des adresses IP.
● Le manager assigne à chaque service un nom DNS unique et load-balance
entre les différents conteneurs (tâches) du service.
85
L'orchestrateur Swarm (3/3)
Swarm (1/2)
● Ces nœuds peuvent être des « managers » (qui gèrent les membres et la
délégation de services) ou des « workers » (qui exécutent les services).
● Un hôte Docker peut être un « manager », un « worker » ou les 2.
● Lorsque que l’on crée un service, on définit son état optimal (nombre de
répliques, ressources réseau et de stockage qui lui sont attachés, les ports
exposés à l’extérieur du sw arm).
● Le manager va s’efforcer de maintenir cet état optimal.
86
Swarm (2/2)
● L'un des principaux avantages par rapport aux conteneurs autonomes est que
vous pouvez modifier la configuration d'un service sans qu'il soit nécessaire de
redémarrer manuellement.
● Pour cela, Docker met à jour la configuration, arrête les tâches et en crée de
nouvelles avec la nouvelle configuration de service.
● De la même manière que l’on utilise Docker Compose pour déployer plusieurs
conteneurs sur un hôte Docker, on peut définir des piles applicatives (« service
stacks ») et les déployer dans un cluster swarm.
Nodes
87
Services & tasks
● Un service est une définition de tâches (« tasks ») devant s’exécuter sur les
nœuds.
● Lorsque vous créez un service, vous spécifiez quelle image utiliser et quelles
commandes exécuter dans les conteneurs.
● Les services « répliqués » sont distribués sous forme de tâches aux nœuds (le
nombre de tâches dépend de l’optimal que vous avez défini).
● Pour les services « globaux », une tâche du même service est exécutée sur
chaque nœud du cluster.
● Une tâche (« task ») est l’unité de travail atomique dans le cluster. Une tâche est
assignée à un nœud, elle ne peut pas être migrée sur un autre nœud.
Load balancing
88
Secret (>1.13)
● Un « secret » est un bloc de données, tel que mot de passe, clé privée SSH,
certificat SSL, etc. qui ne doit pas être transmis en clair sur le réseau ni stocké
en clair dans un Dockerfile ou dans le code de ses applications.
● Les secrets sont stockés et transmis cryptés dans un swarm.
● Un secret donné est accessible uniquement aux services auxquels un accès
explicite à celui-ci a été accordé et uniquement quand les tâches de ce service
sont en exécution.
● Une autre utilisation possible des « secrets » est de fournir une couche
d’abstraction entre une application et sa configuration.
● Dans ce cas, on peut publier sous le même nom de secret, une configuration
différente pour des swarms « dev », « recette », « production », … l’application
n’a ainsi qu’a connaitre le nom du « secret ».
89
Déploiement de services et stacks
dans un Swarm
Création du swarm
90
Ajouter des nœuds au swarm
● Pour savoir quels sont les nœuds sur lesquels un service tourne :
docker service ps <nom-service>
91
Déployer des stacks dans un swarm
● Les « stacks » sont des piles applicatives que l’on déploie dans un swarm.
● Celles-ci sont décrites dans un fichier « docker-compose.yml » avec pour chaque
service une sous- section « deploy » :
version: "3.7"
services:
db:
image: <image-name>
deploy:
mode: global|replicated
replicas: <nombre-taches>
...
● Les « stacks » sont déployées avec la commande :
docker stack deploy --compose-file docker-compose.yml <stack-name>
92
Reverse-proxy et load-balancer
● Chiffrement SSL: le proxy inverse peut être utilisé pour la mise en place de cryptage.
● Répartition de charge: le proxy inverse peut distribuer la charge d'un site unique sur plusieurs
serveurs Web applicatifs.
Traefik
● Fournit HTTPS à vos micro-services en utilisant Let's Encrypt (prise en charge des certificats génériques)
93
Traefik : Concepts (1/ 2)
● domain.com/ w eb service « w eb »
● Les « frontends» qui associentles « entrypoints» aux « backends » suivant diverses règles.
94
Traefik : mise en place simple
95