This is an old revision of the document!
Table of Contents
Docker
Docker est un outil permettant de faire tourner une application et ses dépendances dans un conteneur isolé, en s'appuyant sur certaines parties du système hôte.
Ceci est un pense-bête en vrac. Il peut contenir des erreurs.
Installation
Généralités
Il faut être root pour utiliser docker (par défaut en tout cas). On peut obtenir de l'aide pour chaque commande avec docker <command> --help
.
Vérification de la version :
docker version Client: Docker Engine - Community Version: 27.1.2 API version: 1.46 Go version: go1.21.13 Git commit: d01f264 Built: Mon Aug 12 11:51:13 2024 OS/Arch: linux/amd64 Context: default docker compose version Engine: Version: 27.1.2 API version: 1.46 (minimum version 1.24) Go version: go1.21.13 Git commit: f9522e5 Built: Mon Aug 12 11:51:13 2024 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.7.20 GitCommit: 8fc6bcff51318944179630522a095cc9dbf9f353 runc: Version: 1.1.13 GitCommit: v1.1.13-0-g58aa920 docker-init: Version: 0.19.0 GitCommit: de40ad0
Test de création d'un conteneur témoin
docker run hello-world
Conteneurs
Un conteneur est l'instanciation d'une image (souvent personnalisée via les variables d'environnement).
Création d'un conteneur Alpine Linux (Linux minimaliste)
docker run -it alpine # -i interactif -t on rattache le terminal # lancer un shell dans le conteneur alpine docker exec -ti alpine sh
Action sur les conteneurs
# démarrer arrêter un conteneur docker start alpine docker stop alpine # supprimer un conteneur (-f pour forcer même s'il est en fonctionnement) docker rm (-f) <conteneur1> # lister les conteneurs docker ps docker container ls # pour lister aussi les conteneurs arrêtés docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f8b7c15f443f hello-world "/hello" 8 months ago Exited (0) 8 months ago frosty_napier
Images
Ce sont des “pré-conteneurs” à instancier (personnaliser) et installer ; leur nommage est de type : image:version
.
# lister les images docker images #(ou docker image ls) # télécharger une image docker pull pihole # créer image à partir d'un conteneur docker commit -m "hello image v1" <containerID> firstimage:v1.0 # afficher l'historique des cmds passées dans l'image docker history <ID_image>
Registres (d'images)
Les “registry” sont des bases d'images Docker ; le “registre officiel” est le Docker Hub mais il en existe moult (LinuxServer.io par exemple).
Build
#docker build mkdir -p mon_serveur_web && cd $_ echo "<html><body>Hello world!</body></html>" > index.html echo -e "FROM nginx\n\ COPY index.html /usr/share/nginx/html/index.html" > Dockerfile docker build -t mon_serveur_web # on le lance en bindant le port 8888 du host sur le 80 du conteneur docker run -p 8888:80 mon_serveur_web:latest -> http://localhost:8888
Network
Les réseaux docker sont des bridges créés sur le système pour isoler les conteneurs, l'hôte pouvant ainsi gérer les communication inter-conteneurs et sortants de la machine.
# lister les réseaux (loopback) créés dans docker docker network ls
Volumes
docker volume ls docker volume create monvolume docker volume rm monvolume
Compose
docker compose: permet de créer et ordonnancer de multiples conteneurs pour monter un service (site web + BDD + etc) ; il utilise des fichiers yml pour définir le service
# https://docs.docker.com/compose/gettingstarted/ mkdir nextcloud && cd nextcloud docker-compose.yml <------ contient la description du service # création de la stack # run your services in the background with the -d flag (for "detached" mode) docker-compose up -d # afficher les logs docker-compose logs -f # arrêter le conteneur docker-compose down ! docker compose pull ?
Mettre à jour un conteneur existant (exemple avec technitium/dns-server):
docker compose down docker image rm technitium/dns-server docker compose up -d
Gestion des logs
# afficher les logs d'un conteneur: # -f/--follow ; -t/--timestamps ; -n/--tail docker container logs --follow <ID> docker logs -f -t --details <Nom_du_conteneur> # filtrer les logs sur un créneau horaire (ici affiche les logs du 11 mars) docker logs -t --since 2023-03-11 --until 2023-03-12 --details <conteneur> docker logs -t --since 1h30m --details <conteneur> # par def, les logs des conteneurs sont dans /var/lib/docker/containers/ # supprimer les logs d'un conteneur : : > $(docker inspect --format='{{.LogPath}}' <nom ou ID du conteneur>)
Divers
# afficher l'arborescence de la conf d'un composant, par ex le réseau (sh conf) docker inspect bridge # afficher la conf d'un conteneur docker inspect pihole # n'afficher qu'un paramètre de sa conf : docker inspect -f "{{.State.Health.Status}}" pihole-dogen # effacer les données inutilisées par docker (comme les vieilles images par ex) docker system prune
Exemples
Lancer un pihole sur le serveur Windows ; depuis un shell WSL:
docker run -d \ --name=pihole-win \ --hostname pi.hole \ -p 80:80 \ -e WEBPASSWORD=MDP4cc3sInterfaceWeb \ -e DNSMASQ_LISTENING=local \ -e PIHOLE_DNS_=10.0.1.65 \ -e TZ=FR \ -v pihole_dnsmasq.d:/etc/dnsmasq.d \ -v pihole_pihole:/etc/pihole \ --restart=unless-stopped \ pihole/pihole:latest
MAJ le conteneur avec la dernière version de pihole:
# dl la dernière version de l'image docker pull pihole/pihole # arrêter le conteneur courant docker container stop pihole-win # supprimer le conteneur courant docker rm -f pihole-win ! lancer le nouveau conteneur docker run <ARGS> pihole/pihole
Documentations
Vidéos:
Outils liés à docker: