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
# 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 # 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> # supprimer les conteneurs non utilisés docker container prune
Images
Ce sont des “pré-conteneurs” à instancier (personnaliser) et installer ; leur nommage est de type : image:version
. On peut les télécharger depuis un repository, celui par défaut est le docker hub.
# lister les images docker images #(ou "docker image ls") # télécharger une image docker pull pihole # supprimer les images inutilisées docker image prune # 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
Dans un docker compose, créer un réseau bridgé dont on maitrise l'adressage:
networks: br-1: name: pont1 driver: bridge ipam: config: - subnet: 172.17.17.0/24 gateway: 172.17.17.254 [..] services: myalpine: image: alpine container_name: myalpine command: sh network: - br-1 name: pont1 #external: true # uniquement si le réseau a déjà été créé en dehors compose ipv4_address: 172.17.17.10
Pour faire communiquer (basiquement) 2 réseaux docker il faut manipuler l'iptables du host :
iptables -I DOCKER-USER -i br-1 -o br-2 -j ACCEPT iptables -I DOCKER-USER -i br-2 -o br-2 -j ACCEPT
Volumes
Permet de faire persister les données entre plusieurs lancements de conteneurs, en montant un volume sur le système de fichier de la machine hôte.
docker volume ls (-a) docker volume create <monvolume> docker volume rm <monvolume> docker volume prune
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
docker compose version docker compose build # 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 les conteneurs (-v pour supprimer les volumes également) docker-compose down (-v) ! 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: