Avant toute chose, pourquoi Alpine Linux ?

Je résume en quelques mots cette distro: légèreté, sécurité, performance et surtout simplicité. On en revient à l’essentiel. Beaucoup d’images Docker tournent sous Alpine Linux d’ailleurs. On peut dire qu’elle représente la philosophie du “juste nécessaire” à son paroxisme.

Sa taille réduite est due à l’utilisation de la librairie musl au lieu de glibc (GNU). Cette librairie est à l’opposé total de glibc majoritairement utilisé: le moins est le mieux.

Alpine utilise également Busybox, une “boite d’outils élémentaires” comme “ls”, “mv”…le strict nécessaire pour pouvoir administrer un système Linux. Toujours cette même philosophie.

Et pourquoi Docker Rootless ?

Docker Rootless, c’est un peu la réponse au gars qui se fait prendre la main dans le sac et qui dit : “Ouais mais y’avait les clés sur la porte!”. Pour ceux qui ne le savent pas, je ne le savais pas non plus avant de démarrer ce projet, toute instance Docker standard tourne sur le compte Root. Pour quelle raison ? Je ne sais pas exactement, j’imagine que c’était plus simple à designer ainsi. Sauf que niveau sécurité, on y est pas, vous vous en doutez. Du coup, pour palier ça, il y a (Podman 😄 ) Docker Rootless !

Quelques infos…

Il faut savoir que Docker Rootless est assez répandu maintenant, par contre sur le net j’en ai pas vu beaucoup des gus qui voulaient le faire tourner sous Alpine. J’en ai trouvé un, vraiment pas mal mais j’ai du faire plusieurs modifs car il manquait des choses ou c’était mal expliqué. Bref, apparemment, c’est pas courant. Je ne sais pas tellement pourquoi, je vous avoue que je prends tout juste mes marques dans le monde Linux 😊.

Limitations et contraintes

Comme je l’expliquais juste avant, le rootless va faire que votre démon Docker tournera non pas sur le compte root mais sur un compte user plus standard (dédié, évidemment!).

Et si on fait ça, on s’enlève forcément quelques possibilités liées au fait que pour certaines actions on aurait besoin d’être root. Certaines fonctionnalités sont donc désactivées et peuvent ne pas fonctionner dans vos conteneurs. Les ports réseaux sytème ne sont pas fonctionnels en dessous de 1024 (on verra comment le contourner facilement, c’est qu’une autorisation à ajouter).

Il peut également y avoir des impacts sur les performances, le Rootless étant un peu “expérimental” c’est comme si on le mettait dans une pièce tout seul en faisant des petits trous pour qu’il puisse accéder à certaines choses.

C’est quoi le projet ?

Pour poser un peu de contexte, tout ça est dans le but de pouvoir faire tourner un Gitlab et surement deux ou trois autres containers et le rendre accessible depuis l’extérieur. Niveau sécurité, il nous faut donc être au mieux.

L’installation

Je vous préviens, je pars du principe que vous ne connaissez pas Alpine Linux et que vous venez de l’installer fraichement. Vous avez donc normalement un compte root et un compte utilisateur.

# En root, si vous n'y êtes pas:
su -
vi /etc/apk/repositories # Décommenter la ligne du repo Community
apk update
apk add doas # Equivalent de sudo
adduser dockuser
adduser dockuser wheel
vi /etc/doas.d/doas.conf # ajouter la ligne :
    permit persist :wheel
apk add shadow-uidmap fuse-overlayfs iproute2
vi /etc/rc.conf # décommenter la ligne rc_cgroup_mode et mettre la valeur « unified »
rc-update add cgroups && rc-service cgroups start
modprobe tun
echo tun >>/etc/modules
echo dockuser:100000:65536 >/etc/subuid
echo dockuser:100000:65536 >/etc/subgid
apk add docker docker-cli-compose curl
addgroup dockuser docker
echo "ip_tables" >> /etc/modules
modprobe ip_tables
su - dockuser # se loguer sur le compte dédié

A partir de maintenant, vous êtes sur le compte dédié au Docker Rootless

curl -fsSL https://get.docker.com/rootless | sh # Installer docker Rootless
doas vi /etc/init.d/docker-rootless # Enregistrer le contenu ci-dessous
    #!/sbin/openrc-run
    name=$RC_SVCNAME
    description="Docker Application Container Engine (Rootless)"
    supervisor="supervise-daemon"
    command="/home/dockuser/bin/dockerd-rootless.sh"
    command_args=""
    command_user="dockuser"
    supervise_daemon_args=" -e PATH=\"/home/dockuser/bin:/sbin:/usr/sbin:$PATH\" -e HOME=\"/home/dockuser\" -e XDG_RUNTIME_DIR=\"/home/dockuser/.docker/run\""

    reload() {
        ebegin "Reloading $RC_SVCNAME"
        /bin/kill -s HUP \$MAINPID
        eend $?
    }
doas chmod +x /etc/init.d/docker-rootless
doas rc-update add docker-rootless
doas rc-service docker-rootless start
vi /home/dockuser/.profile # Créer le fichier et y placer le contenu suivant
    export XDG_RUNTIME_DIR="/home/dockuser/.docker/run"
    export DOCKER_HOST=unix:///home/dockuser/.docker/run/docker.sock
    export PATH="/home/dockuser/bin:/sbin:/usr/sbin:$PATH"
doas reboot

Ici, la partie configuration est terminée. Ensuite on va tester pour s’assurer que ça tourne bien en dehors du compte root.

# Se loguer sur le compte dédié dockuser
su - dockuser

# Vérifier avec les commandes suivantes que le docker rootless fonctionne
docker ps
docker run --rm hello-world
# Autoriser les ports systèmes en rootless (facultatif) à partir du 21
doas sysctl -w net.ipv4.ip_unprivileged_port_start=21 # Méthode temporaire pour tester (vous mettez le port en dessous de 1024 que vous voulez !)

doas vi /etc/sysctl.conf # Méthode définitive, nécessitera un reboot
	net.ipv4.ip_unprivileged_port_start=21 # Inscrire cette ligne à la fin du fichier 

# Tester avec un container Nginx
docker run --name mynginx1 -p 80:80 -d nginx
# Vous devez pouvoir atteindre l'IP de votre hôte Docker en HTTP et voir l'accueil Nginx
ps aux | grep -e '-container-port 80 ' # Vous devez voir "dockuser" dans la deuxième colonne, si c'est le cas le rootless fonctionne et le container est lancé avec ce compte.

👏 Voilà, si vous atteignez votre serveur Nginx c’est que tout est bon côté Docker et si le ps aux montre que vous tournez bien sur le compte dockuser, alors vous en avez terminé et vous pouvez ajouter ça à votre CV.

Pour supprimer le container de test:


docker rm mynginx1 --force # Suppression du container test

⚠️ Il y a d’autres méthodes pour valider la config que Nginx, mais pour valider la partie réseau sur le 80:80 il me fallait quelque chose de rapide et léger.

🔥 Il est possible de faire fonctionner Dockge sur cette config.

Faites-moi signe si ça vous intéresse car il y a quelques subtilités au niveau des droits où j’ai bien galéré !

Mot de la fin

Voilà pour ce rapide tuto, j’espère qu’il vous sera utile en tout cas moi il devrait servir d’ici peu et je vous ferai un retour sur le long terme.