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: