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.
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
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
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>
Les “registry” sont des bases d'images Docker ; le “registre officiel” est le Docker Hub mais il en existe moult (LinuxServer.io par exemple).
#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
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
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
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
# 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>)
# 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
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
Vidéos:
Outils liés à docker: