Docker découverte
Qui sommes nous ?
Mario Loriedo
mario.loriedo@zenika.com 
github: l0rd
@mariolet
Vincent Demeester
vincent.demeester@zenika.com
github: vdemeester
@vdemeest 
© Copyright Zenika
Info pratiques
Programme de la soirée :
19h30­19h50 : Docker et VMs (20min)
19h50­20h30 : Premier hands­on (40min)
20h30­21h00 : Pizza (30min)
21h00­21h30 : Patterns simples (30min)
21h30­22h30 : Deuxieme hands­on (1h)
Vous avez des problèmes pour installer Docker ?
Nous avons des clés USB 
WiFi : ZenikaGuest/Welcome2Zenika!
© Copyright Zenika
Sommaire
Qu'est­ce que Docker ?
Comparaison avec les VMs
traditionelles
Hands­on
Cycle de vie d'un conteneur
Patterns d'utilisation simples
Hands­on
© Copyright Zenika
Qu'est-ce que Docker ?
1
Docker timeline
Quelques dates :
­ mars 2013 : dotCloud rend disponible Docker en Open Source
­ aout 2013 : eBay, Uber, Cloudfare utilisent Docker
­ octobre 2013 : DotCloud devient Docker Inc.
­ décembre 2013: Google Compute Engine supporte Docker
­ avril 2014: Amazon Web Service supporte Docker
­ octobre 2014: Partnership avec Microsoft
Quelques chiffres :
­ 150+ Docker Meetup dans 50 pays
­ 18,000+ Github stars
­ 100M+ Docker Engine downloads
­ 730+ développeurs de la communauté ont contribué
© Copyright Zenika 1 ­ 1
Ok mais....
© Copyright Zenika 1 ­ 2
Quelques définitions
"Docker is an open platform for developers and
sysadmins to build, ship, and run distributed applications."
docker.com                    
"Docker is an open­source project that automates the
deployment of applications inside software containers"
wikipedia.org                    
© Copyright Zenika 1 ­ 3
Une métaphore - le transport de conteneurs
© Copyright Zenika 1 ­ 4
Une métaphore - une révolution
© Copyright Zenika 1 ­ 5
Détails techniques - Architecture
Host
Container 1
Container 2
Container 3
Container ...
Docker Client
dockerpull
dockerrun
docker...
Docker Index
Docker Daemon
© Copyright Zenika 1 ­ 6
Détails techniques - Isolation
"chroot on steroids"
© Copyright Zenika 1 ­ 7
Détails techniques : LXC vs Docker
Depuis v0.9 Docker ne dépend plus de LXC
Qu'est Docker apporte en plus de LXC ?
­ Build automatisé à partir du Dockerfile
­ Docker Hub
­ Ecosystème
­ Versioning des images
­ Images réutilisables comme base pout d'autres images
© Copyright Zenika 1 ­ 8
Détails techniques : Union mount
//Sliceofdriversthatshouldbeusedinanorder
priority=[]string{
"aufs",
"btrfs",
"devicemapper",
"vfs",
"overlayfs"}
© Copyright Zenika 1 ­ 9
Containers vs VM
2
Comparaison de l'architecture VM/Conteneur
© Copyright Zenika 2 ­ 1
Quand utiliser une VMs
Quand l'application dépend d'une version précise du
kernel
Quand la sécurité du conteneur est importante
Sur Windows et Mac
© Copyright Zenika 2 ­ 2
Quand utiliser les deux ?
Sur Windows et Mac
Quand on veut reproduire un environement de
prod
© Copyright Zenika 2 ­ 3
Quand utiliser un conteneur
Dans tous les autres cas ;­)
© Copyright Zenika 2 ­ 4
Hands-on n.1
3
Hands-on #0 : Configuration
Installer git
Cloner le repo git@github.com:Zenika/NC­Docker­
Decouverte.git
Installer docker et autres outils
Ou bien simplement :
curl-sSLhttp://goo.gl/iRGzlj|bash
© Copyright Zenika 3 ­ 1
Hands-on #1 : Démarrer et arreter un conteneur
Démarrer un conteneur Docker à partir de l'image debian:jessie en ouvrant un
shell bash en mode interactif
run options -t -i --rm
Démarrer un conteneur Docker à partir de l'image zenika/nodejs­sample­
app:latest en mode detached pour démarrer un serveur nodejs
run option -d
Récuperer l'identifiant du conteneur (ps), et arretez­le (stop)
ps options
-a : liste tous les conteneurs (démarrés, arrétés ou en pause)
-l : liste uniquement le dernier container
© Copyright Zenika 3 ­ 2
Hands-on #2 : Conteneurs vs VMs - Resources
Démarrer 50 conteneur :
Vérifier les resouces utilisées avant et après (avec htop par exemple)
Utiliser l'image zenika/nodejs­sample­app:latest
En mode detached
Démarrer quelque VMs (qemu, virtualbox) et vérifier les resources
utlisées
© Copyright Zenika 3 ­ 3
Hands-on #3 : Conteneurs vs VMs - Isolation
Chercher le PID des process nodejs des 50 conteneurs démarrés auparavant en
utilsant la commande ps
Essayer de killer les process
Faire la même chose pour une VM
© Copyright Zenika 3 ­ 4
Cycle de vie
4
Cycle de vie
Registry (Distribution)
Liste d'images
Images (Construction)
Template
Lecture seule
Conteneurs (Runtime)
:
Basé sur une
image
Dispose d'un état
© Copyright Zenika 4 ­ 1
Images (1/2)
Template multi­layer pour les conténeurs, héritage entre images
Place sur le disque : 258M
© Copyright Zenika 4 ­ 2
Images (2/2)
Commandes usuelles
images : liste les images disponible en local
search : effectue une recherge sur le hub d'images
rmi : supprime une image disponible en local
build : construit une image à partir d'un Dockerfile
REPOSITORY TAG IMAGEID CREATED VIRTUALSIZE
debian jessie b427819b829a 4daysago 715.6MB
#[…]
© Copyright Zenika 4 ­ 3
Dockerfile (1/2)
FROMdebian:jessie #BasésurDebian
MAINTAINERJohnDoe<john@doe.com>
RUNapt-get-yupdate #Unecommande
RUN["apt-get","-y","update"] #Lamêmeoupresque
RUNapt-get-yinstallgit
openjdk-7-jre #Ousurplusieurslignes
ADDhttp://bit.ly/1HyjEeA/whale.gif#AjoutdepuisunURI
COPYtarget/foobar.jar/ #Copied'unfichier
VOLUME["/data"] #Déclarationd'unvolume
EXPOSE8080 #Expositiond'unport
ENVIN_DOCKER=y #Variabled'environnement
WORKDIR/ #le$PWDdemonprocessus
CMD["java","-jar","/foobar.jar"]
© Copyright Zenika 4 ­ 4
Dockerfile (2/2)
$dockerbuild-ttest.
Step0:FROMdebian:jessie
--->aaabd2b41e22
Step1:MAINTAINERJohnDoe<john@doe.com>
--->Runninginfecfccae398b
--->3d290dc10132
Removingintermediatecontainerfecfccae398b
Step2:RUNapt-get-yupdate
--->Runningind72fb9cfda61
#[…]
Step5:ADDhttp://bit.ly/1HyjEeA/whale.gif
Downloading[======================>] 1.02MB/1.02MB
#[…]
Step11:CMDjava-jar/foobar.jar
--->Runningin4239619930e2
--->8ba1ccb146c9
Removingintermediatecontainer4239619930e2
Successfullybuilt8ba1ccb146c9
$dockerrun-rm-itest1#itruns!
© Copyright Zenika 4 ­ 5
Conteneurs (1/3)
© Copyright Zenika 4 ­ 6
Conteneurs (2/3)
© Copyright Zenika 4 ­ 7
Conteneurs (3/3)
Quelques commandes en plus
ps : Liste les conteneurs actif et inactif
exec : Lancer une commande à l'intérieur d'un conteneur
diff : Montre les différences au niveau filesystem entre le conteneur et son
image associée
create : Créer un conteneur à base d'une image
rm : Supprime un conteneur (et donc ses données avec)
© Copyright Zenika 4 ­ 8
Volumes pour persister les données
Découpler le cycle de vie de données du cycle de vie du conteneur
Dossier qui n'utilise pas (bypass) les layers
Initialiser à la création du conteneur
Partage entre conteneur possible
Données directement écrite directement, non inclus dans
l'image
Persistent tant qu'ils sont utilisés
© Copyright Zenika 4 ­ 9
Pattern d'utilisation
simples
5
Isoler vos build
Language stack & image de build
Build tools inside images
"Separation of concern"
Jenkins & slaves ont juste besoin de Docker
Dev & Intégration continue se base sur les même images pour le
build
Les developpeurs ont "la main" sur le build
© Copyright Zenika 5 ­ 1
Setup de l'environnement de développement
Isoler les services externes du SI sur les machines de
developement
Pas besoin de les installer manuellement
Mutualiser et distribuer les configurations de ces services
Fournit en amont
Les mêmes pour tous
Passage d'un projet à l'autre simplifié
docker stop, docker run
Intégration continue o/
© Copyright Zenika 5 ­ 2
Tests in a different environment
Que faire si je veux.. :
.. vérifier que mon application tourne sous Ruby 2.1.5
docker […] run ruby:2.1.5 […]
.. vérifier que mon application compile sous Java 6
.. vérifier que mon application est compatible avec MySQL
5.6
.. vérifier que mon application est scalable
.. tester gitlab, kanboard, une appli node.js xD
© Copyright Zenika 5 ­ 3
The Universal Package Format
Remplacer apt-get, yum, pacman, …
par
docker run […]
Installation pattern
nsenter
© Copyright Zenika 5 ­ 4
Hands-on n.2
6
Hands-on #1 : Dockerfile
Construire une image Docker d'Elasticsearch en complétant ce qui
manque
Démarrer plusieurs conteneurs à partir de l'image fraichement créée
Voir le résultat dans votre navigateur (grâce au plugin head)
© Copyright Zenika 6 ­ 1
Hands-on #1 : Dockerfile Tips
Démarrer elasticsearch bin/elasticsearch
run options
-v (--volume) : monter un dossier du host dans le conteneur
(hostFolder:containerFolder)
-p (--publish) : publier un port sur l'interface du host
(hostPort:containerPort)
Plusieurs images : binder des ports différents sur le host (9200, 9201, 9202, ..)
Voir les nœuds elasticsearch : http://127.0.0.1:9200/_plugin/head
© Copyright Zenika 6 ­ 2
Hands-on #2 : Patterns
Builder : Builder votre projet favoris avec Docker
Java :   (maven),   (java)
Clojure :   (clojure),   (clojure)
Haskell :   (zenika/haskell­make)
Tips : l'option --rm (supprime automatiquement le conteneur s'il existe) peut
être utile
Tester l'image elasticsearch avec jdk6, jdk8 ou fluent­http avec jdk7
Tester des softwares pré­packager ( , ..)
fluent­http spring­security
liberator tentacles
pandoc
gitlab
© Copyright Zenika 6 ­ 3
Prochaine session
7
Proposition #1
Cycle de vie d'un conteneur avancé
Docker Hub: pull, push
Versionner une image : commit, tag
Etat d'un container : save, load 
Gestion de environnement avancés
Docker sur des OS non linux (vagrant et docker
machine)
multi­conteneur (fig et docker compose)
multihost (kubernetes and docker swarm) 
© Copyright Zenika 7 ­ 1
Proposition #2
Patterns d'utilisation
avancés
data­only container
ambassador container
Docker et le cloud
Docker hub
PAAS : gae, aws, deis
© Copyright Zenika 7 ­ 2
© Copyright Zenika 7 ­ 3

NightClazz Docker Découverte