Installer Docker

Guide d'installation de Docker.

Installer Docker
docker lxc virtual machines

Au sommaire :

  • 1-Qu'est-ce que Docker et les conteneurs ?
  • 2-Installer Docker dans une machine virtuelle.
  • 3-Installer Docker dans un conteneur LXC.
  • 4-Pourquoi installer Docker dans un conteneur LXC ?

1-Qu'est-ce Docker et les conteneurs ?

Ce sujet ayant déjà été abordé, replongez vous dans l'histoire des conteneurs.

Une brève histoire des conteneurs
Une brève histoire des conteneurs.

2-Installer Docker dans une machine virtuelle

Pour cette partie, nous allons l'installer dans une machine virtuelle avec Ubuntu 22.04 LTS comme distro.

Virtualiser Ubuntu Server 22.04 LTS sur Proxmox VE
Guide d’installation de Ubuntu Server 22.04 LTS sur Proxmox VE avec mes meilleurs réglages.

Cherchez et mettez à jour le système.

sudo apt update && sudo apt upgrade -y

Installez les paquets suivants :

  • apt-transport-https : transport d'APT pour télécharger par HTTPS (protocole de transfert hypertexte sécurisé).
  • ca-certificates : permet l'ajout de certificats CA.
  • curl : récupération de données à travers une URL.
  • software-properties-common : abstraction de apt. Facilite la gestion des dépôts.
sudo apt install -y \
apt-transport-https \
ca-certificates \
curl \
software-properties-common

Ajoutez la clés GPG avec curl en l'ajoutant à /usr/share/keyrings.

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Ajoutez le dépôt de Docker avec la commande "echo" dans le dossier /etc/apt/sources.list.d.

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Mettez à jour les dépôts.

sudo apt update

Et enfin, installez le paquet "docker-ce".

sudo apt install docker-ce -y

Pour pouvoir utiliser docker sans la commande "sudo", ajoutez l'utilisateur au groupe docker avec la commande suivante.

sudo usermod -aG docker username

C'est pas obligatoire pour ce tutoriel mais prenez l'habitude de rédiger vos manifestes avec Docker Compose au lieu de faire du "docker run", ça aide à être mieux organisé.

Tout d'abord, créez un dossier "cli-plugins" dans le dossier "/home/user_name/.docker".

mkdir -p ~/.docker/cli-plugins/

Avec la commande "curl", téléchargez la version 2.14.2 de Docker Compose sur à partir du dépôt Github.

curl -SL https://github.com/docker/compose/releases/download/v2.14.2/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose

Rendez le fichier executable avec la commande "chmod +x".

chmod +x ~/.docker/cli-plugins/docker-compose

Enfin, vérifiez la version de Docker Compose.

docker compose version

Dans le terminal, tapez "id" et notez l'identifiant de votre utilisateur et du groupe "docker.

Ensuite, éditez le fichier /etc/environment" et ajoutez ces variables.

  • PUID : identifiant de l'utilisateur (le vôtre),
  • PGID : identifiant du groupe (docker),
  • TZ : le fuseau horaire (Europe/Paris si vous êtes en France),
  • APPDATA : le dossier qui contiendra toutes les configurations de vos conteneurs.
PUID=1000
PGID=999
TZ="Europe/Paris"
APPDATA="/home/user_name/appdata"
MEDIAS="/home/user_name/medias"

Pour l'exemple, je met le dossier "appdata" à la racine du dossier utilisateur mais je vous conseille plutôt de stocker de le stocker en dehors de la machine virtuelle, que ce soit sur un disque interne (SATA), externe (USB) ou un partage NFS.

Déconnectez vous avec la commande "logout".

3-Installer Docker dans un conteneur LXC

On va voir ensemble comment créer un conteneur LXC.

Général

Tout d'abord, indiquez :

  • Un nom,
  • Un mot de passe
  • La clé SSH de votre poste client (pour plus de confort).

On remarque deux options très intéressantes :

  • Nesting : Il permet de créer des conteneurs LXC/LXD ou Docker dans le conteneur principal, un peu comme la virtualisation imbriqué avec les machines virtuelles (sujet de cet article).
  • Unprivileged : Conteneur non privilégié, ce qui signifie qu'il aura des restrictions d’accès (pas de partage SMB/NFS, pas d’accès à certains modules du kernel). Ce qui signifie une meilleure isolation car si l'attaquant sort du conteneur, il ne se retrouvera pas en tant que root du serveur principal et aura des droits extrêmement limités. Un conteneur privilégié n'aura pas ces restrictions mais en cas de compromission de ce dernier, l'attaquant pourra remonter jusqu'à la racine du serveur et provoquer beaucoup de dégâts. À éviter donc en production.

Template

Sélectionnez votre template (Ubuntu 22.04 LTS pour l'exemple).

Disks

Mettez la taille que vous voulez. Vous pourrez l'augmenter sans avoir besoin de redémarrer le conteneur contrairement à une machine virtuelle.

CPU

On remarque que seul les cores sont disponible. Pas de NUMA ou de socket dans un conteneur, n'oublions pas qu'un conteneur est UNIQUEMENT un processus et rien d'autre.

Memory

Dans l'onglet “Mémory”, allez y doucement et tester la consommation en mémoire de votre conteneur (et de vos conteneurs Docker).

Network

Choisissez une adresse IP statique et la passerelle de votre réseau local en IPv4/IPv6.

On remarque qu'on peut :

  • Changer le nom de l'interface réseau,
  • Créer une adresse MAC bien précise (utile si l'authentification par adresse MAC),
  • Indiquer le pont réseau (vmbr0 par défaut),
  • Indiquer un VLAN,
  • Limiter la bande passante par seconde (par défaut il n'y a aucune limite),
  • Activer les régles de pare-feu de Proxmox VE,

DNS

Vous pouvez soit utiliser les paramètres DNS du serveur, soit ajouter des DNS spécifiques.

Confirm

Confirmez la création du conteneur.

Il y a quelques modifications à effectuer au préalable. Il vous faut activer deux options en particulier mais avant, abordons l'ancienne méthode que j'utiliser aux alentours de 2020 de mémoire.

L'ancienne méthode pour pourvoir exécuter des conteneurs Docker dans un conteneur LXC était la suivante.

Il fallait créer un conteneur privilégié, modifier le fichier de configuration du conteneur et indiquer :

  • Que Apparmor soit désactivé.
  • D'autoriser à LXC l'accès à tout les périphériques par défaut.
  • "spécifiez la capacité à abandonner dans le conteneur" (je connais pas trop l'utilité de cette option pour être honnête).
# Variables

export LXCID="105"

# insert this for use docker in LXC (no need nested mode)

echo "lxc.apparmor.profile: unconfined" >> /etc/pve/lxc/${LXCID}.conf
echo "lxc.cgroup.devices.allow: a" >> /etc/pve/lxc/${LXCID}.conf
echo "lxc.cap.drop:" >> /etc/pve/lxc/${LXCID}.conf

Cette méthode est obsoléte. Plus besoin de créer un conteneur privilégié, vous pouvez le laissé en non privilégié par défaut à moins d'avoir besoin de monter un partage SMB/NFS.

Il vous suffit simplement d'activer les options keyctl et Nesting.

Via le CLI, il faut ajouter la ligne suivante au fichier /etc/pve/lxc/LXC_ID_.conf.

features: keyctl=1,nesting=1

Note : j'ai rien trouver sur l'utilité de keyctl mais pour Nesting, c'est pour créer des conteneurs dans un conteneur.

Lorsque vous aurez activer ces deux options, démarrez votre votre conteneur, connectez vous en SSH (ou via l'interface web de votre serveur PVE) et commencez par créer un utilisateur avec la commande "adduser".

root@docker:~# adduser "votre_identifiant"

Ajoutez l'utilisateur au groupe "sudo".

root@docker:~# sudo usermod -aG sudo patrick

Par défaut, seul le compte root est disponible dans un conteneur LXC. Vous savez, le compte qui a ABSOLUMENT tout les droits.

Pour pouvoir utiliser docker sans la commande "sudo", ajoutez l'utilisateur au groupe docker avec la commande suivante.

root@docker:~# sudo usermod -aG docker patrick

Enfin, déployez votre premier conteneur pour vérifier que tout fonctionne.

docker run hello-world

Si vous avez ce message à l'écran félicitation, Docker est fonctionne dans votre conteneur LXC.

4-Pourquoi installer Docker dans un conteneur LXC ?

La bonne pratique est d'installer Docker dans une machine virtuelle car comme indiqué dans mes articles précédents, Docker est dépendant du noyau et nécessite des accès root.

Donc au moindre problème dans une machine virtuelle (HomeLab ou production), cela n'impactera pas le noyau de l'hyperviseur et les autres machines virtuelles qui tournent en parallèle.

Auparavant, pour installer des conteneurs Docker dans un conteneur LXC, il fallait que ce dernier sois en privilégié, ce qui est déconseillé dans une optique de production (rien de grave dans un HomeLab).

Mais depuis peu, vous pouvez déployer des conteneurs Docker dans un conteneur LXC en privilégié sans aucun problème (nous verront ça plus en détail).

Donc concrètement, pourquoi choisir cette méthode ?Il y a deux avantages :

  • Pas de virtualisation,
  • Pas d'émulation des périphériques,

En exécutant des conteneurs Docker dans des conteneurs LXC, vous évitez d'alourdir votre serveur avec l'émulation des périphériques via QEMU et vous avez déjà un accès direct aux ressources du matériel donc KVM est inutile dans ce cas.

Au final, vous économisez des ressources et vous avez des performances bare-metal.

L'idée trotté déjà dans ma tête (j'avais des Dell Optiplex 755 SFF sous Core 2 Duo donc pas des bêtes de course) et je chercher un moyen d'économiser des ressources.

Et j'avais trouver cette conférence que je vous met en lien qui explique comment installer Docker et Kubernetes dans des conteneurs LXC/LXD.

Elle date de 2017 mais vous allez apprendre pas mal de choses.

Source :

How To Install and Use Docker on Ubuntu 22.04 | DigitalOcean
Docker is an application that simplifies the process of managing application processes in containers. In this tutorial, you’ll install and use Docker Commun…
apt-transport-https(1) — apt — Debian unstable — Debian Manpages
curl