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 exempledocker.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
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 :
- Installez le moteur Docker comme détaillé plus haut
- Installez docker-compose
apt install docker-compose
- 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
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 :
- Lister les images
- 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