Docker

Vos applications dans des boîtes pour la sécurité, la propreté, la fiabilité, la portabilité et pleins de bonnes raisons :)

[Docker] Installation

horizontal-logo-monochromatic-white.png

Installation

Debian

apt-get update && apt-get install ca-certificates curl gnupg -y && install -m 0755 -d /etc/apt/keyrings && curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg && chmod a+r /etc/apt/keyrings/docker.gpg && echo "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null && apt-get update && apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

Ubuntu

apt-get update && apt-get install ca-certificates curl gnupg && install -m 0755 -d /etc/apt/keyrings && curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg && chmod a+r /etc/apt/keyrings/docker.gpg && echo "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null && apt update && apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

CentOS / Alma Linux / Rocky Linux

yum install -y yum-utils && yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo && yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Arch Linux / Manjaro

pacman -Sy docker && systemctl enable --now docker.service

Alpine Linux

apk policy docker && apk add docker && rc-update add docker boot && service docker start

Mettre l'utilisateur dans le groupe docker

Pour mettre l'utilisateur dans le groupe docker et ainsi pouvoir lancer des conteneurs avec d'autres utilisateurs que root :

usermod -aG docker <USER>

Puis :

newgrp docker

Relancez votre session pour prendre en compte les changements.

[Docker] Cheat-sheet

Introduction

Cette page répertorie des commandes docker pour administrer vos conteneurs.

Commandes de base

Démarrer un conteneur

docker run -d -p <HOST:CT> --name <CT_NAME> <IMG>

Arrêter un conteneur

docker stop <CT_NAME>

Supprimer un conteneur

docker rm <CT_NAME>

Le conteneur doit être arrêté pour le supprimer.

Redémarrer un conteneur

docker restart <CT_NAME>

Images

Télécharger une image Docker

docker pull <IMG>

Lister les images présente sur le système

docker images 

Supprimer une image docker

docker rmi <IMG>

Supprimer les images inutilisées

docker images -f dangling=true

Réseaux

Création de réseau Docker

Pour créer un réseau simple sur Docker, il faut exécuter la commande suivante :

docker network create --driver <DRVR_TYPE> <NET_NAME>
Types de drivers Description Commande
bridge (default) Créer un réseau Naté et isolé pour les conteneurs. docker network create --driver bridge <NET_NAME>
host Utilise directement le réseau de l'hôte docker run --network host --name <CT_NAME> <IMG>
overlay Permet aux conteneurs qui ne sont pas sur le même hôte d'appartenir à un même réseau (très utilisé avec Docker Swarm). docker network create --driver overlay <NET_NAME>
macvlan Donne une adresse MAC aux conteneur ce qui les fait apparaître comme de véritables appareils du réseau de l'hôte. docker network create -d macvlan --subnet=<NET_ID/MASK> --gateway=<IP> -o parent=<IFACE> <NET_NAME>

Lister les réseaux existants

docker network ls

Afficher le détail d'un réseau

docker network inspect <NET_NAME>

Supprimer un réseau

docker network rm <NET_NAME>

Connecter un conteneur à un réseau

docker network connect <NET_NAME> <CT_NAME>

Déconnecter un conteneur d'un réseau

docker network disconnect <NET_NAME> <CT_NAME>

Créer un réseau isolé

docker network create --driver bridge --subnet <NET_ID/MASK> isolated_network

Volumes

Créer un volume

docker volume create <VOL_NAME>

Attacher un volume à un conteneur

docker run -d -v <VOL_NAME>:/data --name <CT_NAME> <IMG>

Les volumes docker sont stockés dans /var/lib/docker/volumes .

Faire du bind mount

Ce type de montage spécifie l'emplacement du volume sur le système hôte :

docker run -d -v /root/my_app/data:/data --name <CT_NAME> <IMG>

Lister les volumes

docker volume ls

Afficher les détails d'un volume

docker volume inspect <VOL_NAME>

Créer un volume en lecture seule

docker run -d -v /root/my_app/data:/data:ro --name <CT_NAME> <IMG>

Supprimer un volume

docker volume rm <VOL_NAME>

Nettoyer les volumes non utilisés

docker volume prune

Copier un fichier de l'hôte sur un volume

docker cp /path/to/file.txt <CT_NAME>:/data/file.txt

Faire une sauvegarde d'un volume

docker run --rm --volumes-from <CT_NAME> -v $(pwd):/backup ubuntu tar cvzf /backup/backup.tar.gz /data

Dockerfile

Le Dockerfile est un fichier permettant de créer une image docker pour votre application :

# Utilise l'image Python comme base
FROM python:3.8

# Définit l'espace de travail
WORKDIR /app

# Copie les fichiers de l'application dans l'espace de travail
COPY . /app

# Installe les dépendances
RUN pip install -r requirements.txt

# Expose le port 5000 du conteneur
EXPOSE 5000

# Lance le script au démarrage de l'application.
CMD ["python", "app.py"]

Build une image à partir d'un Dockerfile

docker build -t <APP_NAME:latest> .

Sécurité

Lancer un conteneur avec les droits d'un utilisateur non-root

docker run -u <UID>

Créer un secret

echo "<SECRET>" | docker secret create <SECRET_NAME> -

Ajouter un health check sur un conteneur

Cette option permet d'éteindre un conteneur automatique si celui-ci est en panne (pour éviter les problèmes de sécurité et les comportements inattendus) :

docker run --name <CT_NAME> --health-cmd="curl --fail http://localhost:80/health || exit 1" -d <CT_IMG>

Débogage

Ouvrir un shell dans un conteneur

docker exec -it <CT_NAME> /bin/bash

Vérifier l'état du service

systemctl status docker

Vérifier le fonctionnement de docker

docker run hello-world

Afficher les conteneurs actifs

docker ps

Vous pouvez ajouter l'option -a pour afficher tous les conteneurs.

Afficher les logs d'un conteneur

docker logs <CT_NAME>

Afficher la configuration d'un conteneur

docker inspect <CT_NAME>

Afficher les statistiques des conteneurs

docker stats

Écouter les événements docker

docker events

Afficher les changements dans le système de fichier d'un conteneur

docker diff <CT_NAME>

Mettre à niveau un conteneur

Arrêt du conteneur

docker container stop <CONTAINER_NAME>

Recherche du nom de l'ancienne image

docker ps -f name=<CONTAINER_NAME> --format "{{.Image}}"

Suppression du conteneur

docker container rm <CONTAINER_NAME>

Suppression de l'ancienne image

docker rmi <CONTAINER_NAME>:<CONTAINER_OLD_VERSION>

Redéploiement du conteneur

docker run -d --name <CONTAINER_NAME> <IMG_REPOS/IMG>:<NEW_VERSION>

[Docker] Compose

Introduction

Les stacks docker (ensemble de conteneurs) peuvent être gérées à travers compose ou docker-compose selon les appellations.

image.png

Installation

Vous avez deux manières d'installer docker compose, soit via le plugin (recommandé) :

apt install -y docker-compose-plugin

Ou en téléchargeant le binaire :

curl -L https://github.com/docker/compose/releases/download/v2.22.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose

Selon le type d'installation, il faudra utiliser la commande docker compose ou la commande docker-compose.

Utilisation

Fichier compose.yml

Voici un exemple de fichier compose.yml pour déployer un serveur web php.

version: '3.9'
services:
  php: php:apache
  container_name: php
  environment:
  - PUID=1000
  - GUID=1000
  - TZ=Europe/Paris
  ports:
  - '80:80'
  - '443:443'
  volumes:
  - /website:/var/www/html

Lancer la stack

docker compose up -d

[Docker] Swarm

Introduction

Docker Swarm permet de faire de la répartition de charge et de la HA dans vos infrastructures Docker.

Pour cela, on va mettre en place un cluster de noeuds avec des managers et des workers (masters/slaves).

image.png

Prérequis

Installation

Tout d'abord, rendez-vous sur votre Manager pour créer le cluster :

docker swarm init --advertise-addr <manager-IP>

Ensuite, il faut vous connecter sur chaque Workers pour les faire rejoindre votre cluster :

docker swarm join --token <TOKEN>

Le token a été affiché lors de la création du cluster sur le Manager sinon vous pouvez l'afficher avec cette commande :

docker swarm join-token worker

Et pour faire rejoindre des managers :

docker swarm join-token manager

Manuel

Afficher les membres du cluster

docker node ls

Déployer un conteneur dans le cluster

docker service create --name webserver -p 8080:80 nginx

Déployer une stack dans le cluster

docker stack deploy --compose-file compose.yml <STACK_NAME>

Afficher les services

docker service ls

Scale un service

docker service scale <SERVICE_NAME>=3

Supprimer une stack

docker stack rm <STACK_NAME>

Sortir un noeud du cluster

Sur le noeud :

docker swarm leave

S'il s'agit du dernier noeud Manager du cluster, spécifier --force pour supprimer le cluster.

Et depuis le Manager :

docker node rm <NODE_ID>