Configuration avancées du Docker Daemon
Suite à l'installation de Docker sur Linux:
- Docker est installé comme service Linux (
systemd) - La CLI
dockerdest utilisé pour lancer le Docker daemon - Il est possible d'overrider les configurations du daemon via des options CLI au lancement du service ou via un fichier
/etc/docker/daemon.jsonlu pardockerdpar défaut
Quelques infos et rappels:
- Le Docker daemon est aussi appelé Docker host ou Docker server
- Le Docker client (CLI
docker) communique avec le client via API REST en utilisant la socket/var/run/docker.sockpar défaut. Le client peut aussi contacter directement une adresse tel quetcp://127.0.0.1:2375outcp://198.265.78.1:2376en fonction des configurations du Daemon - Memo de commandes
systemctlutile pour manipuler les services Linux:# restart, stop, get status of docker sudo systemctl [restart|stop|status|...] docker # edit systemd file override # or edit file directly at /lib/systemd/system/docker.service sudo systemctl edit docker # reload after edit sudo systemctl daemon-reload # see newest service logs sudo journalctl -u docker -r
Exercices
Créer un fichier etc/docker/daemon.json et y configuer les options suivantes pour le Docker daemon:
- Activer le mode debug
- Configurer le daemon Docker pour écouter sur
127.0.0.1:2375 - Configurer le port binding pour écouter sur
127.0.0.1par défaut- sinon, un port binding avec
docker run -p 80:80 ...écoutera sur0.0.0.0:80par défaut, ce qui peut représenter un risque de sécurité
- sinon, un port binding avec
- Ajouter le DNS
8.8.8.8
Votre Docker daemon écoute maintenant sur 127.0.0.1:2375 et n'utilisera plus la socket /var/run/docker.sock. La CLI Docker utilisant cette socket par défaut, des configurations supplémentaires seront requises en utilisant la CLI docker.
Redémarrer le service Docker et tester:
- Lancer un container exposant un port et vérifier que l'adresse d'écoute est bien
127.0.0.1 - Au sein du container, vérifier que le DNS
8.8.8.8est bien utilisé - Afficher les logs du Daemon
Certains déploiements mettent à disposition un daemon Docker accessible à distance. (i.e. le daemon Docker est installé sur une machine différente du client Docker)
Cela peut-être utile dans certaines situations, par exemple pour partager un daemon avec une équipe de développeur ou un système de CI et accéler le build d'image: le cache de build pourra être réutilisé facilement et ainsi réduire le temps de build (pratique dans certains cas ou un build sans cache dure 20+ min et avec cache seulement quelques secondes!)
Un tel déploiement demande de sécuriser les communications entre le client Docker et le daemon. Utilisant HTTP par défaut, il faut y configurer TLS pour passer en HTTPS.
Configurer le daemon Docker pour:
- écouter sur
127.0.0.1:2376 - Configurer l'authentification du serveur en TLS - un client pourra ainsi authentifier le serveur lors de son utilisation (similaire à la connection à un site web en HTTPS)
- (Optionnel) Configurer l'authentification du client en TLS - le client devra s'authentifier auprès du serveur avec un certificate pour pouvoir utiliser le daemon
Ce setup s'appelle une double-authentification TLS. Pour ce besoin il faut un certificat et une clé pour être utilisé par le Daemon (idem pour le client):
- Le client va "truster" un CA (certificate Authority) et le daemon fournira un certificat signé par ce CA pour s'authentifier (c'est exactement le même processus en se connectant à un site web en HTTPS)
- Le Daemon va "truster" un CA (généralement le même), et le client devra fournir un certificat signé par ce CA pour être autorisé par le daemon
Dans le cadre de l'exercice nous pourrons générer nos propre CA et certificats. Pour générer une clé et un certificat autosigné:
# generate CA cert and key
openssl genrsa -out ca.key 4096
openssl req -nodes -new -x509 -keyout ca.key -out ca.cert
# Generate key for daemon
openssl genrsa -out daemon.key 4096
# Generate CSR for daemon
openssl req -new -sha256 -key daemon.key -out daemon.csr
# Generate cert for daemon signed by CA
openssl x509 -req -in daemon.csr -CA ca.cert -CAkey ca.key -CAcreateserial -out daemon.cert -days 500
# same for client: key, csr and cert
Points d'attention:
- Par convention, le port d'écoute de Docker est
2375sans TLS et2376avec TLS. - Le client aura besoin de configuration supplémentaire pour activer TLS et vérifier l'authenticité du serveur