Docker et Portainer part 1 – Les conteneurs pour les nuls

Docker et Portainer

Bonjour à tous, aujourd’hui je commence la série de post sur Docker et Portainer suite à la migration du site sur le nouveau serveur. Et pour me faciliter les futures migrations, je me suis enfin décidé à « dockerisé » les applis que j’ai sur la machine… et comme ça je serai pas seul à être confiné dans cette histoire.

Pour votre culture le changement de serveur fait suite à la panne sur le dernier que j’ai décrit ici. Du coup, j’ai en profité pour faire le passage au SSD, ipv6 en natif via l’hébergeur, passage à Debian 10 et j’ai rapatrié le serveur en France aussi tant qu’a y être.

Rappel des articles de la série « Docker et Portainer » :

C’est quoi Docker ?

Un Docker, ça ressemble à une VM, ça a le gout et l’odeur d’une VM, mais c’est pas une VM. Docker, c’est le principe d’isolation du système d’exploitation sur machine virtuelle mais pour les applications. Comme le dit Wikipédia : « l’idée c’est empaqueter une application et ses dépendances dans un conteneur isolé, qui pourra être exécuté sur n’importe quel serveur« . Et au lieu de virtualiser le hardware, un conteneur « virtualise » plutôt l’accès à l’OS via une API (et c’est le format LSX pour docker).

Avantages et inconvénients

Les avantages :

  • Plus performant qu’une VM : Docker c’est beaucoup moins lourd et donc plus performant, notamment sur des « petites » configuration (parce que les VM sur des grosses infra ça déboite quand même).
  • Isolation : Et par rapport à du package système traditionnel (genre rpm ou deb), chaque conteneur est isolé des autres et vient avec ses propres dépendances indépendamment des autres conteneurs. Plus de problème de ce côté mais au détriment de l’espace disque.
  • Minimalité : un conteneur ne vient qu’avec les dépendances dont il a besoin en interne, un attaquant qui arrive à rentrer dans un conteneur n’aura pas accès aux outils de l’OS mais uniquement ceux présent dans le conteneur par exemple.
  • Portabilité : Un conteneur est auto-porteur et auto-documenté, on le détaillera dans les prochains articles mais un docker est défini via un fichier de configuration (en gros). Donc on peut le basculer d’un serveur à l’autre en ayant la garantie qu’il fonctionnera de la même manière, ce qui simplifie énormément la maintenance et le suivi.

Les contreparties :

  • Performances : forcément quand on rajoute une couche, on impacte légèrement les perf et donc on reste moins performant qu’une appli portée normalement dans l’OS.
  • Gestion inter-conteneurs : tant que vos conteneurs sont « monolithiques », tout ira bien. Si vos conteneurs doivent communiquer entre eux et entre différente stacks (ensemble de conteneurs), potentiellement inter-dépendantes ça peut vite devenir « un peu tricky« , surtout si vous en avez beaucoup.
  • Sécurité : Certes les conteneurs sont isolés entre eux, donc c’est mieux que rien, mais ils partagent tous une API sur le même OS, donc une faille dans cette partie et tout les conteneurs de votre hôte se feront plier.

Portainer ?

Docker est un outil utilisable en ligne de commande, pour le coup c’est pas hyper agréable à utiliser au quotidien (mais ça se fait, hein). Ce qui serait top c’est d’avoir une IHM Web qui permette de gérer les opérations courantes sur ses conteneurs. Et ça tombe bien, il existe Portainer pour ça et manager facilement vos Dockers. Portainer s’installe comme un conteneur docker pour simplifier sont déploiement. Portainer permet de gérer une bonne partie des éléments de docker : conteneurs, images, volumes, réseaux, utilisateurs, etc.

Installer Docker et Portainer

Docker

La documentation d’installation docker pour Debian est disponible ici, mais elle est finalement assez simple :

Installation des dépendances :

apt-get update
apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg2 \
    software-properties-common

Ajout du repository Docker officiel, mise à jour et installation depuis ce dépôt.

curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
apt-key fingerprint 0EBFCD88 # vérifier
add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io

Démarrer Docker et ajouter un premier docker dans les services à lancer au démarrage du serveur :

systemctl enable docker
docker run hello-world

Pour ceux qui veulent faire tourner docker par un utilisateur lambda, c’est possible et la doc est par ici.

Portainer

Pour l’installation de Portainer ça tout se fait simplement comme ça.

D’abord, il faut créer un « volume » Docker, vous pouvez le voir comme un partage qui sera monté dans votre conteneur. Si vous ne créez pas ce volume, à chaque redémarrage de votre conteneur toutes les données seront effacées pour revenir à l’état initial. et C’est ce volume que vous devez sauvegarder à minima. Bref, vous pouvez le créer comme ça.

docker volume create portainer_data

Puis simplement créer conteneur pour Portainer :

# docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer:latest

« Attend mais c’est tout là ? on télécharge pas de fichier source ? » bein oui, en fait docker va regarder s’il a l’image demandée dans sa base locale et sinon il ira la télécharger comme un grand sur hub.docker.com.

Je m’arrête quand même 2 seconde sur les paramètres de la commande :

  • -d : mode detached (un peu similaire à un mode daemon), pour éviter d’avoir les redirections d’entrée sortie de votre conteneur dans votre shell.
  • -p 8000:8000 -p 9000:9000 : c’est pour redirection de port, la partie réseau de Docker fonctionne via un réseau local privé (dans 172.16.0.0/12 par défaut) et va mettre en place un NAT avec iptables devant docker pour permettre d’accéder au service depuis l’extérieur.
  • –name=portainer : le nom que vous voulez donner à votre conteneur et qui sera affiché dans l’interface.
  • –restart=always : le comportement que docker doit avoir en cas d’arrêt du conteneur.
  • -v portainer_data:/data : indique où monter le volume qu’on a créé dans le conteneur (et pareil pour la socket docker juste avant pour que portainer communique avec docker).

Configuration de Portainer

Une fois le conteneur démarré, connectez vous en http sur le port 9000 (pensez au firewall si besoin) de votre serveur pour configurer le mot de passe d’admin initial.

Docker et Portainer

Portainer vous permet de gérer votre instance locale de docker mais aussi un serveur docker distant, via un agent ou pas, et carrément sur le service Docker d’Azure. On va sélectionner la version locale puisqu’on est dans ce cas-là :

Docker et Portainer

Vous allez arriver sur la page d’accueil de Portainer qui va vous permettre de gérer vos environnements Docker. Il suffit de cliquer sur « local » ci-dessous pour lister vos dockers disponibles :

Docker et Portainer

Et ensuite afficher, les containers Docker que vous avez déjà sur votre hôte en cliquant sur containers :

Et on retrouve alors les 2 conteneurs que l’on a mis en place : soit hello-world et Portainer lui même, la boucle est bouclée :

Docker et Portainer

Conclusion Docker et Portainer

Voilà, c’est tout pour la mise en place de Docker et Portainer. Portainer c’est vraiment top pour gérer vos conteneurs au quotidien, je vous invite vraiment à l’utiliser pour faire du docker, c’est beaucoup moins ésotérique et bien plus confortable que la ligne de commande. on presque l’impression de gérer des VM parfois.

Dans les prochains TP on verra comment déployer d’autres conteneurs, en particulier au travers des « stacks » avec docker compose, comment créer des sous-conteneurs modifiés à partir d’images existantes, ou encore gérer la partie réseau correctement.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.