Docker pour les noobs : Portainer (Linux ,Windows OSX), cohabitation avec ProxMox...

Docker 1 janv. 2018

Docker c’est bien. Docker c’est beau. Mais Docker c’est du CLI et ça peut rebuter. En revanche ça peut vous faciliter la vie si vous voulez gagner du temps, n’êtes pas à l’aise en CLI ou si votre serveur “tourne bien et je VEUX PAS Y TOUCHER SINON JE VAIS TOUT PLANTER !!!!” :)

Du coup y’a un marché pour les WebUI/GUI pour Docker et le plus intéressant est le projet Portainer.io, qui fonctionne pour Linux, Windows et OSX.

Portainer s’installe en quelques commandes simples et permet de gérer depuis une interface ergonomique un Docker local ou distant et tout ce qui va avec : containers, paramètres, IP, données, clusters, nom de domaines…

  1. Installation Docker & Portainer (Linux seulement)
  2. Déplacer le dossier racine de Docker (Linux seulement)
  3. Utilisation (exemple d’un container ruTorrent)
    1. Ports de communication
    2. Stockage local
    3. Fichier de configuration externe
    4. Divers

 

 

Installation

J’installe Docker & Portainer sur un de mes serveurs hôtes ProxMox (basé sur Debian). De cette manière je peux exploiter une machine (et ses nodes) pour de la virtualisation selon mes besoins.

On commence par ajouter les sources de Docker et l’installer. Commandes exécutées via mon User ayant des droits sudo. Si vous le faites en root retirez sudo des lignes.

sudo apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common
sudo curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
sudo apt update && sudo apt install docker-ce

On crée ensuite un User pour Portainer (que je vais nommer Portainer  \o/) et on l’ajoute au groupe Docker.

sudo adduser portainer
sudo usermod -aG docker portainer

Si vous voulez tester que tout fonctionne bien vous pouvez lancer un hello-world avec votre nouveau User portainer.

test@drive:~# su portainer
portainer@drive:~$ cd ~
portainer@drive:~$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
ca4f61b1923c: Pull complete 
Digest: sha256:be0cd392e45be79ffeffa6b05338b98ebb16c87b255f48e297ec7f98e123905c
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.
[...]

On va ensuite créer un dossier dans le /home de Portainer afin d’y stocker les données du Docker du même nom

portainer@drive:~$ mkdir data

Puis on lance le Docker de Portainer, sur le port 9000 et en lui indiquant qu’il doit mettre les données dans /home/portainer/data. Avec une option pour le relancer à chaque reboot de Docker. Attention les — sont des – – sans espace, mon rendu code foire un peu dans certains navigateurs

docker run -d -p 9000:9000 --restart always --name portainer -v /home/portainer/data:/data -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer

Et tout s’installe puis se lance

portainer@drive:~$ docker run -d -p 9000:9000 --restart always --name portainer -v /home/portainer/data:/data -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer
Unable to find image 'portainer/portainer:latest' locally
latest: Pulling from portainer/portainer
d1e017099d17: Pull complete 
f96966278ba2: Pull complete 
Digest: sha256:261d02375566fd24f3fc0fb358bb5e4c394d82b3e44efb77e1609dd01c3d4369
Status: Downloaded newer image for portainer/portainer:latest
5d7e0d2639c2978f7dd08f20b4b13d9bb5b9860b5e129988a3cae006f1789511

Et pour s’assurer que Docker sera relancé en cas de reboot (faites ça en root ou sudo)

sudo systemctl enable docker

Après 1 à 2 minutes il suffit de vous rendre sur IP:9000 pour accéder à son interface. Créez votre super mot de passe de la mort qui tue et comme nous sommes dans le cas d’un Docker local, il faut donc sélectionner Local.

Si vous avez un nom de domaine affecté à cette machine rendez-vous dans Endpoints / Local et entrez le domaine. De cette manière tous vos Dockers auront un accès domaine:port au lieu de IP:port. C’est juste esthétique mais c’est plus sympa :)

Je vous laisse découvrir l’interface qui est plus qu’intuitive. Ce qui va nous intéresser dans ce rapide tutoriel c’est uniquement l’onglet Containers.

 

 

Déplacer Docker

Je dois déplacer Docker, du moins son dossier de stockage par défaut, étant donné que je l’ai installé sur un serveur ProxMox dont le / ne fait que 10Go, l’espace dédié au stockage étant attribué à /var/lib/vz.

Avec docker info on trouve notamment l’emplacement actuel du dossier de travail de Docker

portainer@drive:~$ docker info
[...]
Docker Root Dir: /var/lib/docker
[...]

Et je veux donc changer ça en /var/lib/vz/Docker. Pour ça il y a 2 méthodes : la crados qui consiste à modifier le fichier de (service) lancement de Docker par Systemctl (avec risque devoir recommencer à chaque update de Docker) ; la propre en ajoutant un fichier de conf qui sera lancé à chaque reboot de Docker. Je prends la 2nde :

Créer le fichier/etc/docker/daemon.json et y indiquer son “nouveau” dossier root pour Docker.

sudo nano /etc/docker/daemon.json

# Contenu

{
"graph": "/var/lib/vz/Docker"
}

Relancer le daemon Docker (ou rebooter) et docker info nous indique que la modif est prise en compte

portainer@drive:~$ sudo systemctl restart docker
portainer@drive:~$ docker info
[...]
Docker Root Dir: /var/lib/vz/Docker
[...]

 

 

Utilisation

Dans un cadre d’utilisation “simple” le mieux est encore de se rendre sur DockerHub et d’y chercher des containers selon vos besoins. Les Stars désignent la popularité (votée) des dits containers et les Pulls sont le nombre de fois où ils ont été téléchargés/lancés. C’est donc en général révélateur de la qualité d’un container.

Là j’ai besoin de ruTorrent. 2 se détachent du lot lors de ma recherche. Le 1er est celui de Linuxserver.io (bons containers et fiables) mais je vais prendre le 2nd (diameter) vu qu’il propose des outils de sus de rTorrent/ruTorrent.

Pour l’utiliser il va falloir dire à Portainer quel container chercher/ajouter. Il faut alors copier le nom affiché sur DockerHub (en haut à gauche) : diameter/rtorrent-rutorrent

Puis on l’ajoute dans l’onglet Containers / Add container

Vient ensuite le moment de la pseudo-configuration du container. Dans cet exemple : ports de communication à ouvrir, dossier de stockage des fichiers à monter, fichier de configuration de rTorrent à remplacer et un reboot automatique du container en cas de reboot de Docker.

 

 

Ports de communication

Tout service Web a besoin de communiquer et/ou d’être accessible. Avec Docker il faut donc ouvrir des ports (et les rediriger le cas échéant) pour chaque container. Portainer permet de le faire de manière automatique (Publish all exposed ports) mais je conseille de ne pas utiliser cette solution sous peine de faire de votre serveur hôte un gruyère… Préférez créer vous-mêmes les redirections nécessaires à chaque container via l’option Map additional port.

Ça sous-entend que vous savez quels ports vous devez ouvrir/rediriger. Rien de compliqué, si la personne qui a fait ce Docker est à 99.99% normale, il suffit de lire les informations sur la source de votre container. Dans ce cas de ruTorrent ce sera ici, section Exposed

  • Web UI ports: 80 and 443 (can be remapped in ‘docker run’) => je dois donc rediriger le port (TCP) 80 du container vers un port de mon serveur hôte (ou port 443 pour du https)

  • DHT UDP port: 49160 (can be remapped) => m’en tape, je ne fais pas d’UDP

  • Incoming connections port: 49161 (can be remapped) => je dois donc rediriger le port TCP 49161 vers un port de mon serveur hôte

Chacun son organisation au niveau des ports, par habitude le 1er container sera toujours en 8081, le 2nd en 8020 etc. Quant au port de ruTorrent (enfin rTorrent plutôt) je n’utilise pas de plage et n’en met qu’un seul : 52735. Prenez ce que vous voulez du moment que c’est > 50000 (moins de filtrage via les FAI). Voici ce que ça donne chez moi

 

 

Stockage local

Un des principes de Docker est d’être non persistent. C’est-à-dire que votre container peut être effacé/MàJ quand vous le voulez. Ce qui implique donc qu’il ne contienne aucune donnée “persistante” : documents personnels, fichiers de configurations personnalisés, fichiers de type BitTorrent/Usenet etc. Il convient donc de monter dans votre container Docker un stockage local. Ce stockage pouvant être une partition, un disque USB/SATA/whatever, un montage NFS local ou ce que vous voulez, du moment que c’est pas “dans” le container.

Encore une fois, pour savoir “comment” le monter (comment faire piger à Docker que /home/Michel sera le dossier où il doit stocker) il faut se référer à la doc du container. Dans ce cas de ruTorrent ce sera ici, section Exposed

  • Downloads volume: /downloads

  • rtorrent scratch files (.rtorrent/{watch|session} will be created automatically): /downloads

  • autodl-irssi config files are created automatically: /downloads/.autodl

  • external rtorrent config (.rtorrent/.rtorrent.rc): /downloads

  • external ruTorrent ui config (config will be created automatically): /downloads/.rutorrent

  • external nginx and rtorrent logs: /downloads/.log/

Ici on voit que tout est dans /download. /download étant dans le container Docker il faut qu’on indique à Portainer de monter ce dossier /download localement (sur le serveur hôte). Je veux que ruTorrent télécharge dans /home/dlbot/torrents

Sélectionnez Bind et Writable.

 

 

Fichier de configuration externe

Un peu sur le même principe que le stockage des fichiers, j’utilise quasi toujours le même fichier de configuration pour rTorrent et je souhaite aussi l’utiliser ici. Comme pour le reste, nous voyons comment procéder ici, section Exposed

  • external rtorrent config (.rtorrent/.rtorrent.rc): /downloads

Il convient donc d’aller éditer/recréer le .rtorrent.rc qui sera dans /downloads/.rtorrent sur le container DONC dans /home/dlbot/torrents/.rtorrent sur le serveur hôte.

Clairement cette étape peut être zappée pour la plupart des utilisateurs. Je suis juste un peu psychorigide quant au tri des fichiers et je préfère sauvegarder cette config si je dois retirer ce Docker :p

 

 

Divers

Histoire d’être tranquille vous pouvez configurer vos containers pour se relancer automatiquement en cas de reboot de Docker.

Vous pouvez aussi limiter les ressources de chaque container. Pratique si vous partagez un serveur avec plusieurs personnes et que vous avez chacun votre container ruTorrent (ou Emby/Plex qui bouffe pas mal de CPU/RAM). Je n’ai pas de conseil sur l’optimisation des ressources, c’est à tester. De toute manière si vous voulez modifier votre configuration d’un container via Portainer il suffit d’aller l’éditer et de le redéployer. Cette action effacera le container actuel, d’où l’intérêt de sauvegarder fichiers/configs localement.

Vous pouvez également ajouter des paramètres au lancent d’un container, via l’onglet Env. Par exemple la claimkey de Plex, dans ce cas vous ajoutez (name) PLEX_CLAIM et (value) la_clé   :)

Mots clés