Docker cheatsheet

A propos

Docker est une technologie qui permet de créer des environnements isolés appelés conteneurs pour exécuter des applications de manière portable sur des machines hétérogènes. La portabilité et l’utilisation efficace des ressources sont les avantages des conteneurs. Bien que les conteneurs ne soient pas conçus comme un mécanisme de confinement sécurisé, ils permettent un isolement efficace des ressources. Pour effectuer cette isolation, docker fait usage de fonctionnalités du noyau Linux : les cgroups et les namespaces.

Les cgroups, ou groupes de contrôle, sont une fonctionnalité de Linux qui permet de limiter et de répartir les ressources système entre les différents processus. Docker utilise les cgroups pour allouer les ressources du système, telles que la CPU, la mémoire, le disque, etc., aux conteneurs. En utilisant les cgroups, Docker peut garantir que les conteneurs ne monopolisent pas toutes les ressources du système et peuvent coexister avec d’autres applications et processus.

Les namespaces sont une autre fonctionnalité de Linux qui permet d’isoler les ressources système, tels que les processus, les utilisateurs, les fichiers, les réseaux, etc. Docker utilise les namespaces pour créer un environnement isolé pour chaque conteneur. Chaque conteneur dispose de son propre espace de noms, ce qui signifie qu’il a sa propre vision du système, distincte des autres conteneurs et du système hôte.

Docker permet d’empaqueter une application dans une image, distribuer cette image et lancer des conteneurs à partir de cette image. Les images sont constituées de couches (layers) qui permettent de réutiliser le travail déjà effectué, de transférer moins de données et d’économiser de la bande passante.

Cependant, les images créées par Docker peuvent être trop permissives et ne pas être correctes par défaut. L’orchestration de conteneurs, la sécurité et la création de bonnes images nécessitent de l’expérience. Dans certains cas, il peut être préférable de ne pas utiliser Docker même si cela est possible.

Initialisation

Pour créer le groupe docker et ajouter votre utilisateur

Créer le groupe docker :

sudo groupadd docker

Ajoutez votre utilisateur au groupe docker :

sudo usermod -aG docker $USER

Déconnectez-vous et reconnectez-vous pour que votre appartenance à un groupe soit réévaluée. Si vous exécutez Linux dans une machine virtuelle, il peut être nécessaire de redémarrer la machine virtuelle pour que les changements prennent effet. Vous pouvez également exécuter la commande suivante pour activer les modifications apportées aux groupes :

newgrp docker

Verify that you can run docker commands without sudo :

docker run hello-world

Le groupe docker accorde des privilèges root à l’utilisateur

Docker

Lancer un container en tant qu’utilisateur (non-root)

docker container run --user <uid>:<gid> <image>

Lister les containers

docker ps
docker ps -a

IP d’un container

docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container>

Session interactif

docker exec -it <container> <command>
docker exec -it <container> /bin/bash

Copier un fichier/dossier d’un container vers la machine hôte

docker cp <container>:/src/path/ /host/path

Créer une image depuis un container

docker commit <container> <image>

Docker Compose

Lancer un fichier docker-compose.yml

docker compose up 
docker compose up -d 

Container en tant qu’utilisateur (non-root) :

version: "3.8"
services:
  app:
    user: <uid>:<gid>
    sysctls:
      net.ipv4.ip_unprivileged_port_start: 0 # port binding issue

# /!\ the user will be $HOME-less and nameless 

Users

Créer un groupe

sudo groupadd -g <gid> <group-name>

Créer un utilisateur

sudo useradd <username> -u <uid> -g <gid> 
sudo useradd <username> -u <uid> -m -s /bin/bash # make home directory & set shell

Supprimer un utilisateur

sudo userdel <username>