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
Portainer
Portainer est une webUI pour docker ; il permet de gérer le moteur via le navigateur.
Les confs (notamment les docker-compose à sauvegarder) se trouvent dans : /var/lib/docker/volumes/portainer_data/
Alternative: Dockge
Documentations
Vidéos:
Outils liés à docker:
Tips
overlay2 prend trop de place
Docker a tendance à prendre de la place, certains conteneurs notamment remplissent le système de fichier et saturent le dossier
df -h | grep -E /$ /dev/sda2 20G 19G 0 100% /
On peut commencer par supprimer tous les objets inutilisés, en faisant attention c'est une manipulation destructrice :
docker system prune WARNING! This will remove: - all stopped containers - all networks not used by at least one container - all dangling images - unused build cache Are you sure you want to continue? [y/N]
Dans mon cas cela fait gagner un peu de place, mais le soucis principal vient d'ailleurs :
du -hs /var/lib/docker/* 116K /var/lib/docker/buildkit 248K /var/lib/docker/containers 4,0K /var/lib/docker/engine-id 2,6M /var/lib/docker/image 88K /var/lib/docker/network 23G /var/lib/docker/overlay2 <---- là ! 16K /var/lib/docker/plugins 4,0K /var/lib/docker/runtimes 4,0K /var/lib/docker/swarm 4,0K /var/lib/docker/tmp 1,3M /var/lib/docker/volumes
Oui, il fallait faire une partition dédiée pour /var !
docker system df TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 2 2 1.198GB 0B (0%) Containers 2 2 11GB 0B (0%) Local Volumes 2 1 1.227MB 963.1kB (78%) Build Cache 0 0 0B 0B docker system df -v [...] Images space usage: REPOSITORY TAG IMAGE ID CREATED SIZE SHARED SIZE UNIQUE SIZE CONTAINERS bbernhard/signal-cli-rest-api 0.167-dev 3a4e0da41196 13 months ago 897MB 0B 897.5MB 1 portainer/portainer-ce 2.21.1 9c0b5a6a7e4d 13 months ago 301MB 0B 300.8MB 1 Containers space usage: CONTAINER ID IMAGE COMMAND LOCAL VOLUMES SIZE CREATED STATUS NAMES 3d15115fdf6f bbernhard/signal-cli-rest-api:0.167-dev "/entrypoint.sh" 0 11GB 5 weeks ago Up 8 days (healthy) signal-cli-rest-api b94dc74fe700 portainer/portainer-ce:2.21.1 "/portainer" 1 0B 13 months ago Up 8 days portainer
11G c'est trop ;
docker stop 3d15115fdf6f docker rm -f 3d15115fdf6f df -h | grep -E /$ /dev/sda2 20G 7,9G 11G 44% / # et le recréer: cd /bla/tools/docker/apps docker compose up -d
 