======Docker====== {{ :informatique:logiciels:docker_logo.png?200| }} 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===== * [[https://docs.docker.com/engine/install/debian/|Procédure d'installation officielle de docker engine (sous Debian)]] * [[https://forum.hacf.fr/t/integration-monitoring-proxmox/20579/11|Installation docker sur une VM Ubuntu dans Proxmox]] * [[https://tteck.github.io/Proxmox/#docker-lxc|Installation en 1 clic dans un conteneur LXC sous Proxmox]] =====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 %%--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) # 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 [[https://hub.docker.com/|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" firstimage:v1.0 # afficher l'historique des cmds passées dans l'image docker history =====Registres (d'images)===== Les "registry" sont des bases d'images Docker ; le "registre officiel" est le [[https://hub.docker.com/|Docker Hub]] mais il en existe moult ([[https://github.com/linuxserver|LinuxServer.io]] par exemple). =====Build===== #docker build mkdir -p mon_serveur_web && cd $_ echo "Hello world!" > 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 docker volume rm 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 docker logs -f -t --details # 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 docker logs -t --since 1h30m --details # par def, les logs des conteneurs sont dans /var/lib/docker/containers/ # supprimer les logs d'un conteneur : : > $(docker inspect --format='{{.LogPath}}' ) =====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 pihole/pihole =====Documentations===== * https://www.tecmint.com/install-run-and-delete-applications-inside-docker-containers/ * https://docs.docker.com/desktop/windows/ Vidéos: * https://www.youtube.com/watch?v=-jeeHiJ1B-0&list=PLn6POgpklwWq0iz59-px2z-qjDdZKEvWd&index=9 * https://www.youtube.com/results?search_query=docker+synology * https://www.youtube.com/watch?v=db5jLi6BnaI * https://servicemax.com.au/tips/pi-hole-in-docker-on-synology-the-best-way/ Outils liés à docker: * https://github.com/wagoodman/dive