Guide : installer Docker et Portainer sur Debian

Installer Docker et Portainer sur Debian

Photo par Abigail Lynn via Unsplash

Après avoir vu comment installer Nginx et générer notre premier certificat avec Acme.sh, je vous propose un second tutoriel pour installer Docker et Portainer, qui nous serviront pour les prochaines guides que je posterai ici.

Je n’utilisais pas du tout Docker il y a encore quelques mois, mais il faut bien avouer que ces petits conteneurs sont très pratiques pour installer rapidement tous les applications et outils indispensables sur un serveur maison.


Installation de Docker

Ce guide s’applique aux machines tournant sous Debian. Si vous utilisez OMV, Docker peut être installé facilement depuis la webui. Si vous utilisez un autre système Linux, les instructions ne devraient pas différer énormément, mais je vous invite tout de même à consulter la documentation officielle.

Je pars du principe que toutes les commandes sont lancées en root. Nous allons commencer par installer quelques paquets nécessaires à l’installation des paquets officiels Docker :

 apt-get update

 apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

On ajoute ensuite la clé GPG de Docker à notre système :

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

On va ensuite ajouter les dépôts officiels de Docker à nos sources :

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

Il ne reste plus qu’à mettre à jour la liste des paquets et à installer Docker :

 apt-get update

 apt-get install docker-ce docker-ce-cli containerd.io

Installation de Portainer

Portainer est un conteneur Docker qui a pour but de faciliter l’installation et la gestion de vos autres conteneurs Docker. Pour faire simple, il va nous permettre de nous affranchir totalement de la ligne de commande pour déployer des conteneurs, les mettre à jour et gérer leurs paramètres.

Comme tous les conteneurs, son installation est particulièrement simple et ce sera le seul conteneur que nous aurons à créer depuis la ligne de commande. Pour ce faire, il suffit simplement de lancer cette commande :

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

Une fois le conteneur lancé, il suffit de se rendre sur http://@IPduserveur:9000 pour accéder à Portainer. Les étapes de configuration sont ensuite limpides et vous devriez vous en sortir.

Mettre à jour Portainer

Portainer permettant de mettre à jour facilement nos conteneurs, il peut être tentant de l’utiliser également pour le mettre à jour lui-même. Spoiler : c’est une mauvaise idée qui va tout simplement casser votre Portainer. Suivez le guide…

Nous allons tout d’abord arrêter le conteneur puis le supprimer. Comme nous utilisons un volume, les données importantes du conteneur ne seront pas supprimées. On télécharge ensuite la dernière image de Portainer, puis nous relançons le conteneur avec les mêmes réglages qu’à l’origine.

docker stop portainer
docker rm portainer
docker pull portainer/portainer-ce:latest

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

Portainer est maintenant à jour et tous ses réglages ont été conservés.

Portainer derrière un reverse proxy Nginx

Nous avions vu dans un précédent tutoriel comment installer Nginx et générer un certificat SSL avec Let’s Encrypt. Nous allons donc utiliser Nginx en tant que reverse proxy pour Portainer afin d’y accéder de façon plus sécurisée avec notre propre domaine. De plus, nous allons forcer le conteneur à utiliser l’adresse localhost du serveur, ce qui empêchera l’accès direct au port 9000.

Comme lors de la mise à jour de Portainer, nous allons stopper et supprimer le conteneur. Puis, nous allons le relancer en ajoutant 127.0.0.1 devant le port 9000. Seul le serveur hôte (et donc Nginx) pourra alors accéder directement à la webui de Portainer.

docker stop portainer
docker rm portainer

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

On va maintenant ajouter un nouveau fichier de configuration pour nginx /etc/nginx/sites-enabled/portainer.domain.tld.conf et y coller la configuration suivante (sans oublier de modifier les différentes informations usuelles) comme indiqué dans mon précédent guide :

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

server {
  listen              80;
  server_name         portainer.domain.tld;
  location / {
    return              301 https://$server_name$request_uri;
  }
}

server {
    listen 443 ssl http2;
    server_name portainer.domain.tld;

    include /etc/nginx/ssl/ciphers-domain.tld.conf;

    access_log /var/log/nginx/portainer.domain.tld.log combined;
    error_log /var/log/nginx/portainer.domain.tld.log error;

    location / {
        proxy_pass http://127.0.0.1:9000;
        proxy_set_header Host $host;
        proxy_redirect http:// https://;
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

On redémarre nginx :

systemctl restart nginx

Et voilà, Portainer est maintenant accessible depuis votre navigateur via https://portainer.domain.tld. Si vous avez suivi ce guide correctement, vous ne devriez plus pouvoir accéder à l’application via l’adresse IP de votre serveur suivie du port 9000.


Comme toujours, si vous avez la moindre question, n’hésitez pas à la poser dans les commentaires ou à me contacter sur Twitter, c’est là que je suis le plus actif.