forked from thc-tools/formation-docker
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
1236 lines (957 loc) · 36.1 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>Docker & docker compose formation</title>
<link rel="stylesheet" href="css/reveal.css">
<link rel="stylesheet" href="css/theme/black.css">
<!-- Theme used for syntax highlighting of code -->
<link rel="stylesheet" href="lib/css/zenburn.css">
<!-- Printing and PDF exports -->
<script>
var link = document.createElement( 'link' );
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = window.location.search.match( /print-pdf/gi ) ? 'css/print/pdf.css' : 'css/print/paper.css';
document.getElementsByTagName( 'head' )[0].appendChild( link );
</script>
<style>
.reveal section img {
background-color: white;
}
.reveal section img[alt] {
/* height: 50%; */
max-width: 70%;
margin: 5px 0;
/* max-height: 80%; */
}
.reveal section[data-markdown] p, .reveal section[data-markdown] ul {
font-size:28px;
}
.reveal section[data-markdown] h4 {
font-size:36px;
}
.reveal section[data-markdown] code {
font-size:18px;
}
.reveal .slides section > section {
padding-top: 50px;
}
</style>
</head>
<body>
<div class="reveal">
<div class="slides">
<section data-markdown>
<textarea data-template>
# Docker & docker compose
### Disclaimer: introduction
</textarea>
</section>
<section>
<h3>Table des matières</h3>
<section data-markdown>
<textarea data-template>
- #### Notion sur Docker & installation
- #### Commandes
- #### DockerFile et principes
- #### Surprise (c'est un exercice)
- #### Conteneur registry
- #### Nettoyage
</textarea>
</section>
</section>
<section>
<h3>Table des matières</h3>
<section data-markdown>
<textarea data-template>
- #### Docker-coooooompose
- #### Son installation
- #### Quid de Dreamquark
- #### Another surprise (c'est toujours un exercice)
- #### Passage en production
</textarea>
</section>
</section>
<section>
<h3>Présentation Docker </h3>
<section data-markdown>
<textarea data-template>
##### Pourquoi utiliser Docker & les conteneurs
* C'est quoi un conteneur ?
* Y'a t-il que Docker ?
* Pourquoi pas utiliser des machines virtuelles ?
* Pourquoi c'est plus léger ?
* Viable en production & en développement ?
* Qu'est ce qu'on y gagne ?
</textarea>
</section>
<section data-markdown>
<textarea data-template>
##### Qu'est ce que les conteneurs ?
* Environnement de système d'exploitation
* Fourni une portabilité du logiciel
* Facilité de partager et construire une application
* N'installe QUE le nécessaire => Léger & plus efficiente (moins de resources)
* Il existe un conteneur pour TOUT
</textarea>
</section>
<section data-markdown>
<textarea data-template>
##### Pourquoi les utilise-t-on ?
* Normalisation entre dev/prod
* "Ca marche sur mon pc"
* Scalable
* Isolement
* Plus facile à manager que des VMs
* Evite d'installer tout sur sa machine
</textarea>
</section>
<section data-markdown>
<textarea data-template>
##### Les alternatives
* VMs
* RKT
</textarea>
</section>
<section data-markdown>
<textarea data-template>
##### Installation Linux
```
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
sudo groupadd docker
sudo usermod -aG docker $USER
```
* Se mettre dans le groupe docker (afin de pas faire tout faire en sudo)
* https://docs.docker.com/engine/install/ubuntu/#install-docker-engine
</textarea>
</section>
<section data-markdown>
<textarea data-template>
##### Installation MacOS
* Software a installé directement
* https://docs.docker.com/docker-for-mac/install/
</textarea>
</section>
</section>
<section>
<h3>Principales commandes Docker</h3>
<section data-markdown>
<textarea data-template>
Nous allons décrire ici les principales commandes Docker qui sont utiles pour démarrer, stopper, détruire, exécuter des commandes et gérer ces images
</textarea>
</section>
<section data-markdown>
<textarea data-template>
#### docker build [OPTIONS] PATH | URL | -
* Permet de construire une image via docker.
* Par exemple si j'ai une image docker dans le dossier courant permettant d'écouter une magnifique musique:
```shell
docker build -t pat&qerac/theshow .
```
</textarea>
</section>
<section data-markdown>
<textarea data-template>
#### docker push [OPTIONS] NAME[:TAG]
* Permet de publier une image sur le registry docker.
* Ici si je veux publier mon image précédemment construite:
```shell
docker push pat&qerac/theshow:latest
```
</textarea>
</section>
<section data-markdown>
<textarea data-template>
#### docker search [OPTIONS] TERM
* Permet de rechercher une image dans le registry docker, par exemple si je veux la liste des images disponibles pour alpine Linux.
```shell
docker search alpine
```
</textarea>
</section>
<section data-markdown>
<textarea data-template>
#### docker pull [OPTIONS] NAME[:TAG|@DIGEST]
* Permet de récupérer une image docker du registry en local, si je veux récupérer l'image docker d'alpine Linux version 3.12.0
```shell
docker pull alpine:3.12.0
```
</textarea>
</section>
<section data-markdown>
<textarea data-template>
#### docker run [OPTIONS] IMAGE [COMMAND]
* Permet de lancer un conteneur à partir d'une image déjà existante.
* Par exemple si je veux un conteneur avec le nom Linux exécutant alpine linux 3.12.0
```shell
docker run --name linux alpine:3.12.0
```
</textarea>
</section>
<section data-markdown>
<textarea data-template>
#### docker ps [OPTIONS]
* Permet d'afficher l'ensemble des conteneurs qui tournent sur la machine hôte
```shell
docker ps
```
</textarea>
</section>
<section data-markdown>
<textarea data-template>
#### docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
* Permet d'exécuter une commande dans un conteneur existant
* Par exemple si je veux lancer la commande `ls` dans mon conteneur Linux;
```shell
docker run linux ls -a
```
</textarea>
</section>
<section data-markdown>
<textarea data-template>
#### docker attach [OPTIONS] CONTAINER
* Permet d'attacher le terminal à un conteneur existant
* Par exemple je veux m'attacher au terminal du conteneur Linux;
```shell
docker attach linux
```
</textarea>
</section>
<section data-markdown>
<textarea data-template>
#### docker logs [OPTIONS] CONTAINER
* Les conteneurs sont souvent lancés pour exécuter une commande/tache spécifique
* `logs` est utile pour consulter les logs du service exécute dans le conteneur
* Par exemple je veux visualiser les logs du conteneur Linux:
```shell
docker logs linux
```
</textarea>
</section>
<section data-markdown>
<textarea data-template>
#### docker kill [OPTIONS] CONTAINER [CONTAINER...]
* Permet de kill le processus lancer dans dans le conteneur par exemple si je veux kill le conteneur nommé `linux`;
```shell
docker kill linux
```
</textarea>
</section>
<section data-markdown>
<textarea data-template>
#### docker stop [OPTIONS] CONTAINER [CONTAINER...]
* Sert à stopper l'exécution d'un conteneur mais ne le détruit pas (ni le conteur et ni son contenu)
* Ici, si je veux stopper mon conteneur linux;
```shell
docker stop linux
```
</textarea>
</section>
<section data-markdown>
<textarea data-template>
#### docker rm [OPTIONS] CONTAINER [CONTAINER...]
* Sert à détruire le conteneur, suppression du conteneur et de son contenu (hors volumes)
* Ici, si je veux détruire mon conteneur linux;
```shell
docker rm linux
```
</textarea>
</section>
</section>
<section><h3>Docker Image vs Docker container</h3>
<section data-markdown>
<textarea data-template>
* Une image docker est un élément qui sert à créer un snapshot d'un système
* C'est la construction de l'image décrit dans le DockerFile
* Permet des créer des conteneurs avec tous les éléments utiles à l'exécution du processus
</textarea>
</section>
<section data-markdown>
<textarea data-template>
|Image |Container |
|:--|:--|
|System snapshot |Running system |
|Static |Dynamic |
|Like a class |Like a class instance (new Class()) |
</textarea>
</section>
</section>
</section>
<section><h3>DockerFile</h3>
<section data-markdown>
<textarea data-template>
* Création de l'image au moment du docker build
* Principe des layers (si identique, utilise celui en cache)
* Important de bien ordonnnancer les commandes du DOCKERFILE
* Commandes utilisées dans nos DockerFile
* `.dockerignore` du dossier passé dans le docker build => ex: .git
</textarea>
</section>
<section data-markdown>
<textarea data-template>
* **FROM**: image utilisée comme base (comme ubuntu, debian)
* **ENV**: ajout d'une variable d'environnement
* **RUN**: commande exécutée dans le conteneur (à l'instant t)
```
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
ENV <key> <value>
RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'
RUN /bin/bash -c 'source $HOME/.bashrc; \
echo $HOME'
```
</textarea>
</section>
<section data-markdown>
<textarea data-template>
* **WORKDIR**: les prochaines commandes RUN/CMD/ENTRYPOINT/COPY/ADD seront exécutées dans ce dossier
* **USER**: set le username/UID qui utilise les commandes RUN/CMD/ENTRYPOINT
* **COPY**: copie ou télécharge des fichiers dans l'image
```
WORKDIR /path/to/workdir
USER <user>[:<group>]
COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
```
</textarea>
</section>
<section data-markdown>
<textarea data-template>
* **ADD**: copie ou télécharge des fichiers dans l'image mais peut ajouter une commande (comme décompresser un tar par ex)
* **EXPOSE**: expose un port du conteneur & écoute spécifiquement ce port (pour publier le port docker run -p)
* **VOLUME**: (docker run -v) crée un point de montage dans le conteneur & dans le file system du host (persistence de la donnée)
```
ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
EXPOSE <port> [<port>/<protocol>...]
VOLUME ["/data"]
```
</textarea>
</section>
<section data-markdown>
<textarea data-template>
* **ENTRYPOINT**: spécifie un binaire ou un script qui sera exécuté au runtime (démarrage) du conteneur (un exécutable ex: nginx)
* **CMD**: Pour spécifier une commande à exécuter seulement lors du lancement du conteneur
* Si on surcharge la commande de run, cela va directement écraser la commande (en laissant l'entrypoint), peut servir pour passer des arguments
```
ENTRYPOINT Utilisé si on veut des images à usage unique (genre serveur web)
ENTRYPOINT ["executable", "param1", "param2"]
CMD ["executable","param1","param2"]
CMD command param1 param2
```
</textarea>
</section>
<section data-markdown>
<textarea data-template>
##### Microbadger
* [Microbadger](https://microbadger.com/)
* Analyse les hashs de layer des images
![MicroBadger image python Circleci](./img/microbadger.png)
* Après avoir build les images, pour les partager on peut les "pousser" dans conteneur registry
</textarea>
</section>
</section>
<section><h3>Exercice DockerFile</h3>
<section data-markdown>
<textarea data-template>
<h4>TP: construire une image</h3>
* Nous allons dans ce premier exercice construire une image docker pour une API nodejs (un peu de patience pour les ds, nous viendrons à python aussi). Merci de cloner le repo avec l'api:
```shell
git clone https://github.com/dreamquark-public/docker-rick-and-morty-api
```
</textarea>
</section>
<section data-markdown>
<textarea data-template>
#### Docker image sans volume
```
FROM node:12.18.1-alpine
LABEL Author="Antoine AMARA"
# Global install yarn package manager and Git (git can be usefull for jest tests framework)
RUN apk update && apk add yarn git sqlite make
# Just a little package to easily add a free licence to a project
RUN npm install --global generate generate-license svgo
WORKDIR /workspace
COPY . /workspace/
EXPOSE 8080
ENV port=8080
RUN yarn install
CMD [ "yarn", "serve:dev" ]
```
</textarea>
</section>
<section>
<section data-markdown>
<textarea data-template>
#### Docker image sans volume
* Construction de l'image `rick-morty/nodejs` image:
```
docker build -t rick-morty/nodejs .
```
</textarea>
</section>
</section>
<section data-markdown>
* Création d'un conteneur `riick`:
```shell
docker run -d -p 8080:8080 --name riick rick-morty/nodejs
```
* On peut accéder à l'environnant de développement GraphQL a l'adresse [localhost:8080/ide](http://localhost:8080/ide)
</section>
<section data-markdown>
* Si un changement est effectué dans le dockerfile, l'image doit être reconstruit pour que le prochain conteneur avec cette image ait les bonnes configurations
* Changeons la configuration du port réseaux:
<pre><code data-trim data-noescape>
...other command
EXPOSE 9000
ENV port=9000
...other command
</code></pre>
* Reconstruisons l'image `rick-morty/nodejs`:
```shell
docker build -t rick-morty/nodejs .
```
</section>
<section data-markdown>
* Nous allons détruire le conteneur riick et le reconstruire avec les nouvelles configurations.
```shell
docker rm riick
docker run -d -p 9000:9000 --name riick rick-morty/nodejs
```
* Nous pouvons vérifier le fonctionnement en accédant à l'ide GraphQL à l'adresse [localhost:9000/ide](http://localhost:9000/ide)
</section>
<section data-markdown>
<h4>Docker image avec un volume</h4>
<pre><code data-trim data-noescape>
FROM node:12.18.1-alpine
LABEL Author="Antoine AMARA"
# Global install yarn package manager and Git (git can be usefull for jest tests framework)
RUN apk update && apk add yarn git sqlite make
# Just a little package to easily add a free licence to a project
RUN npm install --global generate generate-license svgo
WORKDIR /workspace
VOLUME /workspace/
EXPOSE 8080
ENV port=8080
RUN yarn install
CMD [ "yarn", "serve:dev" ]
</code></pre>
* Construction de l'image `rick-morty/nodejs`:
```shell
docker build -t rick-morty/nodejs .
```
</section>
<section data-markdown>
* Maintenant nous passons le code sous la forme d'un volume partagé lors du démarrage du conteneur (et donc plus besoin de reconstruire l'image si on change de dossier et/ou de code):
```shell
docker run -d -p 9000:9000 -v ./ --name riick rick-morty/nodejs
```
</section>
</section>
<section><h3>Cleaning the system</h3>
<section data-markdown>
<textarea data-template>
* Docker utilise plusieurs ressources pour construire des images et des conteneurs ce qui peut finir par encombrer le système hôte
* Nous allons voir quelques commandes pour cleaner le système des artefacts inutiles et/ou inutilisés
</textarea>
</section>
<section data-markdown>
<textarea data-template>
* Supprimer toutes les images docker:
```shell
docker rmi -f $(docker images)
```
</textarea>
</section>
<section data-markdown>
<textarea data-template>
* Supprimer les images temporaires et inutilisées:
```shell
docker rm -f $(docker ps -aq)
```
</textarea>
</section>
<section data-markdown>
<textarea data-template>
* Clean les configurations systèmes du démon docker:
```shell
docker system prune
```
</textarea>
</section>
<section data-markdown>
<textarea data-template>
* Suppression des networks non utilisés:
```shell
docker networks prune
```
</textarea>
</section>
<section data-markdown>
<textarea data-template>
#### LazyDocker
![lazydocker exemple avec Brain](./img/lazydocker.png)
</textarea>
</section>
<section data-markdown>
<textarea data-template>
Lazydocker est un GUI permettant de visualiser les conteneurs docker lancer dans votre système.
* Permet aussi de lancer des commandes sur chaque entité (conteneurs, images, volumes, networks) avec la touche `x` vous aurez chaque action que vous pouvez effectuer sur un élement
* Permet de lancer des taches en batch sur chaque entité (conteneurs, images, volumes, networks) avec la touche `b` vous aurez accès à toutes les possibilités, y compris celle de nettoyage
</textarea>
</section>
<section>
<div style="display:flex;justify-content:center; align-items:center;"><img src="./img/github.svg" /> <a href="https://github.com/jesseduffield/lazydocker">LazyDocker on Github</a></div>
</section>
</section>
<section><h3>Conteneur registry</h3>
<section data-markdown>
<textarea data-template>
##### Comment partager les images que l'on vient de créer ?
* Le conteneur registry => DQ utilise Docker Hub
* Il en existe d'autres: celui de GCP/Azure/AWS par exemple
* Outil centralisé afin de gérer les versions d'images, les droits d'accès, analyse des images, etc
* Branché à la CI (CircleCI dans notre cas)
* Docker push => envoie le build de l'image avec le tag DOCKER_TAG seléctionné
```
<container_regsitry>/<image_name>:<image_tag>
```
- *dreamquark* cela veut dire qu'on l'envoi dans le conteneur registry dreamquark
* Quand on build on crée une image unique avec un sha256
</textarea>
</section>
<section data-markdown>
<textarea data-template>
##### Différence entre image de dev et de prod
* Permet déjà d'avoir un environnement iso-prod
* Très peu de différence
* En developpement, on monte en volume le code source afin de faire les changements realtime
* On copie les fichiers/dossiers en prod
</textarea>
</section>
<section data-markdown>
<textarea data-template>
##### Docker save/export/restore/cp
* docker save ou export sensiblement identique
```
docker save [OPTIONS] IMAGE [IMAGE...]
docker export [OPTIONS] CONTAINER
```
* Save pour une image, export pour un container
* docker load pour une image save => permet de l'ajouter à son registry interne comme un pull
* docker import à la suite d'un export => permet de l'ajouter à son registry interne comme un pull
</textarea>
</section>
</section>
<section><h3>Docker-compose</h3>
<section data-markdown>
<textarea data-template>
##### Pourquoi docker-compose
* Comment "faire parler" les conteneurs entre eux (réseau)
* Comment configurer en runtime plusieurs conteneurs à la fois
</textarea>
</section>
<section data-markdown>
<textarea data-template>
##### Docker-compose
* Outil maintenu par docker : [DockerCompose](https://github.com/docker/compose)
* En une seule commande on peut lancer plusieurs conteneurs (appelé service)
* Description simple du réseau, des volumes (par un enchainement de commande docker) entre autre
* Tout ce qu'on peut faire avec docker-compose peut être fait en commande docker
* Décrit en format YAML
* Un seul fichier mais peut être surchargé
</textarea>
</section>
<section data-markdown>
<textarea data-template>
##### Docker-compose
* On peut décrire donc :
- Image utilisé
- Les variables d'environnement
- Les volumes
- Les ports à exposer du conteneur
- Commande de démarrage (ou l'entrypoint)
- Le réseau utilisé
- etc..
* Peut avoir une notion de dépendance entre les conteneurs (DB démarre avant le serveur web)
* Point d'appui pour la production (différent fichier de configuration)
* Prémice de l'orchestration et pousse à réfléchir sur le déploiment de l'application
</textarea>
</section>
<section data-markdown>
<textarea data-template>
##### Docker-compose installation
```
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
```
</textarea>
</section>
</section>
<section>
<h3>Les Principales commandes de Docker Compose</h3>
<section data-markdown>
<textarea data-template>
Nous allons décrire ici les principales commande de docker-compose, qui sont utiles pour démarrer, stopper, détruire, exécuter des commandes et gérer ces images
</textarea>
</section>
<section data-markdown>
<textarea data-template>
#### docker-compose build [OPTIONS]
* Permet de construire les images docker en local des différents services d'un fichier docker compose
* Cette commande est utile si les images (Dockerfile) utilisentsont construites directement par le fichier docker compose
```shell
docker-compose build
```
</textarea>
</section>
<section data-markdown>
<textarea data-template>
#### docker-compose pull [OPTIONS]
* Permet de récupérer les images docker d'un registry externe pour les télécharger en local
* Si j'utilise pour un a plusieurs services des images du registry, cette commande permet de les récupérer en local pour pouvoir les utiliser
```shell
docker-compose pull
```
</textarea>
</section>
<section data-markdown>
<textarea data-template>
#### docker-compose up [OPTIONS]
* Permet de construire l'ensemble des conteneurs/services, des volumes et des networks déclarés dans le fichier docker-compose.yaml
* Permet de tout mettre en place, les éléments et leurs configurations
* S'il y a des DockerFiles à construire, ce sera fait automatiquement à la première exécution (après il faudra faire une docker compose build)
* S'il y a des images à récupérer, ce sera fait automatiquement à la première exécution (après il faudra faire une docker compose pull)
* Le '-d' permet de ne pas être accroché aux logs des conteneurs au démarrage (detach)
```shell
docker-compose up -d
```
</textarea>
</section>
<section data-markdown>
<textarea data-template>
#### docker-compose ps [OPTIONS]
* Permet d'afficher l'ensemble des services démarrés, leur état et leur configuration network.
```shell
docker-compose ps
```
</textarea>
</section>
<section data-markdown>
<textarea data-template>
#### docker-compose exec [OPTIONS] SERVICE COMMAND [ARG...]
* Permet d'exécuter une commande dans un conteneur/service existant.
* Par exemple si je veux lancer la commande `ls` dans un service appelle linux;
```shell
docker-compose exec linux ls -a
```
</textarea>
</section>
<section data-markdown>
<textarea data-template>
#### docker-compose attach [OPTIONS] CONTAINER
* Permet d'attacher le terminal à un conteneur/service existant.
* Par exemple je peux vouloir attacher mon terminal au service linux;
```shell
docker-compose attach linux
```
</textarea>
</section>
<section data-markdown>
<textarea data-template>
#### docker-compose logs [OPTIONS] SERVICE [SERVICE...]
* Permet d'afficher les logs d'un à plusieurs services.
* Par exemple je peux vouloir visualiser les logs du conteneur linux et windows;
```shell
docker-compose logs linux windows
```
</textarea>
</section>
<section data-markdown>
<textarea data-template>
#### docker-compose stop [OPTIONS] SERVICE [SERVICE...]
* Sert à stopper l'exécution d'un à plusieurs services mais ne le/les détruit pas (ni le conteneur et ni son contenu)
* Ici si je veux stopper mon conteneur linux:
```shell
docker-compose stop linux
```
</textarea>
</section>
<section data-markdown>
<textarea data-template>
#### docker-compose rm [OPTIONS]
* Sert à détruire un à plusieurs services, supression du conteneur et de son contenu (hors volumes)
* Ici si je veux détruire mon conteneur linux:
```shell
docker-compose rm linux
```
</textarea>
</section>
</section>
<section><h3>Démystification</h3>
<section data-markdown>
<textarea data-template>
##### Que se passe-t-il à Dreamquark?
* les Makefiles (dans brain-docker ou autre)
- "raccourci" pour utiliser les commandes présentés précédemment
- rien de plus
- commande make pour faciliter le travail de chacun
* Exemple avec le vendor:
```
vendor: ## install repositories and vendors
$(ENV) $(DKC) $(DKC_CFG) run --rm engine-async make vendor-dev
$(ENV) $(DKC) $(DKC_CFG) run --rm api make vendor
$(ENV) $(DKC) $(DKC_CFG) run --rm brain-app make vendor
.PHONY: vendor
```
- Simple exécution séquentielle de commande docker compose
</textarea>
</section>
<section data-markdown>
<textarea data-template>
##### Que se passe-t-il à Dreamquark?
* Si changement de variable d'environnement (nom de l'image ou autre) => make up
* Ajout d'un network ou d'un volume => make
* Le docker-compose up ne recrée que les services où il y a des changements
* Make build => si on utilise des images locales (voué à disparaitre) => quand on change le dockerfile surtout
* Make build => sachant qu'on monte en volume le code source
* Make vendor => lorsqu'il y a un changement dans les paquets (node_modules ou poetry)
</textarea>
</section>
</section>
<section>
<section data-markdown>
<textarea data-template>
##### creation d'une infrastructure avec docker-compose
* Nous allons créer un fichier docker compose permettant de démarrer une application avec une API, une interface web et une base de données
</textarea>
</section>
<section data-markdown>
<textarea data-template>
##### création des dossiers
```shell
mkdir docker-formation-compose
cd docker-formation-compose
mkdir -p src
git clone git@github.com:dreamquark-public/docker-rick-and-morty-app.git src/front
git clone git@github.com:dreamquark-public/docker-rick-and-morty-api.git src/api
touch docker-compose.yml
```
</textarea>
</section>
<section data-markdown>
<textarea data-template>
##### creation du service frontend
<pre><code data-trim data-noescape>
version: "3"
services:
front:
image: rick-morty/nodejs
ports:
- "3000:3000"
volumes:
- ./src/front:/workspace/front
environment:
NODE_ENV: development
working_dir: /workspace/front
command: yarn start
</code></pre>
</textarea>
</section>
<section data-markdown>
<textarea data-template>
##### creation du service api
<pre><code data-trim data-noescape>
api:
image: rick-morty/nodejs
networks:
- monreseau
ports:
- "8080:8080"
- "9042:9042"