Généralités

Docker est un logiciel libre permettant de gérer le déploiement de containers. Ceci permet d'isoler des processus au sein d'un système hôte Linux. Au ResEl nous nous servons de Docker pour quelques services, ce qui permet de les tester facilement et de les déployer facilement sur les différentes machines.

Un registre docker interne au ResEl est disponible sur Whitewhale. Il permet de partager les images docker du ResEl sans utiliser le registre publique (hub.docker.com), et sans devoir rebuilder depuis les sources (Dockerfile) à chaque fois.

Motivations

Docker a commencé à être installé fin 2015 au ResEl pour notamment isoler les services présents sur Pégase. Après une longue période vide, le service a été amélioré afin de simplifier les tests des différents services. D'abord pour le site ResEl ensuite pour d'autres services comme le LDAP.

Si aujourd'hui il n'est pour des raisons évidentes pas présent pour tous les services, l'harmonisation des services ResEl tend à lui donner une grande importance pour le déploiement.

Terminologie

Cette terminologie est nécessaire pour bien comprendre les principes, cependant je vous conseille de lire le glossaire officiel.

  • Conteneur : Ensemble de ressources (système de fichier, mémoire, réseau) associées à un ou des processus.
  • Image : Modèle d'un conteneur. Dans le cas de Docker, un système de fichier (/etc, /var, ...) compressé.
  • Dockerfile : Fichier décrivant comment construire une image de façon automatique.
  • Registre : Serveur (optionnel) contenant les images. docker.resel.fr chez nous.
  • Hôte : machine hébergeant un ou plusieurs containers
  • Tag : Identifiant d'une image. Généralement registre/service:version, par exemple docker.resel.fr/myresel:latext.

Mise en place

Hôte Docker

La mise en place d'un hôte Docker sur n'importe quelle machine est très simple. La méthode recommandée est d'utiliser le Playbook Ansible associé

Voici cependant la méthode manuelle suivant la documentation officielle avec quelques spécificités pour le ResEl :

Installez les dépendances nécessaires :

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

Ajoutez la clé GPG officielle :

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

Vérifiez que l'id de la clé est correct : 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88

sudo apt-key fingerprint 0EBFCD88

Ajoutez le repo Docker :

sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"

Mettez à jour l'index avec un apt update puis installez docker :

apt update && apt install docker-ce

warning Si vous-vous trouvez dans le réseau admin ou un autre réseau sans internet il faut configurer apt pour passer par le proxy apt. Créez le fichier /etc/apt/apt.conf.d/01reselproxy-docker :

Acquire::http::proxy::download.docker.com "http://pegase.adm.resel.fr:3128";
Acquire::https::proxy::download.docker.com "http://pegase.adm.resel.fr:3128";
puis refaites apt update.

Vérifiez que Docker fonctionne correctement avec la commande suivante :

sudo docker run hello-world

Pour utiliser le registre du ResEl (mobydick) vous devez faire un peu plus de configuration. En effet celui-ci n'est pas accessible au public et il faut donc s'y authentifier.

La procédure est toute simple, vous devez créer un token pour la machine, pour cela connectez-vous en root et tapez la commande suivante :

docker login

Docker va vous demander les identifiants du registre que vous devez connaître. Vous constaterez que la commande docker login a créé un fichier /root/.docker/config.json avec un token d'authentification dedans :

{
    "auths": {
        "docker.resel.fr": {
            "auth": "cldfjnaor65edsdf2ef"
        }
    }
}

Vous pouvez désormais sur cet hôte vous connecter au registre du ResEl.

Installation du Registre Docker (Whitewhale)

Comme c'est écrit partout, le registre docker est installé sur la machine Whitewhale. Comble du bonheur, celui-ci est installé grâce à docker-compose ce qui permet d'orchestrer plusieurs containers en même temps.

Comme la plupart des services ResEl, la configuration se trouve dans le dossier /srv/ et plus précisément dans /srv/docker_registry.

Le système est composé d'un seul container : registry. La configuration est détaillée dans le fichier /srv/docker_registry/docker-compose.yml :

version: '2'
services:
  registry:
    restart: always
    image: registry:2
    ports:
    - "5000:5000"
    environment:
      REGISTRY_AUTH: htpasswd
      REGISTRY_AUTH_HTPASSWD_REALM: Registry
      REGISTRY_AUTH_HTPASSWD_PATH: /auth/registry.passwd
      REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
    volumes:
      - ./auth:/auth
      - ./data:/data

On notera que le volume contenant les données du registre est le dossier data/. Il est important de ne pas toucher à ce dossier.

On trouve également le dossier auth/ qui contient le fichier registry.passwd Pour générer les mots de passe dans ce dernier, nous pouvons utiliser

htpasswd -Bc registry.password username
Si le htpasswd est évidemment préalablement installé (sudo apt install apache2-utils).

Typiquement avec comme username, resel et comme mot de passe, le mot de passe magique.

Pour installer/démarrer le service rien de plus simple :

  1. Installez le moteur Docker comme détaillé plus haut
  2. Installez docker-compose apt install docker-compose
  3. Créez/démarrez le registre :
    cd /srv/docker_register
    docker-compose up -d

N'oubliez pas de configurer le reverse proxy si vous désirez pouvoir accéder au registre depuis l'extérieur.

Sur Situs, le reverse proxy admin, dans la configuration de nginx, nous pouvons trouver la configuration de la registry Docker :

server {
    listen 80;
    server_name docker.resel.fr;

    return  301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    server_name docker.resel.fr;

    access_log /var/log/nginx/docker.resel.fr.access.log;
    error_log /var/log/nginx/docker.resel.fr.errors.log error;

    client_max_body_size 0;
    chunked_transfer_encoding on;

    location / {
        proxy_pass http://whitewhale.adm.resel.fr:5000;
        proxy_set_header  Host              $http_host;   # required for docker client's sake
        proxy_set_header  X-Real-IP         $remote_addr; # pass on real client's IP
        proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header  X-Forwarded-Proto $scheme;
        proxy_read_timeout                  900;
    }
}

Pour permettre à docker d'accéder aux registries publics, il faut paramétrer le proxy ici : https://docs.docker.com/config/daemon/systemd/#httphttps-proxy

Utilisation

Démarrer un conteneur

Sur un hôte une image peut être récupérée sur le registre docker officiel

docker pull jwilder/nginx-proxy

Sinon vous pouvez récupérer les images sur le registre du ResEl :

docker pull docker.resel.fr/web:latest

Voire même ou compilé en local depuis un Dockerfile :

git clone https://github.com/jwilder/nginx-proxy.git
docker build . --tag docker.resel.fr/nginx-proxy:latest

Relancer le registre Docker

Il arrive que le registre s’etteigne (pendant les mises à jour par exemple). Voici la procédure pour le relancer :

cd /srv/docker_registry/
docker-compose up -d 

Créer une nouvelle image

Créez un nouveau dossier qui contiendra tous les fichiers relatifs à l'image :

mkdir wifi && cd wifi

Créez un fichier Dockerfile et remplissez-le avec la configuration docker :

FROM docker.resel.fr/debian:latest

RUN apt-get -qq upgrade && apt-get -qq install wifi

Vous pouvez trouver toute la spécification du fichier Dockerfile sur la documentation officielle

Vous pouvez ensuite construire l'image et la pusher sur le registre :

docker build -r docker.resel.fr/wifi:latest .  # Ne pas oublier le point final
docker push docker.resel.fr/wifi:latest

notebook N'oubliez pas de versionner la configuration

Mettre à jour une image

Pour mettre à jour une image docker, il suffit de l'éditer (modifier son Dockerfile, modifier ses fichiers...), puis de la reconstruire et enfin de la pusher à nouveau sur le registre.

Par exemple :

cd vers-dossier-de-une-image
vim Dockerfile  # Modifier le dockerfile par exemple
docker build -r docker.resel.fr/wifi:latest .  # Reconstruire, ne pas oublier le point final
docker push docker.resel.fr/wifi:latest  # pusher image sur le registre

Supprimmer les images inutiles

Lorsque l'espace disque pris par le registraire devient trop important, il convient de faire le menage.

Voici divers étapes à faire, dans l'ordre :

  1. Lister les images
  2. Faire fonctionner le Garbage-Collector :
    docker exec dockerregistry_registry_1 /bin/registry garbage-collect /data/garbage_collector.yml

Ressources utiles

Articles liés

TODO (rédacteur)

  • Corrections mineures et des détails

Modifications

  • 2017-04-10 : revamp complet de la page pour enfin être utile