technique:docker

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
Dernière révisionLes deux révisions suivantes
technique:docker [2020/10/26 21:50] – compléments docker francoisatechnique:docker [2024/03/06 15:52] francoisa
Ligne 1: Ligne 1:
-====== Virtualisation avec Docker ======+====== Conteneurisation avec Docker ======
  
 Docker est un système de virtualisation proche du sysème hote (s'il est similaire). Il permet de partager des ressources et de moins solliciter le système. Docker est un système de virtualisation proche du sysème hote (s'il est similaire). Il permet de partager des ressources et de moins solliciter le système.
Ligne 5: Ligne 5:
 Quelques sources : Quelques sources :
  
-  * [[https://www.wanadev.fr/23-tuto-docker-comprendre-docker-partie1/|https://www.wanadev.fr/23-tuto-docker-comprendre-docker-partie1/]]+  * [[https://openclassrooms.com/fr/courses/2035766-optimisez-votre-deploiement-en-creant-des-conteneurs-avec-docker|https://openclassrooms.com/fr/courses/2035766-optimisez-votre-deploiement-en-creant-des-conteneurs-avec-docker]]
   * [[https://guillaumebriday.fr/comprendre-et-mettre-en-place-docker|https://guillaumebriday.fr/comprendre-et-mettre-en-place-docker]] (réseau)   * [[https://guillaumebriday.fr/comprendre-et-mettre-en-place-docker|https://guillaumebriday.fr/comprendre-et-mettre-en-place-docker]] (réseau)
   * Un serveur web docker : [[https://techexpert.tips/fr/apache-fr/apache-installation-docker|https://techexpert.tips/fr/apache-fr/apache-installation-docker]]   * Un serveur web docker : [[https://techexpert.tips/fr/apache-fr/apache-installation-docker|https://techexpert.tips/fr/apache-fr/apache-installation-docker]]
   * [[https://xataz.developpez.com/tutoriels/utilisation-docker/|https://xataz.developpez.com/tutoriels/utilisation-docker/]]   * [[https://xataz.developpez.com/tutoriels/utilisation-docker/|https://xataz.developpez.com/tutoriels/utilisation-docker/]]
-  * https://devopssec.fr/article/cours-complet-apprendre-technologie-docker+  * [[https://devopssec.fr/article/cours-complet-apprendre-technologie-docker|https://devopssec.fr/article/cours-complet-apprendre-technologie-docker]] 
 +  * Docker dans LXC : [[https://du.nkel.dev/blog/2021-03-25_proxmox_docker/|https://du.nkel.dev/blog/2021-03-25_proxmox_docker/]] 
 +  * chaine Xavki sur docker (+docker-compose pas loin) [[https://yewtu.be/playlist?list=PLn6POgpklwWq0iz59-px2z-qjDdZKEvWd|https://yewtu.be/playlist?list=PLn6POgpklwWq0iz59-px2z-qjDdZKEvWd]] 
 +  * serie d'articles : [[https://blog.microlinux.fr/formation-docker/|https://blog.microlinux.fr/formation-docker/]] 
 + 
 +===== Schéma conteneur et virtualisation ===== 
 + 
 +{{.:image-29-1024x548.png?400}} 
 + 
 +=====   =====
  
 ===== Installation ===== ===== Installation =====
Ligne 18: Ligne 27:
 <code> <code>
  
-sudo apt install docker.io+sudo apt install docker docker-compose # si on veut utiliser des fichiers docker-compose.yaml
  
 </code> </code>
 +
 +Mais dans doute le paquet docker-ce dispo dans les repos est-il plus pertinent ?
  
 Mettre l'utilisateur courant dans le groupe docker : Mettre l'utilisateur courant dans le groupe docker :
Ligne 28: Ligne 39:
  
 </code> </code>
 +
 +Install de docker via ansible dans le role setup_machine : [[https://gitlab.cemea.org/cemeasi/ansible-cemea/-/blob/master/roles/setup_machine/tasks/main.yml?ref_type=heads#L73-116|https://gitlab.cemea.org/cemeasi/ansible-cemea/-/blob/master/roles/setup_machine/tasks/main.yml?ref_type=heads#L73-116]]
  
 ===== Principe de fonctionnement ===== ===== Principe de fonctionnement =====
Ligne 84: Ligne 97:
 ''docker stop nomcontainer''  : stoppe un conteneur existant ''docker stop nomcontainer''  : stoppe un conteneur existant
  
-''docker run --name monserveur -d -p portlocal:portdocker httpd''  : mappe le port local vers le port du docker (-d : détach = laisse tourner en arrière plan).+''docker run name monserveur -d -p portlocal:portdocker httpd''  : mappe le port local vers le port du docker (-d : détach = laisse tourner en arrière plan).
  
 ''docker logs -ft monserveur''  : suivi des logs sans interuption, -t avec time, -f : comme tail -f ''docker logs -ft monserveur''  : suivi des logs sans interuption, -t avec time, -f : comme tail -f
Ligne 146: Ligne 159:
   * **RUN**  : Exécute des commandes Linux ou Windows lors de la création de l'image. Chaque instruction   * **RUN**  : Exécute des commandes Linux ou Windows lors de la création de l'image. Chaque instruction
 RUN va créer une couche en cache qui sera réutilisée dans le cas de modification ultérieure du Dockerfile. RUN va créer une couche en cache qui sera réutilisée dans le cas de modification ultérieure du Dockerfile.
 +
   * **COPY**  : Permet de copier des fichiers depuis notre machine locale vers le conteneur Docker.   * **COPY**  : Permet de copier des fichiers depuis notre machine locale vers le conteneur Docker.
   * **ADD**  : Même chose que COPY mais prend en charge des liens ou des archives (si le format est reconnu, alors il sera décompressé à la volée).   * **ADD**  : Même chose que COPY mais prend en charge des liens ou des archives (si le format est reconnu, alors il sera décompressé à la volée).
   * **ENTRYPOINT**  : comme son nom l'indique, c'est le point d'entrée de votre conteneur, en d'autres termes, c'est la commande qui sera toujours exécutée au démarrage du conteneur. Il prend la forme de tableau JSON (ex : CMD ["cmd1","cmd1"]) ou de texte.   * **ENTRYPOINT**  : comme son nom l'indique, c'est le point d'entrée de votre conteneur, en d'autres termes, c'est la commande qui sera toujours exécutée au démarrage du conteneur. Il prend la forme de tableau JSON (ex : CMD ["cmd1","cmd1"]) ou de texte.
   * **CMD**  : Spécifie les arguments qui seront envoyés au   * **CMD**  : Spécifie les arguments qui seront envoyés au
-ENTRYPOINT , (on peut aussi l'utiliser pour lancer des commandes par défaut lors du démarrage d'un conteneur). Si il est utilisé pour fournir des arguments par défaut pour l'instruction +ENTRYPOINT , (on peut aussi l'utiliser pour lancer des commandes par défaut lors du démarrage d'un conteneur). Si il est utilisé pour fournir des arguments par défaut pour l'instruction ENTRYPOINT , alors les instructions CMD et ENTRYPOINT doivent être spécifiées au format de tableau JSON. 
-ENTRYPOINT , alors les instructions +
-CMD et +
-ENTRYPOINT doivent être spécifiées au format de tableau JSON.+
   * **WORKDIR**  : Définit le répertoire de travail qui sera utilisé pour le lancement des commandes   * **WORKDIR**  : Définit le répertoire de travail qui sera utilisé pour le lancement des commandes
-CMD et/ou +CMD et/ou ENTRYPOINT et ça sera aussi le dossier courant lors du démarrage du conteneur. 
-ENTRYPOINT et ça sera aussi le dossier courant lors du démarrage du conteneur.+
   * **EXPOSE**  : Expose un port.   * **EXPOSE**  : Expose un port.
   * **VOLUMES**  : Crée un point de montage qui permettra de persister les données.   * **VOLUMES**  : Crée un point de montage qui permettra de persister les données.
   * **USER**  : Désigne quel est l'utilisateur qui lancera les prochaines instructions   * **USER**  : Désigne quel est l'utilisateur qui lancera les prochaines instructions
-RUN , +RUN , CMD ou ENTRYPOINT (par défaut c'est l'utilisateur root). 
-CMD ou + 
-ENTRYPOINT (par défaut c'est l'utilisateur root).+Un outil pour explorer les couches d'une image Docker : [[https://github.com/wagoodman/dive|https://github.com/wagoodman/dive]]
  
 ===== Les volumes ===== ===== Les volumes =====
Ligne 168: Ligne 180:
 Ce sont des dossiers accessibles en dehors de docker et donc mutualisables. Ce sont des dossiers accessibles en dehors de docker et donc mutualisables.
  
-''docker volume create ''  : créer un volume (pointe vers un dossier comme /var/lib/docker/volumes/VOLUMENAME/_data)+''docker volume create VOLUMENAME''  : créer un volume (pointe vers un dossier comme /var/lib/docker/volumes/VOLUMENAME/_data)
  
 ''docker volume ls''  : lister les volumes ''docker volume ls''  : lister les volumes
Ligne 176: Ligne 188:
 ''docker volume rm VOLUMENAME''  : efface un volume ''docker volume rm VOLUMENAME''  : efface un volume
  
-''docker volume create --name monvolume -o type=none -o device=/chemin/hote/ -o o=bind''  : créer un volume qui pointe vers la destination voulue.+''docker volume create name monvolume -o type=none -o device=/chemin/hote/ -o o=bind''  : créer un volume qui pointe vers la destination voulue
 + 
 +''docker run -ti -v nomvolume:/chemindockerdossier monimage''  : -v spécifie le volume à utiliser.
  
-''docker run -ti -v monvolume:/monvolume monimage'' -v spécifie le volume à utiliser.+''docker run -ti -v /chemin/complet/nomdossier:/chemindockerdossier monimage'' pour monter un dossier local dans un dossier dockerisé.
  
 Ou sur une parition non montée : Ou sur une parition non montée :
  
-''docker volume create -o type=ext4 -o device=/dev/sdb1 --name partitionexterne''+''docker volume create -o type=ext4 -o device=/dev/sdb1 name partitionexterne''
  
 ===== Network ===== ===== Network =====
Ligne 198: Ligne 212:
 ''docker network inspect test''  : voir en détails le réseau test ''docker network inspect test''  : voir en détails le réseau test
  
-''docker network create --subnet 10.0.50.0/24 --gateway 10.0.50.254 --ip-range 10.0.50.0/28 test2''  : Créer un réseau personnalisé+''docker network create subnet 10.0.50.0/24 gateway 10.0.50.254 ip-range 10.0.50.0/28 test2''  : Créer un réseau personnalisé
  
 Docker créer une interface pour chaque réseau créé (ip a). Docker créer une interface pour chaque réseau créé (ip a).
  
-''docker run -ti --network test --name ctest image''  : rattacher un docker à un réseau existant+''docker run -ti network test name ctest image''  : rattacher un docker à un réseau existant
  
 ''docker network connect test ctest''  : connecter un conteneur ctest à un réseau existant ''docker network connect test ctest''  : connecter un conteneur ctest à un réseau existant
  
 ''docker network rm test''  : effacer un réseau ''docker network rm test''  : effacer un réseau
 +
 +===== log via journald =====
 +
 +Actifs sur toutes nos machines. Pour que les logs docker arrivent dans journald, ce qui permet une persistence, ainsi que tous les outils pratiques de filtrage de journald, il faut configurer le logging-driver dans ''/etc/docker/daemon.json''  :
 +<code>
 +
 +{
 +  "log-driver": "journald"
 +}
 +
 +</code>
 +
 +Ensuite, si on veut filtrer, plusieurs options :
 +
 +  * sur le nom du conteneur : ''journalctl CONTAINER_NAME=scribe-scribe-1''
 +  * sur l'ID court de conteneur : ''journalctl CONTAINER_ID=f541054ab4e7''
 +
 +Plus d'infos ici : [[https://docs.docker.com/config/containers/logging/journald/|https://docs.docker.com/config/containers/logging/journald/]]
 +
 +On peut bien sur combiner avec d'autres filtres :
 +<code>
 +
 +journalctl CONTAINER_NAME=scribe-scribe-1 -b -1 # Pour le dernier boot uniquement
 +journalctl CONTAINER_NAME=scribe-scribe-1 --since yesterday # Pour les logs depuis hier
 +journalctl CONTAINER_NAME=scribe-scribe-1 CONTAINER_NAME=scribe-dmp-server-1 #Pour avoir les logs de plusieurs containers d'un coup
 +
 +</code>
 +=== Cas particulier sous PVE ===
 +
 +Penser à activer le keyctl=1 pour docker
 +
 +En cas de disque saturé, docker peut renvoyer des trucs bizarres sur des fichiers qu'il croit encore existants :
 +
 +<code>
 +systemctl stop docker && rm -Rf /var/lib/docker/image/vfs && rm -Rf /var/lib/docker/vfs && systemctl start docker
 +
 +</code>
 +
 +Et patienter avant de relancer un build...
 +
 +===== Purge =====
 +
 +Les usages mutliples de docker génèrent des fichiers liés au volume, au réseau au cache. Ce qui représente à la longue un espace conséquent dans /var/lib/docker (20 Go chez moi).
 +
 +Un nettoyage complet peut s'effectuer avec :
 +
 +<code>
 +docker system prune -a # suppresion des images, conteneur, réseau, volumes, cache...
 +
 +</code>
 +
 +Et hop : réduction à 40 Mo !
  
 ====== Docker-compose ====== ====== Docker-compose ======
  • technique/docker.txt
  • Dernière modification : 2024/04/02 15:08
  • de 127.0.0.1