Gestion de mes services auto-hébergés avec Docker

Auto-hébergement

Ça fait bientôt 12 mois que tous les services que j’héberge sur la SheevaBoite tournent en tant que container Docker et cerise sur le gâteau la SheevaBoite ne s’est jamais aussi bien portée !

Dans ce poste, on va voir comment j’utilise docker pour héberger simplement mes containers et pouvoir tester de nouveau services rapidement. On va donc installer une instance de Plex et une instance de PlexPy qui permet de surveiller qui consomme quoi sur votre instance Plex.

Pré-requis

Bien entendu, il faut avoir installer Docker sur votre serveur et docker-compose, c’est ce dernier outil qui va permettre de se simplifier la vie… Pour installer docker, vous trouverez ce qu’il vous faut dans la doc officielle et pour docker-compose une simple commande dans votre terminal vous l’installera en moins de 20 secondes si vous utilisez Debian :

apt-get install docker-compose

Si vous n’utilisez pas Debian, vous devrez chercher un peu, mais voila avec ces deux binaires installés, les choses sérieuses peuvent commencer.

docker-compose

docker-compose est un outil génial qui est prévu pour gérer des applications complexes (qui nécessitent de gérer plusieurs containers) en démarrant les multiples containers qui peuvent être nécessaires à l’appli. Je change un peu le rôle de docker-compose pour mon besoin, c’est à dire qu’il va gérer les différents services que je souhaite faire tourner.
Ainsi au lieu d’avoir un docker-compose.yml par application je vais avoir un fichier pour gérer tout mes services.

Création du fichier docker-compose.yml

Pour mes deux services que je veux “Plex” et “PlexPy” voici le docker-compose.yml :

version: '2'
services:

 plex:
    image: linuxserver/plex
    container_name: plex
    environment:
      - VERSION=latest
      - PUID=1000
      - PGID=1000
      - TZ=Paris
    ports:
      - ’9001:32400'
    volumes:
      - 'plex:/config'
      - 'plex_transcode:/transcode'
      - '/home/johan/data:/data/'

  plexpy:
    image: linuxserver/plexpy
    container_name: plexpy
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Paris
    ports:
      - ‘9002:8181'
    volumes:
      - 'plexpy:/config'

volumes:
  plex:
    driver: local
  plex_transcode:
    driver: local
  plexpy:
    driver: local

Si vous connaissez un peu Docker, vous n’aurez pas grandes difficulités à comprendre les paramètres de démarrages des containers. Néanmoins, voici quelques explications :

Et voilà, c’est aussi simple que ça, les paramètres sont suffisamment explicites et il y a pas mal de paramètres de Docker qui peuvent être configuré dans le docker-compose.yml mais qui sont déjà pré-configurés avec de bonnes valeurs par défaut.

Utilisation de docker-compose

On va démarrer les containers avec la commande suivante qui permet de les démarrer en mode “detached”, c’est à dire que les containers démarreront comme application “en background” :

$> docker-compose up -d

Avec cette commandes, tous les containers du fichier docker-compose.yml sont démarrés. Il peut être une bonne idée de vérifier qu’ils soient effectivement «up» avec la commande suivante, car comme on démarre les containers en mode “detached”, on est pas informé des erreurs qui peuvent se produire au démarrage :

$> docker-compose ps
    Name                   Command               State                                       Ports
-----------------------------------------------------------------------------------------------------
plex            /init                            Up      0.0.0.0:9001->32400/tcp, 32400/udp, [...]
plexpy          /init                            Up      0.0.0.0:9002->8181/tcp

Un autre moyen de vérifier que les services sont bien démarrés est de s’y connecter… Normalement vous devriez pouvoir accéder à Plex via http://server.local:9001 et à PlexPy via http://server.local:9002.

Maintenant si je veux arrêter le container plexpy, la commande est la suivante :

$> docker-compose stop plexpy

A chaque nouveau service que je veux tester, c’est aussi simple que d’ajouter un bloc dans le docker-compose.yml et un de faire un docker-compose up -d.

Mise à jour des containers

C’est super pratique mais ce n’est pas le Pérou. Si il y a bien une chose que je détestais faire avec les services que j’installais à la main, c’était les mise à jour, je me souviens parfois, je serrais très fort les fesses de peur de tout casser.

Avec Docker et docker-compose c’est devenu ultra simple… Une simple commande va télécharger la dernière version de l’image d’un container et il ne restera plus qu’à redémarrer le service. Toutes les mises à jour de dépendances comme un passage de python 2 à 3, la migration de mysql à postgresql ou les trucs qui peuvent être chiant à gérer à la main sont automatiquement gérés par les images Docker. Ainsi pour mettre à jour mes 2 containers, j’utilise :

$> docker-compose pull

Et auto-magiquement Docker va télécharger les dernières versions des images de mes containers, un petit docker-compose up -d s’occupera de redémarrer les containers qui viennent d’être mise à jour et en général c’est tout bon ! Oui en général parce que vous devrez toujours mettre à jour la conf de votre container si il y a des breaking change. (Oui c’est toi que je regarde Gitlab)

Conclusion

Voila, pour mon utilisation basique de Docker, c’est comme ça que j’ai démarré en accédent à mes services en me souvenant des ports que je publiais. Dans un prochain article, nous verrons comment avoir de belles URLs avec un joli certificat SSL grâce à Let’s encrypt.

Dans cet exemple, je n’ai utilisé que 2 containers mais j’en ai 18 qui tournent en ce moment et croyez moi le docker-compose pull est vraiment très très utile.

Je tiens également à préciser que si vous voyez des erreurs ou que vous avez de meilleurs pratiques à suggérer je suis preneur de vos retours. J’utilise Docker dans mon travail de dév mais je n’ai pas fini d’apprendre avant d’utiliser correctement Docker et je reconnais volontiers qu’il y a des choses que je dois pouvoir améliorer.

En conclusion, cet exemple me convient pour l’utilisation que j’en ai : gérer facilement les différents services que j’héberge sur mon serveur.

N.B : Si vous comptez utiliser Plex à l’extérieur de votre réseau il ne faudra pas oublie de modifier la conf dans les réglages du serveur Plex.

On n’a pas abordé la configuration de PlexPi, si vous voulez l’utiliser il faudra le configurer pour qu’il puisse se connecter à votre instance Plex.

Partager