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
Cheatsheet - Docker Compose
https://docs.docker.com/compose/compose-file/
- compose.yaml
name: myapp services: my-service-1: # Définition de l'image image: debian:bookworm # [<registry>/][<project>/]<image>[:<tag>|@<digest>] depends_on: - my-service-2 # Définition du réseau ports: # [HOST:]CONTAINER[/PROTOCOL] - "10080:80" # NAT le port 10080 du host vers le port 80 du container - name: web # Long syntax target: 80 # Container port published: "10080" # Host port, Default: Random host-ip: 127.0.0.1 # Default: 0.0.0.0 protocol: tcp # Default: tcp app_protocol: http # Optional, hinter. TCP/IP level 4/OSI level 7 mode: host # ??? networks: my-network-1: # Ajoute le container dans ce réseau my-network-2: # Long syntax aliases: - myapp # Crée un hostname supplémentaire de ce container dans ce réseau ipv4_address: 172.16.238.10 # Non recommandé - Risque de ne pas être reproductible ipv6_address: 2001:3984:3989::10 # Idem ipv4_address # Définition des volumes / Persistence de données volumes: - type: bind # https://docs.docker.com/storage/ # bind = Montage sur le FS host # volume = Montage géré par Docker (Préféré par docker) # tmpfs = Chargé en mémoire (Linux only) source: /home/docker/myapp # Source sur le host target: /myapp # Destination dans le container read_only: true bind: # Option uniquement si type = bind create_host_path: true # Crée le répertoire s'il n'existe pas volume: # Option uniquement si type = volume nocopy: true # Ne copie pas les données du container lors de sa création my-service-2: ... networks: # Définition des réseaux my-network-1: my-network-2: annotations attach build blkio_config cpu_count cpu_percent cpu_shares cpu_period cpu_quota cpu_rt_runtime cpu_rt_period cpus cpuset cap_add cap_drop cgroup cgroup_parent command configs container_name credential_spec deploy develop device_cgroup_rules devices dns dns_opt dns_search domainname driver_opts entrypoint env_file environment expose extends external_links extra_hosts group_add healthcheck hostname init ipc isolation labels links logging mac_address mem_limit mem_reservation mem_swappiness memswap_limit network_mode oom_kill_disable oom_score_adj pid pids_limit platform privileged profiles pull_policy read_only restart runtime scale secrets security_opt shm_size stdin_open stop_grace_period stop_signal storage_opt sysctls tmpfs tty ulimits user userns_mode uts volumes volumes_from working_dir
