Outils pour utilisateurs

Outils du site


docker

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
docker [2020/06/23 21:07] lucdocker [2025/08/02 11:30] (Version actuelle) luc
Ligne 1: Ligne 1:
 +====== Docker ======
  
 +Pendant longtemps j'ai fuit Docker. D'abord parce que je n'y comprenais rien, ensuite parce que c'était la mode (et j'aime pas la mode).
 +
 +Mais le temps passant, les besoins changent et je dois maintenant déployer des applications au boulot. Puis je n'ai ni le temps (et peut-être pas le courage), de gérer le déploiement de ces applications à partir des sources ou autre solution très consommatrices de temps et de skill.
 +
 +Enfin, la containerisation n'est plus une mode, mais c'est devenu un véritable moyen de faire de l'admin sys pour avoir des compatibilités parfaites et de l'isolation des applicatifs pour plus de sécurité.
 +
 +Bref, je me suis mis (un peu) à Docker
 +
 +===== Installation =====
 +Pas de difficultés, les [[https://docs.docker.com/engine/install/debian/|docs de Docker]] sont bien fichues. Pour Debian, il est recommandé d'installer un nouveau dépôt géré par la société docker dans ''source.list'', ce qui permet d'avoir les versions stables à jour. CHECKED
 +
 +===== Images vs Container =====
 +Il faut différencier les images et les containers. L'image est comme un DVD/.iso, le container est l'image installée pour être executée.
 +
 +On peut créer des containers (à partir de notre propre travail ou d'une image récupérée sur le Hub).\
 +On peut démarrer des containers.\
 +On peut arrêter des containers.
 +
 +Ces containers contiennent l'application et l'environnement nécessaire (choisi par le dev) pour le faire tourner. 
 +
 +Les données persistantes (indépendantes de l'image et de l'instance) sont gérées dans des [[#les_volumes|Volumes]].
 +
 +On peut automatiser le déploiement de service Docker avec [[docker_compose|Docker-compose]].
 +
 +===== Commandes Docker =====
 +Pour l'usage simple que j'en ai, on pilote docker via la cli
 +
 +De base la commande Docker s'execute en root
 +
 +<code bash>
 +### DOCKER RUN
 +# créer et démarrer un container
 +docker run -p 8080:80 -v ~/projet/etc:/etc/mon_projet -d --name POUPETTE <image>
 +
 +# /!\ la commande ne rend la main QUE lorsque tous les process à l'intérieur du container sont éteints. ça peut bloquer le prompt
 +# options utiles :
 +#-d
 +#    (detach) run le container en background (non bloquant sur la cli, et ça c'est bien)
 +#-v /path/to/host:/path/inside/container
 +#    (volume) crée un bind entre un dossier sur le système de fichier de l'hôte et le système de fichier du container,
 +#    utile pour la persistance de données et/ou le backup
 +#-p host:container
 +#    fait un renvoi des ports de l'host vers le container (utile si plusieurs containers servent du web, chacun sur le port 80 par exemple)
 +#--name NOM
 +#    pour nommer le container que l'on crée
 +# -e ENV_VARIABLE=value
 +#    Passer des variables env au container lors de sa création
 +# <image>
 +#    nom de l'image pour laquelle il faut créer un container
 +#    si l'image n'est pas déjà présente, la télécharge (sur le Docker Hub)
 +
 +
 +### DOCKER CREATE
 +# crée un container sans le démarrer
 +
 +
 +### DOCKER START
 +# démarre un container déjà créé
 +docker start <ID>
 +
 +#est-ce que ça marche avec le name ? à tester
 +
 +
 +### DOCKER STOP
 +# arrête un container
 +docker stop <ID>
 +
 +
 +### DOCKER PS
 +# liste les containers actifs (run)
 +docker ps 
 +
 +# liste tous les containers
 +docker ps -a
 +
 +
 +### DOCKER RM
 +# supprimer des containers
 +# on peut récupérer les id avec 'docker ps'
 +docker rm <ID>  
 +
 +
 +### DOCKER IMAGES
 +# lister les images
 +# car plusieurs container peuvent être réalisés à partir d'une même image
 +# ou avoir plusieurs versions
 +# c'est un cache de DL des images en fait :)
 +docker image ls
 +
 +# supprimer les images (et pas les containers)
 +# il ne doit plus y avoir de container faisant référence à cette image
 +docker image rm <IMAGE>
 +docker rmi <IMAGE>  # alias
 +
 +# Supprimer toutes les images inutilisées (pas de container y faisant référence)
 +docker image prune
 +
 +
 +### Démarrage auto
 +# sur un nouveau container
 +docker run -d --restart unless-stopped redis
 +
 +# sur un container existant
 +docker update --restart always metabase
 +
 +# options :
 +#    no: don't start automatically (default)
 +#    on-failure[:max-retries]: redémarrer le container s'il ferme à cause d'une erreur, avec limite optionnelle de tentatives. Pas de démarrage au boot
 +#    always: démarre le container au démarrage du daemon docker, même si arrêté à la main
 +#    unless-stopped: démarre le container au démarrage du daemon, sauf si arrêté à la main
 +
 +
 +
 +</code>
 +
 +===== Les Volumes =====
 +
 +Les volumes sont des espaces de stockage existant hors des containers. Ils sont utilisés pour avoir un stockage permanent de données.\
 +Fonctionnalités:
 +  * Ils peuvent être partagés entre plusieurs containers
 +  * Ils peuvent avoir un nom (named volume) ou être "annonymes" (un nom automatique est donné)
 +  * Ils peuvent être créés et manipulés sans container
 +  * Il peut exister plusieurs "driver" de volume (par défaut "local", mais il peut y avoir du rclone ...)
 +  * Si on démarre un container avec un volume, si le volume n'existe pas, il est créé
 +  * Quand on supprime un container, le named volume associé reste. Il faut le supprimer à la main si on veut s'en débarrasser.
 +  * Le concept est de créer un container avec un volume, puis de facilement supprimer le container, l'update, le relancer, les données restent
 +  * Quand on monte un volume sur un dossier déjà existant (dans le container), les données sont copiées dans le volume (utile pour le backup)
 +
 +Par défaut, les volumes sont ici : ''/var/lib/docker/volumes/''
 +
 +<code bash>
 +### DOCKER VOLUME
 +## Les dockers volume sont les couches de données 
 +# Lister les volumes
 +docker volume ls 
 +
 +# Inspecter un volume (sa localisation sur le système de fichier de l'hôte, son nom, son mount-dest etc.)
 +docker volume inspect <volume_name>
 +
 +# supprimer tous les volumes non utilisés
 +docker volume prune
 +
 +# supprimer un volume en particulier
 +docker volume rm <volume_name>
 +
 +# Créer un volume hors container
 +docker volume create <volume_name>
 +
 +# monter un volume dans un container
 +docker run --mount type=volume,src=<volume-name>,dst=<mount-path>
 +# dst=<mount_path> : point de montage DANS le container
 +# autres options :
 +#    readonly
 +#    dst aliases : destination, target, dst
 +#    volume-nocopy : If present, data at the destination isn't copied into the volume if the volume is empty.
 +#                    By default, content at the target destination gets copied into a mounted volume if empty.
 +
 +</code>
 +
 +Une procédure simple de sauvegarde: 
 +  * On arrête le container
 +  * sur le système hôte, on copie le volume (rsync, borg) 
 +  * On redémarre le container
 +
 +Docker en propose une autre, basé sur le partage de volume entre plusieurs container, [[https://docs.docker.com/engine/storage/volumes/#back-up-restore-or-migrate-data-volumes|voir la doc officielle]].
 +
 +===== Docker compose =====
 +
 +Docker compose est à la fois un programme ''docker compose'' et à la fois un fichier de configuration (en YAML).\\
 +L'idée est d'avoir une recette de cuisine contenue dans un fichier pour créer un service (qui peut faire appel à plusieurs containers : serveur web, bdd, ... avec des montages de volumes bien définis). ça évite de faire des commandes CLI à rallonge.\\
 +Et ça épouse bien le cycle de vie d'un service sous Docker, qui consiste à séparer les données (volumes) de l'application (image), en faisant des containers qui suivent des cycles de création à partir de la dernière image de l'app dispo sur le web et de destruction du container, tout en conservant les données dans les volumes pour avoir une persistance de celles-ci.
 +
 +Voici l'article détaillé sur l'utilisation des [[docker_compose|fichiers de config pour docker compose]].
 +
 +===== Recommandations =====
 +
 +Ci dessous un recueil de recommandations lues ici ou là, à méditer, à approfondir au besoin :
 +
 +  * Ne pas utiliser Docker au sein d'un autre système de container style LXC, si besoin d'isolation particulière au sein du système hôte, il vaut mieux créer une VM
 +  * Mieux vaut ne pas gérer les auto-start & co via systemd et consorts. Il vaudrait mieux passer directement par l'interface Docker. ça peut se faire avec l'argument ''--restart'' de la ligne de commande
 +  * Les docker-files sont des recettes de cuisine pour **construire** une image 
 +  * ''docker run'' ne rend la main (prompt) que lorsqu'il n'y a plus de process actif dans le container (/!\ serveur web attendant des connexions), penser à utiliser --detach