Ce bouquin n'est pas encore dans les bacs Docker Paris 
Docker 
en production 
Des containers de la cave au grenier! 
www....
Jérôme Petazzoni (@jpetazzo) 
Pingouin grognon de service 
- “Go away or I will replace you with a very small shell scrip...
Plan 
Rapide intro à Docker et la version 1.0 
Ce qui marche bien : installation, build, distribution 
Service discover...
Docker 1.0 1.1 1.1.1 1.1.2 1.2 est là ! 
Sortie de Docker 1.0 en juin pour DockerCon 
Quelques fonctionalités récentes a...
Installation 
Sur une machine de dev : boot2docker 
- toute petite VM (25 Mo), marche partout (tous hyperviseurs, dédié.....
Build avec Dockerfiles 
FROM ubuntu:14.04 
MAINTAINER Docker Education Team <education@docker.com> 
RUN apt-get update 
RU...
Build avec Dockerfiles 
Marche bien dans la plupart des cas 
- le système de cache permet d'avoir un rebuild complet mais...
Distribuer les images 
Docker Hub 
- docker push à gauche, docker pull à droite : problème réglé ! 
- images publiques et...
Distribuer les images 
Bricoler avec docker load/save 
- load/save va charger/exporter des images sous forme de tarballs ...
Service discovery 
On a l'embarras du choix : 
- injecter ce dont on a besoin sous forme de variable d'environnement 
doc...
On a testé pour vous : 
les 4 mécanismes de 
Service Discovery pour 
Docker au banc d'essai !
Mais d'abord, parlons des 
links
Docker links 
docker run -d --name frontdb mysqlimage 
docker run -d --link frontdb:sql webimage 
Crée des entrées DNS da...
Service discovery: 
variables d'environnement 
Facile à intégrer dans le code 
- même Java supporte les variables d'envir...
Variables 
d'environnement : 
B
Service discovery: 
bind-mount un fichier de configuration 
Facile à intégrer dans le code 
- même Ruby a un parser JSON/...
Bind-mount un fichier 
de configuration : 
B
Service discovery: 
Base clé-valeur 
Plus difficile à intégrer dans le code 
- Faire des requêtes HTTP (plutôt qu'un simp...
Bases clé-valeur : 
D
Service discovery: 
DNS 
Facile à intégrer dans le code 
- la plupart du temps, il n'y a rien à faire, ça juste marche 
...
DNS: 
B
Alors, y a rien qui 
marche (bien) ?
Links, le retour
Les ambassadeurs 
machine 1 (base de données) 
docker run -d --name mabase imagemysql 
docker run -d --link mabase:sql amb...
serveur DB serveur web 
container DB 
Je suis “mabase” ! 
container web 
Je veux parler à “mabase” ! 
ambassadeur 
Moi, je...
serveur DB serveur web 
container DB 
Je suis “mabase” ! 
container web 
Je veux parler à “mabase” ! 
ambassadeur 
Moi, je...
serveur DB serveur web 
container DB 
Je suis “mabase” ! 
container web 
Je veux parler à “mabase” ! 
ambassadeur 
Moi, je...
Des licornes ? Sans blague ? 
En travaux ; mais vous pouvez déjà jouer avec : 
- Docksul 
https://github.com/progrium/doc...
Service discovery: 
links avec ambassadeurs 
Facile à intégrer dans le code 
- ça reste des variables d'environnement 
F...
Ambassadeurs: 
A
Attention, travaux 
(Développement en cours...)
Orchestration 
On a (encore) l'embarras du choix 
- décrire les différents composants dans des fichiers YAML ou autre 
(F...
TEST : 
comment déterminer le 
système d'orchestration 
Docker qu'il vous faut ?
Voulez-vous* utiliser OpenStack? 
*ou devez-vous 
Oui 
- si vous voulez un PAAS, gardez un oeil sur Solum 
(encore mieux ...
Est-ce que vous voulez un PAAS? 
Oui 
- CloudFoundry (Ruby, but réécriture en Go en cours) 
- Deis (Python, conçu pour Do...
Combien de machines vous avez ? 
Une seule par application ou par environnement 
- Fig 
Un peu (jusqu'à une dizaine) 
- ...
En travaux : libswarm 
Lancez un <truc> qui ... 
- expose l'API Docker 
- communique avec de “vrais” hôtes Docker 
- déma...
Performance : la mesurer 
Grâce aux cgroups, on a pour chaque container... 
- l'utilisation CPU 
- l'utilisation mémoire ...
Performance : l'améliorer 
Il n'y a pas grand chose à faire 
- CPU : on a déjà des perfs natives 
- I/O : les perfs sur l...
Configuration management 
On a l'embarras du choix (c'est fou, non?) 
Si vous n'utilisez pas de CM : continuez ! 
- Si v...
Configuration management, 
pour mélanger VMs et containers 
Faites une image Docker générique avec votre outil 
de config...
Configuration management, 
pour mélanger VMs et containers 
Faites une image Docker générique de configuration management...
Configuration management, 
en mode “immutable infrastructure” 
Fabriquez une image Docker avec votre outil de CM 
favori,...
Configuration management, 
en mode “immutable infrastructure” 
Fabriquez une image Docker avec votre outil de CM 
favori,...
Les corvées des sysadmins 
Sauvegardes 
Logs 
Accès distant 
Et il ne s'agit là que d'un petit échantillon des nombreux...
Sauvegarder au niveau fichiers 
Utilisez des volumes 
docker run --name mysqldata -v /var/lib/mysql busybox true 
docker ...
Sauvegarder au niveau applicatif 
Utilisez des links 
docker run --name mysql mysql 
docker run --rm --link mysql:db mysq...
Les logs à l'ancienne 
À l'ancienne = et si j'écrivais quarante-douze miyards 
de fichiers dans /var/lib/tomcat/logs ? 
...
Les logs à la Docker 
À la Docker = j'écris tout sur la sortie standard 
Solution: Docker CLI/API 
docker run --name tom...
Accès distant 
Si vous avez accès à l'hôte : SSH dessus + nsenter 
https://github.com/jpetazzo/nsenter 
Si vous n'avez p...
Ce bouquin n'est pas encore dans les bacs Merci ! 
Docker 
en production 
Des containers de la cave au grenier! 
Questions...
Docker en Production (Docker Paris)
Prochain SlideShare
Chargement dans…5
×

Docker en Production (Docker Paris)

14 945 vues

Publié le

Dans cette présentation, nous donnons plusieurs réponses aux grandes questions classiques associées au déploiement avec Docker. Entre autres :
- comment orchestrer des déploiements non triviaux (plusieurs containers sur plusieurs machines) ?
- comment avoir des métriques sur les ressources utilisées par les containers ?
- comment optimiser les performances de Docker, en particulier pour des applications où ces performances sont critiques ?
- comment intégrer Docker avec des outils de "configuration management" comme Puppet, Chef, Salt, Ansible ?
- comment implémenter la "service discovery", ou, de manière générale, connecter entre eux plusieurs containers ?

La présentation a été donnée Lundi 8 Septembre à Paris dans les locaux de Zenika, cabinet spécialisé dans l'architecture informatique et les méthodes Agiles possédant une triple compétence de conseil, réalisation et formation.

Publié dans : Technologie
0 commentaire
64 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
14 945
Sur SlideShare
0
Issues des intégrations
0
Intégrations
905
Actions
Partages
0
Téléchargements
367
Commentaires
0
J’aime
64
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Docker en Production (Docker Paris)

  1. 1. Ce bouquin n'est pas encore dans les bacs Docker Paris Docker en production Des containers de la cave au grenier! www.docker.com @docker
  2. 2. Jérôme Petazzoni (@jpetazzo) Pingouin grognon de service - “Go away or I will replace you with a very small shell script” Ces 3 dernières années : dotCloud PAAS - EC2, LXC, Puppet, Python, Shell, ØMQ... Contributeur Docker occasionel - sécurité, réseau, --privileged A tendance à mettre un peu tout et n'importe quoi dans des containers - Docker-in-Docker, VPN-in-Docker, KVM-in-Docker, Xorg-in-Docker...
  3. 3. Plan Rapide intro à Docker et la version 1.0 Ce qui marche bien : installation, build, distribution Service discovery, interconnexion de containers Orchestration (faire tourner plusieurs containers) Performance (la mesurer, l'améliorer) Configuration management Les corvées du sysadmin : logs, backups, accès distant
  4. 4. Docker 1.0 1.1 1.1.1 1.1.2 1.2 est là ! Sortie de Docker 1.0 en juin pour DockerCon Quelques fonctionalités récentes au pif : - pause/unpause (pour avoir des snapshots et commits cohérents) - SELinux (pour ce truc bizarre qu'on appelle “sécurité”) - grosse amélioration du modèle réseau, avec docker run --net … Et surtout : le label “prêt pour la prod'” - en plus des traditionnels t-shirts et autres autocollants, vous pouvez nous acheter du support, de la formation...
  5. 5. Installation Sur une machine de dev : boot2docker - toute petite VM (25 Mo), marche partout (tous hyperviseurs, dédié...) - script pour OS X permettant de lancer la CLI en local - prochaines améliorations : partage des volumes avec docker run -v … Sur les serveurs : quelle distro choisir ? - n'importe quoi de récent (Ubuntu 14.04 LTS, RHEL 7, Fedora 20...) - nouvelles distros spécifiques Docker : CoreOS, Project Atomic (prometteuses, mais encore très jeunes)
  6. 6. Build avec Dockerfiles FROM ubuntu:14.04 MAINTAINER Docker Education Team <education@docker.com> RUN apt-get update RUN apt-get install -y nginx RUN echo 'Hi, I am in your container' >/usr/share/nginx/html/index.html CMD [ "nginx", "-g", "daemon off;" ] EXPOSE 80
  7. 7. Build avec Dockerfiles Marche bien dans la plupart des cas - le système de cache permet d'avoir un rebuild complet mais rapide Inconvénients (c-à-d travaux en cours...) - séparer l'environnement de build et celui de run (histoire de ne pas déployer une image de 5 Go quand on a juste besoin du binaire/JAR/etc. de 10 Mo qu'elle produit...) - droits d'accès, identifiants, et autres informations sensibles (que faire si le build a besoin d'accéder à une repo privée?) Comment contourner ces problèmes - utiliser deux Dockerfiles ; garder privés les Dockerfiles et les images
  8. 8. Distribuer les images Docker Hub - docker push à gauche, docker pull à droite : problème réglé ! - images publiques et privées ; droits d'accès ; etc. - pas de version sur site ; mais c'est la demande la plus fréquente (chez les grands comptes) Héberger votre propre registry (=juste le stockage) - docker run registry # “docker run -P” pour l'exposer sur le réseau - par défaut : stockage sur le disque local - peut utiliser un système de stockage “Cloud” (par exemple Swift, GCE, S3, Elliptics...)
  9. 9. Distribuer les images Bricoler avec docker load/save - load/save va charger/exporter des images sous forme de tarballs - ces tarballs peuvent être stockés n'importe où - https://github.com/blake-education/dogestry (much image, such docker, wow) En cours de développement : plug-ins de transport - il y a des outils (comme git, rsync...) qui gèrent très bien les diffs - pourrait-on les copier s'en inspirer les réutiliser ?
  10. 10. Service discovery On a l'embarras du choix : - injecter ce dont on a besoin sous forme de variable d'environnement docker run -e DB_HOST=… -e DB_PORT=… -e … - faire in bind-mount d'un fichier de configuration dans le container docker run -v /etc/docker/config/myapp.yaml:/config.yaml … - tout mettre dans une base clé-valeur redondante, à haute dispo (zookeeper, etcd, consul...) - tout mettre dans le DNS (consul, skydns, skydock, dnsmasq...)
  11. 11. On a testé pour vous : les 4 mécanismes de Service Discovery pour Docker au banc d'essai !
  12. 12. Mais d'abord, parlons des links
  13. 13. Docker links docker run -d --name frontdb mysqlimage docker run -d --link frontdb:sql webimage Crée des entrées DNS dans les containers Injecte des variables d'environnement dans le 2e : SQL_PORT=tcp://172.17.0.10:5432 SQL_PORT_5432_TCP=tcp://172.17.0.10:5432 SQL_PORT_5432_TCP_ADDR=172.17.0.10 SQL_PORT_5432_TCP_PORT=5432 SQL_PORT_5432_TCP_PROTO=tcp Les containers doivent être sur le même hôte Docker
  14. 14. Service discovery: variables d'environnement Facile à intégrer dans le code - même Java supporte les variables d'environnement (je crois) Facile à mettre en place - démarrer les containers, récupérer les ports, injecter les variables Encore plus facile si on utilise les links - complètement automatique si on travaille en local avec un seul hôte Mais : statique - quand on déplace un container, on ne peut pas mettre à jour les variables d'environnement à chaud
  15. 15. Variables d'environnement : B
  16. 16. Service discovery: bind-mount un fichier de configuration Facile à intégrer dans le code - même Ruby a un parser JSON/YAML potable (je crois) Facile à mettre en place - comme pour les variables d'environnement, mais on génère un fichier Vaguement dynamique - on peut mettre à jour le fichier de configuration pendant l'exécution Mais en fait, non - les services doivent détecter les modifications du fichier, et se relancer
  17. 17. Bind-mount un fichier de configuration : B
  18. 18. Service discovery: Base clé-valeur Plus difficile à intégrer dans le code - Faire des requêtes HTTP (plutôt qu'un simple getenv) n'est pas très difficile, mais tout de même plus complexe Plus difficile à mettre en place - il faut déployer la base clé-valeur, sur plusieurs machines Dynamique (en théorie) - la plupart des bases clé-valeur permettent d'observer une valeur ou un groupe de valeurs Mais pas tant que ça (en pratique) - les services doivent détecter les changements et recharger les clés
  19. 19. Bases clé-valeur : D
  20. 20. Service discovery: DNS Facile à intégrer dans le code - la plupart du temps, il n'y a rien à faire, ça juste marche Plus difficile à mettre en place* - il faut mettre en place un DNS facile à mettre à jour Dynamique - il suffit de mettre à jour les zones DNS Pas de notification (“push”) de changement, mais... - en cas de problème (provoquant une déconnexion), l'application va probablement se reconnecter en refaisant une requête DNS *Sauf sur une machine isolée, quand on utilise les links ; car les links créent automatiquement des entrées DNS.
  21. 21. DNS: B
  22. 22. Alors, y a rien qui marche (bien) ?
  23. 23. Links, le retour
  24. 24. Les ambassadeurs machine 1 (base de données) docker run -d --name mabase imagemysql docker run -d --link mabase:sql ambassadeur machine 2 (serveur web) docker run -d --name mabase ambassadeur docker run -d --link mabase:sql imagenginx
  25. 25. serveur DB serveur web container DB Je suis “mabase” ! container web Je veux parler à “mabase” ! ambassadeur Moi, je parle vraiment à “mabase” ! ambassadeur Je prétends être “mabase” ! docker linklink docker ?
  26. 26. serveur DB serveur web container DB Je suis “mabase” ! container web Je veux parler à “mabase” ! ambassadeur Moi, je parle vraiment à “mabase” ! ambassadeur Je prétends être “mabase” ! docker linklink docker ??
  27. 27. serveur DB serveur web container DB Je suis “mabase” ! container web Je veux parler à “mabase” ! ambassadeur Moi, je parle vraiment à “mabase” ! ambassadeur Je prétends être “mabase” ! docker linklink docker LICORNES
  28. 28. Des licornes ? Sans blague ? En travaux ; mais vous pouvez déjà jouer avec : - Docksul https://github.com/progrium/docksul - Grand Ambassador https://github.com/cpuguy83/docker-grand-ambassador Ou faites votre propre implémentation, avec : - une base clé-valeur à haute dispo (les revoilà!) - HAProxy, stunnel, iptables... (générer+relancer à chaque fois qu'on détecte un changement)
  29. 29. Service discovery: links avec ambassadeurs Facile à intégrer dans le code - ça reste des variables d'environnement Facile à mettre en place en dev' ; plus dur en prod' - utilisez des links normaux en dev - sortez l'artillerie lourde seulement pour la prod Dynamique - les ambassadeurs peuvent re-router le trafic si besoin
  30. 30. Ambassadeurs: A
  31. 31. Attention, travaux (Développement en cours...)
  32. 32. Orchestration On a (encore) l'embarras du choix - décrire les différents composants dans des fichiers YAML ou autre (Fig, Maestro-NG, Ansible et autres systèmes de CM) - requêter une API (Mesos, Helios, Kubernetes) - implémenter un PAAS ou assimilé (Flynn, Deis, OpenShift, Tsuru) - OpenStack (parce qu'on peut tout faire avec OpenStack même le café)
  33. 33. TEST : comment déterminer le système d'orchestration Docker qu'il vous faut ?
  34. 34. Voulez-vous* utiliser OpenStack? *ou devez-vous Oui - si vous voulez un PAAS, gardez un oeil sur Solum (encore mieux : contribuez au développement du projet) - si vous migrez des VMs vers des containers, utilisez Nova (c'est probablement ce que vous avez déjà ; activez le driver Docker) - sinon, utilisez Heat (et déclarez simplement des ressources Docker dans vos templates) Non - tournez la page
  35. 35. Est-ce que vous voulez un PAAS? Oui - CloudFoundry (Ruby, but réécriture en Go en cours) - Deis (Python, conçu pour Docker, tourne par-dessus CoreOS) - Dokku (quelques centaines de ligne de Bash!) - Flynn (Go, à la pointe de la technologie, mais très jeune) - Tsuru (Go, plus mûr) - OpenShift geard (encore du Go!) Soyez prudents (ou tournez la page) - http://blog.lusis.org/blog/2014/06/14/paas-for-realists/ “Je pense que pour l'instant, il n'y a aucun PAAS privé qui tienne la route.”
  36. 36. Combien de machines vous avez ? Une seule par application ou par environnement - Fig Un peu (jusqu'à une dizaine) - Maestro-NG - votre outil de CM favori (par exemple, Ansible a un module Docker sympa) Beaucoup (quelques centaines) - Helios (bon compromis, mais encore pas mal d'opérations manuelles) Moult (des milliers) - Mesos (la version 0.20 du 3 septembre supporte Docker nativement) - Kubernetes (mais attention, ça pique!)
  37. 37. En travaux : libswarm Lancez un <truc> qui ... - expose l'API Docker - communique avec de “vrais” hôtes Docker - démarre et arrête des hôtes Docker supplémentaires à la demande - s'occupe de l'ordonnancement, la communication, le scaling ... N'importe quel client Docker peut parler à ce <truc> - ça ressemble à un hôte Docker - mais c'est un hôte Docker élastique, évolutif, magique! https://github.com/docker/libswarm
  38. 38. Performance : la mesurer Grâce aux cgroups, on a pour chaque container... - l'utilisation CPU - l'utilisation mémoire détaillée (cache vs. resident set size) - l'utilisation I/O (par périphérique, par lecture/écriture, en octets et en opérations) Mais les cgroups ne donnent pas... - l'utilisation réseau (il faut “ruser” avec les namespaces réseau) https://github.com/google/cadvisor http://jpetazzo.github.io/2013/10/08/docker-containers-metrics/
  39. 39. Performance : l'améliorer Il n'y a pas grand chose à faire - CPU : on a déjà des perfs natives - I/O : les perfs sur les volumes sont natives (assurez-vous de placer les données actives sur des volumes) - mémoire : pas de surcoût si désactive le comptage de la mémoire (utile pour les clusters de calcul ; probablement pas pour le reste) - réseau : pas de surcoût pour les containers lancés avec “--net host” (utile si on veut pousser plus de 1 Gb/s) (ou si on a un taux élevé de paquets par seconde : VOIP, jeux...)
  40. 40. Configuration management On a l'embarras du choix (c'est fou, non?) Si vous n'utilisez pas de CM : continuez ! - Si vous utilisez, ou maîtrisez, un système de CM, vous pouvez l'utiliser pour encoder des petits déploiement (jusqu'à une dizaine de noeuds) Le CM, c'est bien pour les hôtes Docker Mais pour les applis elles-mêmes, Dockerfiles = ♥ Si vous voulez vraiment utiliser vos configurations actuelles, voilà comment les intégrer !
  41. 41. Configuration management, pour mélanger VMs et containers Faites une image Docker générique avec votre outil de configuration management favori, prêt à tourner Lancez des containers à partir de cette image, en indiquant son identité (certificat/hostname/...) Quand le container démarre, il contacte le serveur (puppetmaster etc.), qui lui donne sa configuration Le container converge vers l'état voulu Inconvénients : c'est lent ; et c'est pas fiable à 100%
  42. 42. Configuration management, pour mélanger VMs et containers Faites une image Docker générique de configuration management NON avec votre outil favori, prêt à tourner Lancez des containers FAIT, à partir de cette image, en indiquant son identité (certificat/hostname/...) Quand le EN container démarre, il contacte le serveur (puppetmaster etc.), qui lui donne sa configuration Le container converge vers l'état voulu Inconvénients : c'est lent ; et c'est pas fiable à 100%
  43. 43. Configuration management, en mode “immutable infrastructure” Fabriquez une image Docker avec votre outil de CM favori, et utilisez la comme base pour les autres Pour les autres images : FROM jerome/mon_image_puppet_de_base ADD manifests/ /etc/puppet/manifests RUN puppet apply --certname db1138.dystopia.io Cette image est prête (pas besoin d'étape en plus!) Inconvénient : il faut faire une nouvelle image à chaque modification, même mineure (ça peut être vu comme un avantage)
  44. 44. Configuration management, en mode “immutable infrastructure” Fabriquez une image Docker avec votre outil de CM favori, et utilisez la comme base pour les autres Pour les autres images : FROM jerome/mon_image_puppet_de_base ADD manifests/ /etc/puppet/manifests RUN puppet apply --certname db1138.dystopia.io Cette image est prête (pas besoin d'étape en plus!) Inconvénient : il faut faire une nouvelle image à chaque modification, même mineure (ça peut être vu comme un avantage) UN PEU MIEUX (MAIS BOF QUAND MÊME)
  45. 45. Les corvées des sysadmins Sauvegardes Logs Accès distant Et il ne s'agit là que d'un petit échantillon des nombreux méfaits ennuyeux mais nécessaires que les sysadmins doivent commettre de temps à autres...
  46. 46. Sauvegarder au niveau fichiers Utilisez des volumes docker run --name mysqldata -v /var/lib/mysql busybox true docker run --name mysql --volumes-from mysqldata mysql docker run --rm --volumes-from mysqldata mysqlbackup tar -cJf- /var/lib/mysql | stream-it-to-the-cloud.py Bien sûr, vous pouvez utiliser autre chose que tar (par exemple rsync, tarsnap...)
  47. 47. Sauvegarder au niveau applicatif Utilisez des links docker run --name mysql mysql docker run --rm --link mysql:db mysqlbackup mysqldump --all-databases | stream-it-to-the-cloud.py Peut être combiné avec des volumes - mettez le dump SQL sur un volume - puis sauvegardez le dump avec les outils de la page d'avant
  48. 48. Les logs à l'ancienne À l'ancienne = et si j'écrivais quarante-douze miyards de fichiers dans /var/lib/tomcat/logs ? Solution : volumes docker run --name logs -v /var/lib/tomcat/logs busybox true docker run --name tomcat --volumes-from logs my_tomcat_image - Inspecter les logs: docker run --rm --volumes-from logs ubuntu bash - Envoyer les logs quelquepart : docker run --name logshipper --volumes-from logs sawmill
  49. 49. Les logs à la Docker À la Docker = j'écris tout sur la sortie standard Solution: Docker CLI/API docker run --name tomcat dockerized_tomcat docker logs tomcat docker run -v /var/run/docker.sock:/var/run/docker.sock logshipper docker logs tomcat | pipestash ... Problème : pas de rotation des logs (pour l'instant)
  50. 50. Accès distant Si vous avez accès à l'hôte : SSH dessus + nsenter https://github.com/jpetazzo/nsenter Si vous n'avez pas accès : SSHD dans le container https://github.com/phusion/baseimage-docker Pour en savoir plus sur la question (“Pour ou contre le démon SSH dans le container?”) http://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker/ À l'avenir : - lancer un container SSH à part - se connecter dessus - rebondir vers le container cible
  51. 51. Ce bouquin n'est pas encore dans les bacs Merci ! Docker en production Des containers de la cave au grenier! Questions ? www.docker.com @docker

×