Vous êtes sur la page 1sur 11

Docker

Prise en main et mise en pratique sur une architecture micro-services

Introduction à Docker

1. Docker ou la virtualisation légère 13

1.1 L'approche par virtualisation 13


1.2 Docker pour optimiser l'usage des ressources 15
1.3 Positionnement de Docker par rapport à la virtualisation 17

2. Principe des conteneurs 19


2.1 Principe des conteneurs industriels 20
2.2 Docker et l'approche normalisée 21

3. Les fondements de Docker 22

3.1 Namespaces 22
3.2 Cgroups 24
3.3 LXC 24
3.4 Libcontainer 25
3.5 Système de fichiers en couches 26
3.5.1 Principe d'isolation des fichiers 26
3.5.2 Approche par virtualisation 27
3.5.3 Utilité des systèmes de fichiers en couches 28
3.5.4 Gestion des modifications de fichiers 30
3.5.5 Dernière couche en écriture 32
3.5.6 Technologies utilisées 33

4. Les plus de Docker 33

5. L’écosystème Docker 34

6. Architectures de services 36
6.1 Historique des architectures de services 36
6.1.1 Principes 36
6.1.2 Approche EAI 37
6.1.3 Approche SOA 37

www.editions-eni.fr © Editions ENI 1/11


Docker
Prise en main et mise en pratique sur une architecture micro-services

6.1.4 Microservices 37
6.1.5 Lien à l'urbanisation des SI 38
6.2 Architecture de microservices 38
6.2.1 Principe 38
6.2.2 Avantages 39
6.2.3 Inconvénients 42
6.3 Apport de Docker 43
6.4 Fil conducteur 44

Premiers pas

1. Installation de Docker 45
1.1 Utiliser des machines préconfigurées 46
1.2 Installation de Docker sur Linux 51
1.2.1 Prérequis 51
1.2.2 Installation par Aptitude 51
1.2.3 Installation par script 51
1.2.4 Installation depuis les binaires 52
1.3 Installation de Docker sous Windows ou Mac OS X 53
1.3.1 Un paradoxe 53
1.3.2 Boot2Docker 53
1.3.3 Docker et Hyper-V 58
1.3.4 Machine virtuelle 63
1.4 Utilisation de Docker avec Vagrant 63
1.4.1 Configuration 64
1.4.2 Mode de fonctionnement sous Linux 66
1.4.3 Mode de fonctionnement sous Windows 66
1.4.4 Pour aller plus loin avec Vagrant 67

2. Hello World, Docker 68

2.1 Démarrage d'un conteneur simple 68


2.2 Que s'est-il passé ? 69
2.2.1 Récupération de l'image 69
2.2.2 Anatomie de l'image obtenue 70

www.editions-eni.fr © Editions ENI 2/11


Docker
Prise en main et mise en pratique sur une architecture micro-services

2.2.3 Lancement du processus 73


2.2.4 Arrêt du conteneur 75

3. Manipulations de base 77
3.1 Trouver une image Docker préexistante 77
3.1.1 Le registre Docker 77
3.1.2 Images officielles 79
3.1.3 Autres images 80
3.1.4 Recherche par la ligne de commande 82
3.1.5 Précautions sur une image non officielle 83
3.2 Gestion du compte Docker Hub et dépôts privés 88
3.2.1 Création d'un compte 89
3.2.2 Association à un compte GitHub 89
3.2.3 Connexion au compte en ligne de commande 95

4. Un second conteneur 96
4.1 Récupération de l'image 96
4.2 Explication des tags 97
4.3 Premier lancement 99
4.4 Lancement en mode interactif 102
4.5 Persistance des modifications sous forme d'une image 105
4.6 Prise en main du client Docker 107
4.6.1 Ménage dans les conteneurs 108
4.6.2 Ménage dans les images 108
4.6.3 Suppression automatique à la sortie 109
4.6.4 Affectation d'un nom de conteneur 109
4.6.5 Modification du point d'entrée par défaut 110
4.6.6 Envoi de variables d'environnement 111
4.6.7 Modification du hostname 113
4.7 Manipulation des conteneurs 114
4.7.1 Lancement en mode bloquant 114
4.7.2 Lancement en arrière-plan 116
4.7.3 Gestion correcte du cycle de vie des conteneurs 121
4.7.4 Exposition de fichiers 124
4.7.5 Supervision des conteneurs 126

www.editions-eni.fr © Editions ENI 3/11


Docker
Prise en main et mise en pratique sur une architecture micro-services

5. Retours sur les premiers pas 127

Création de vos propres images

1. Création manuelle d'une nouvelle image 129

1.1 Installation d'un logiciel dans un conteneur 129


1.2 Persistance de l'image pour une utilisation future 132
1.3 Utilisation de l'image créée 133
1.4 Connexion depuis la machine hôte 135
1.5 Suite des opérations 137

2. Utilisation d’un Dockerfile 138

2.1 Intérêt des fichiers Dockerfile 138


2.2 Utilisation d'un fichier Dockerfile 140
2.3 Résultats de l'utilisation d'un Dockerfile complet 143
2.4 Anatomie d'un fichier Dockerfile 144
2.4.1 FROM 144
2.4.2 RUN 144
2.4.3 ENV 146
2.4.4 VOLUME 147
2.4.5 COPY 150
2.4.6 ENTRYPOINT 151
2.4.7 EXPOSE 154
2.4.8 CMD 154
2.5 Notre premier Dockerfile 155
2.5.1 Création et test du script 155
2.5.2 Création du Dockerfile 156
2.5.3 Génération de l'image 158
2.5.4 Lancement du conteneur 159
2.5.5 Arrêt et relance du conteneur 160
2.5.6 Gestion des paramètres 162
2.5.7 Reconstruction de l'image et cache 163
2.6 Commandes additionnelles 165

www.editions-eni.fr © Editions ENI 4/11


Docker
Prise en main et mise en pratique sur une architecture micro-services

2.6.1 Gestion des fichiers 165


2.6.2 Notion de contexte 166
2.6.3 Retours sur l'affectation du processus à démarrer 167
2.6.4 Remarque sur le format ligne de commande ou exécution 169
2.6.5 Commandes diverses 172

3. Partage et réutilisation simple des images 174


3.1 Envoi sur votre compte Docker Hub 174
3.2 Export et import sous forme de fichiers 177

4. Bonnes pratiques 178


4.1 Principe du cache sur les images 178
4.2 Principe du cache à la compilation 184
4.2.1 Retour sur les images intermédiaires 184
4.2.2 Anatomie d'une compilation d'image 186
4.2.3 Analyse d'une modification du Dockerfile 188
4.2.4 Gestion correcte des étiquettes 190
4.2.5 Invalidation du cache par modification de l'image de base 193
4.2.6 Invalidation du cache par modification du contexte 199
4.3 Conséquences sur l'écriture des Dockerfile 201
4.3.1 Le problème sur les opérations non idempotentes 201
4.3.2 Contournement du problème de cache 204
4.3.3 Effets bénéfiques sur le nombre et la taille des images 207
4.4 Conséquences sur le choix des images de base 209
4.4.1 La bonne image de base 209
4.4.2 Votre propre image de base 211
4.5 Arborescence recommandée 213
4.5.1 Avantages d'une arborescence type 213
4.5.2 Intégration des fichiers 215
4.5.3 Limitation du contexte 217
4.6 La question du processus unique 218
4.6.1 Principe général 218
4.6.2 Exception au principe général avec Supervisor 218
4.6.3 Critique 220
4.6.4 Approche intermédiaire 220

www.editions-eni.fr © Editions ENI 5/11


Docker
Prise en main et mise en pratique sur une architecture micro-services

5. Pour aller plus loin 221

Installation d'un registre privé

1. Premiers pas pour un registre privé 223

1.1 Avertissement sur l'ancien registre 223


1.2 Image Docker en local 224
1.3 Pointer sur un registre donné 226
1.4 Registre sur le réseau local 227
1.4.1 Scénario et préparation des machines 228
1.4.2 Démarrage du registre 230
1.4.3 Dépôt de l'image depuis une autre machine 231
1.4.4 Utilisation de l'image depuis une troisième machine 233
1.4.5 Suppression de l'image sur la machine source 236
1.4.6 En cas de problème avec boot2docker 238

2. Un registre plus professionnel 239


2.1 Gestion de la persistance 239
2.1.1 Gestion locale par volume 239
2.1.2 Remarque sur SELinux 241
2.1.3 Un stockage plus sécurisé 242
2.1.4 Remarque sur la protection de la clé 249
2.2 Sécurisation du registre 251
2.2.1 Préparation des clés pour le canal crypté 251
2.2.2 Mise en place du frontal Nginx 254
2.2.3 Accès par le client Docker 260
2.2.4 Outils additionnels de diagnostic 262
2.2.5 Génération du fichier des utilisateurs autorisés 265
2.2.6 Ajout de l'authentification dans Nginx 266
2.2.7 Correction sur les headers 268
2.2.8 Gestion de la connexion 269
2.3 Un vrai registre en production 270

www.editions-eni.fr © Editions ENI 6/11


Docker
Prise en main et mise en pratique sur une architecture micro-services

3. Approches complémentaires 272


3.1 Utilisation d'un service cloud déjà préparé 272
3.2 L'API du registre 273
3.3 Mise en place d'un miroir 273
3.4 Mise en place d'un cache pour les paquetages 277
3.4.1 Contournement possible 277
3.4.2 Mise en œuvre d'un cache de paquetages 279

Mise en œuvre d’une architecture logicielle

1. Présentation de l'application exemple 283

1.1 Architecture 283


1.2 Installation 285
1.3 Utilisation 288
1.4 Utilité 290
1.5 Principes à l'œuvre 291
1.5.1 Un mot sur les architectures de microservices 291
1.5.2 Lien avec la programmation SOLID 291

2. Création de l'architecture exemple 293

2.1 Principes de construction 293


2.2 Détails de l'image aspnetbase 294
2.2.1 Utilité 294
2.2.2 Création dans Docker 295
2.3 Détails du service optimizer 297
2.3.1 Fonctionnement 298
2.3.2 Intégration dans Docker 302
2.3.3 Tests 304
2.3.4 Remarques 306
2.4 Détails du service calculator 307
2.4.1 Fonctionnement 307
2.4.2 Intégration dans Docker 309
2.4.3 Tests 311

www.editions-eni.fr © Editions ENI 7/11


Docker
Prise en main et mise en pratique sur une architecture micro-services

2.5 Mise en place de liens entre conteneurs 313


2.6 Détails du service reporting 318
2.6.1 Fonctionnement 318
2.6.2 Dockerisation 320
2.6.3 Tests 321
2.7 Détails du service notifier 323
2.7.1 Fonctionnement 323
2.7.2 Dockerisation 325
2.7.3 Tests 326
2.8 Détails du service de persistance 328
2.9 Détails de l'image nodebase 329
2.10 Détails du service portal 331
2.10.1 Fonctionnement 331
2.10.2 Dockerisation 334
2.10.3 Tests 335
2.11 État atteint 336

3. Redéployer automatiquement avec Docker Compose 337


3.1 Principe de Docker Compose 337
3.2 Écriture du fichier docker-compose.yml 339
3.3 Mise en œuvre 340
3.3.1 Préparation 340
3.3.2 Lancement des conteneurs 341
3.3.3 Gestion des conteneurs 343
3.4 Parallélisation des traitements 344
3.5 Limites 347

4. Exploitation d'une infrastructure Docker 347

4.1 Le réseau dans Docker 347


4.1.1 Mode de fonctionnement standard (bridge) 348
4.1.2 Modes de fonctionnement alternatifs 350
4.1.3 Support des liens entre conteneurs 353
4.1.4 Autres options 355
4.1.5 Limites de la couche réseau existante 355
4.2 Les volumes Docker 358

www.editions-eni.fr © Editions ENI 8/11


Docker
Prise en main et mise en pratique sur une architecture micro-services

4.2.1 Le problème de la persistance 358


4.2.2 Les volumes comme solution simple 358
4.2.3 Lien direct sur un répertoire local 361
4.2.4 Partage de volumes 362
4.2.5 Gestion des volumes orphelins 363
4.2.6 Sophistication de l'approche 364
4.2.7 Application à la gestion des logs 364

Déploiement dans un cluster

1. Description globale de l'approche 367


1.1 Objectif 367
1.2 État des lieux 368
1.3 Avertissement préalable sur notre choix 369
1.4 Déroulement de l'exemple 370

2. Montage d'un cluster CoreOS 370

2.1 Choix du cloud cible 370


2.2 Installation des outils 371
2.2.1 Azure Command Line Interface 371
2.2.2 Connexion à Azure 371
2.2.3 Préparation des certificats pour l'accès SSH 372
2.3 Création du fichier de configuration de CoreOS 372
2.4 Création du service 374
2.5 Provisionnement du cluster 374
2.6 Manipulation locale 376
2.6.1 Connexion par PuTTY 376
2.6.2 Vérification du cluster 378
2.7 Pilotage du cluster depuis une machine externe 379
2.7.1 Installation de fleetctl 380
2.7.2 Gestion de la sécurité 380
2.7.3 Découverte du cluster 381
2.8 Script de suppression du cluster 381

www.editions-eni.fr © Editions ENI 9/11


Docker
Prise en main et mise en pratique sur une architecture micro-services

3. Déploiement global des services 382


3.1 Approche 382
3.2 Installation de Docker Compose 383
3.3 Publication des services 383
3.4 Reprise du fichier docker 385
3.5 Mise en œuvre 386

4. Déploiement atomique des services 390

4.1 Approche 390


4.2 Les outils 392
4.3 Gestion des fichiers d’unités 393
4.3.1 Cas du service de calcul 393
4.3.2 Écriture des autres fichiers de service 396
4.4 Gestion des unités 397
4.4.1 Lancement des services simples 397
4.4.2 Vérification du fonctionnement 399
4.4.3 Modification du service de base de données 401
4.4.4 Vérification du fonctionnement du portail 404
4.4.5 Lancement des services de calcul 405
4.4.6 Vérification de l'ensemble 406
4.5 Perspectives 409
4.5.1 Gestion d'un serveur maître 409
4.5.2 Scripting de démarrage du cluster 411
4.5.3 Remarque sur la gestion de la charge 412

5. Approches alternatives 413

5.1 Docker Swarm 413


5.2 Docker Machines 414

Encore plus loin avec Docker

1. Docker dans votre usine logicielle 415


1.1 Docker à tous les étages 415

www.editions-eni.fr © Editions ENI 10/11


Docker
Prise en main et mise en pratique sur une architecture micro-services

1.2 Produire des images en sortie de build 417


1.2.1 Positionnement 417
1.2.2 Utilité 417
1.2.3 Conseils de mise en place 418
1.3 Utiliser des conteneurs pour l’usine logicielle 419
1.3.1 Positionnement 419
1.3.2 Utilité 419
1.3.3 Conseils de mise en place 420
1.4 Utiliser des conteneurs pour les tests 421
1.4.1 Positionnement 421
1.4.2 Utilité 421
1.4.3 Conseils de mise en place 422
1.4.4 Variante associée 422
1.5 Retour sur le registre 424
1.6 Perspectives 425

2. Avant de partir en production avec Docker 426

2.1 Sécurité 427


2.2 Restriction sur les ressources 427
2.3 Supervision 428

3. Docker et Windows 429

3.1 Le client Docker sous Windows 429


3.2 Docker sur Azure 431
3.3 Docker sous Windows Server 432

4. Conclusion 433

Index 435

www.editions-eni.fr © Editions ENI 11/11