Ceci est une ancienne révision du document !
Table des matières
Docker - Prise de note
En cours de rédaction
Prise de note sur la mise en place de Docker, avec bonne pratique et outils intéressant.
Définition
- Container: Une instance exécutable d'une image. Isolé des autres containers
 - Image: Un file system. Contient l'application, les dépendances, la configuration, les variables et une commande par défaut a exécuter
 - Volume: Une connexion vers un file system disponible sur la machine host
 - Container network: Par défaut un container est isolé, pour qu'ils puissent discuter entre eux, il faut définir un réseau de container
 
Installation
L'installation se base sur une Debian 12 propre (Debian 12 - Perfect Server)
Installation du respository:
wget https://download.docker.com/linux/debian/gpg -O /etc/apt/keyrings/docker.asc chmod a+r /etc/apt/keyrings/docker.asc echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian bookworm stable" > /etc/apt/source.list.d/docker.list apt update
A partir de là, nous pouvons installer docker
apt install docker-ce
Note: Docker va installer git et iptables
(Recommandé) Pour qu'un utilisateur non-root puisse epxloiter docker, nous devons l'ajouter au groupe “docker”
usermod -aG docker <user>
Commande de base
docker run
(Alias de : docker container run) 
Exécute un nouveau container
docker run [--detach|-d] [--publish|-p <port>] [--tty|-t] [--interactive|-i] [--name=<name>] [--mount type=<bind|volume>,src=<path/bind|volume-name>,dst=<dest/path>] <image-name>
–detach (-d) - Sinon le contenu de la console est accroché à notre terminal 
–publish (-p) - Expose le port du container. Exemple : 80:1234 - Expose le pose 1234 du container sur le port 80 de la machine hôte 
–tty (-t) - Va de paire avec –interactive. Alloue un terminal dans le container 
–interactive (-i) - Va de paire avec –tty. Permet d'interagir avec le container 
–name= - Attribue un nom au container. Sinon un nom aléatoire sera défini 
–mount - Défini un point de montage d'un volume. Type: bind = Chemin, volume = Volume existant (Plus d'info
<image-name> - Nom de l'image a démarrer. Si elle n'existe pas, elle sera téléchargé depuis le Docker Hub
docker ps
(Alias de : docker container ls) 
Affiche les containers en cours d'exécution
docker ps [--all|-a]
–all (-a) - Affiche également les containers éteint
docker stop
(Alias de : docker container stop) 
Arrête un container
docker stop [--time|-t <secondes>] <name>
<name> - Nom du container –time (-t) - Indique si le container doit être tué s'il ne s'arrête pas proprement dans le temps indiqué
docker rm
(Alias de : docker container rm) 
Supprimer un container
docker rm [--force|-f] <name>
–force (-f) - Force la suppression du container. S'il est en cours d'utilisation, envoi un SIGKILL au container
docker container prune
Supprime l'ensemble des containers qui ne sont plus en cours d'utilisation. 
Note:  “prune” fonctionne de la même manière avec des images (docker image prune) ou des volumes (docker volume prune)
docker build
(Alias de : docker image build) 
Construire une image sur base d'un Dockerfile. 
Référence: https://docs.docker.com/reference/dockerfile/
docker build --tag=<image-name> <path>
–tag (-t) - Défini un nom et un tag d'une image. Par exemple: apache:latest <path> - Généralement simplement “.” si nous nous trouvons dans le dossier contenant un Dockerfile.
docker volume
Crée un volume qui sera accessible par nos containers
docker volume create <volume-name>
Inspecter un volume existant, pour y connaitre son chemin par exemple
docker volume inspect <volume-name>
docker network create
Permet de créer un réseau de container
docker network create <network-name>
Pour l'attacher a un docker:
docker run --network <network-name> --network-alias <hostname>
–network-alias - Permet d'attribuer un hostname au container.
docker exec
Permet d'exécuter une commande dans un container en cours d'exécution
docker exec -it <container-name> <cmd>
-it - = –interactive et –tty (cf docker run)
docker compose
Permet de décrire dans un fichier l'équivalent d'un ou plusieurs docker run. Ceci permettra la reproductivité sans erreur.
Référence: https://docs.docker.com/compose/compose-file/
docker compose up --detach|-d
up - Permet de démarrer la composition, a l'instar de down qui éteindra notre composition
–detach (-d) - Sinon le contenu de la console est accroché à notre terminal 
Exemple:
services:
  app:
    image: node:18-alpine
    command: sh -c "yarn install && yarn run dev"
    ports:
      - 3000:3000
    working_dir: /app
    volumes:
      - ./:/app
    environment:
      MYSQL_HOST: mysql
      MYSQL_USER: root
      MYSQL_PASSWORD: secret
      MYSQL_DB: todos
  mysql:
    image: mysql:8.0
    volumes:
      - todo-mysql-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: todos
  volumes:
    todo-mysql-data:
A investiguer
- hadolint - Linter pour Dockerfile
 - trivy - Scanner de sécurité dans une image
 - bearstech.com - Bonnes pratiques
 - bearstech.com - Tâche automatisée avec les conteneurs
 - bearstech.com - Mettre à jour les images Docker
 
