Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
technique:tech_team:tuto_docker [2021/10/17 02:56] qduchemitechnique:tech_team:tuto_docker [2021/11/15 23:57] (Version actuelle) qduchemi
Ligne 24: Ligne 24:
 ``` ```
  
-<bootnote>On peut préciser une version de l'image en la suffixant avec `:`. Exemples : `debian:strech`, `debian:buster`... C'est même une Bonne Pratique™, mais on va pas aller dans les détails sur cette page. :-p</bootnote>+<bootnote>On peut préciser une version de l'image en la suffixant avec `:`. Exemples : `debian:strech`, `debian:buster`... C'est même une Bonne Pratique™, mais on va pas partir dans les détails. :-P</bootnote>
  
 Ensuite, on va utiliser l'instruction `RUN` pour indiquer les commandes qu'on veut lancer. C'est ici qu'il faut se demander : Ensuite, on va utiliser l'instruction `RUN` pour indiquer les commandes qu'on veut lancer. C'est ici qu'il faut se demander :
Ligne 141: Ligne 141:
  
 où tu remplaces `quentin` par le nom de ton conteneur. où tu remplaces `quentin` par le nom de ton conteneur.
 +
 +Aussi, je n'aurais pas dû utiliser le port 80 de l'hôte car il est souvent utilisé par un autre service, appelé Traefik. Tu peux l'éteindre en faisant :
 +
 +```
 +docker stop traefik
 +```
 </bootnote> </bootnote>
  
Ligne 214: Ligne 220:
  
 ``` ```
--v <chemin hote>:<chemin conteneur>+-v <chemin machine>:<chemin conteneur>
 ``` ```
  
-`-v` pour `volumes`. On en parle juste après! ;-)+`-v` pour //volumes//. On en parle juste après! ;-) 
 +- Le chemin de la machine doit être **absolu**, pas relatif à là où tu te trouves. Pour savoir le chemin absolu du dossier courant, utilise la commande `pwd`. 
 + 
 +À ce stade, tu devrais aussi pouvoir faire l'opération. Concrètement, l'idée c'est de : 
 + 
 +- Supprimer l'ancien conteneur 
 +- Changer le fichier `index.html` de l'hôte, pour bien voir le changement par rapport au fichier qu'on a copié dans l'image 
 +- Lancer le conteneur en montant le dossier `website` sur `/var/www/html` (le chemin machine sera le résultat de la commande `pwd` + `/website`) 
 +- Lancer un `curl` et observer la magie ! 
 + 
 +Je te montre ce que ça donne chez moi : 
 + 
 +{{ :technique:tech_team:index_custom_2.gif |}} 
 + 
 +<bootnote>Si tu modifies ton fichier sur la machine pendant que le conteneur tourne et que tu refais un `curl`, tu verras que la modification se voit immédiatement, parce que le dossier est monté dans le conteneur! Plus besoin de recréer le conteneur, donc.</bootnote> 
 + 
 +Il y a une dernière méthode, c'est d'utiliser un **volume Docker**. 
 + 
 +### Passer aux choses sérieuses 
 + 
 +<bootnote question>C'est quoi le problème ? C'est pas bien les montages ?</bootnote> 
 + 
 +Si, c'est chouette, mais ça pose quelques « inconvénients ». Je vais pas rentrer dans les détails, mais imagine que quelqu'un supprime ton dossier par erreur, ben c'est un peu dommage... Le chemin du dossier dépend de l'hôte, c'est pas très « portable ». Aussi, quand tu montes un dossier vide sur un dossier non-vide, ça l'écrase, parfois ce n'est pas le comportement attendu... Alors, c'est souvent plus pratique d'utiliser les volumes Docker ! 
 + 
 +<bootnote critical>Un volume Docker n'est pas supprimé quand le conteneur qui le monte est supprimé. Les volumes Docker sont souvent utilisés pour persister des données qui sinon seraient perdues, par exemple les données d'une base de données.</bootnote> 
 + 
 +Un volume Docker, c'est un dossier caché quelque par dans `/var/lib/docker/volumes` sur la machine et qui est géré par Docker. Il a un nom, on peut lister les volumes avec des commandes Docker, et quand on monte un volume vide sur un dossier non vide, le contenu du dossier est **copié** dans le volume. Ça peut être utile, mais passons les détails. 
 + 
 +Pour regarder les volumes déjà créés, tu peux taper : 
 + 
 +``` 
 +docker volume ls 
 +``` 
 + 
 +Pour créer un nouveau volume : 
 + 
 +``` 
 +docker volume create quentin 
 +``` 
 + 
 +avec le nom que tu veux. 
 + 
 +Ensuite, pour monter le volume dans le conteneur, c'est la même syntaxe, sauf qu'au lieu du chemin sur la machine, on utilise le nom du volume !  
 +On pense à supprimer le conteneur, et ça nous donne ceci : 
 + 
 +``` 
 +docker rm -f quentin 
 +docker run -d --name quentin -p 80:80 -v quentin:/var/www/html nginx:quentin 
 +``` 
 + 
 +<bootnote question>À ton avis, que contient le volume Docker après le lancement ?</bootnote> 
 + 
 +Si on revient un peu en arrière, on se rappelle qu'on a copié `index.html` directement dans l'image qu'on utilise. Comme on a monté un volume vide (`quentin`) sur un dossier non-vide, le contenu du dossier a été copié. Le volume `quentin` contient donc l'`index.html` **de l'image**, pour le moment. 
 + 
 +Si tu fais un `curl`, tu devrais donc voir ton premier message apparaître. 
 + 
 +<bootnote question>Comment remplacer le fichier dans le volume, alors ?</bootnote> 
 + 
 +On va tout simplement copier notre fichier dans `/var/www/html`, qui sera directement copié dans le volume! Et comme c'est un volume, il ne sera pas supprimé quand on supprimera le conteneur, ce qui veut dire qu'on pourra le monter une prochaine fois avec le bon fichier dedans. Pour ce faire, une commande : 
 + 
 +``` 
 +docker cp <chemin machine> <nom du conteneur>:<chemin conteneur> 
 +``` 
 + 
 +Je te laisse essayer, et je te montre ce que ça donne chez moi : 
 + 
 +{{ :technique:tech_team:index_custom_3.gif |}} 
 + 
 +## C'est un peu lourd, non ? 
 + 
 +On a vu comment créer une image Docker, comment relier ses ports à ceux de la machine, et comment relier ses dossiers à ceux de la machine.
  
 +Mais oui, c'est un peu lourd... parce que ça implique qu'à chaque fois qu'on recrée un conteneur, par exemple pour faire une mise à jour, il faut écrire une ligne de commande longue comme le bras, ne pas se tromper, bien connaître l'ensemble des ports et des volumes... c'est un coup à devenir fou. :-P
  
 +Heureusement, chez Picasoft (et partout ailleurs, en fait), on fait autrement. Et c'est grâce à [[technique:tech_team:pres_compose|Docker Compose]], qui permet de décrire la configuration des conteneurs une fois pour toutes dans un fichier et de les lancer avec une commande qui tient dans la main!
  • technique/tech_team/tuto_docker.1634432176.txt.gz
  • de qduchemi