Slide 1

Slide 1 text

DOCKER DIVE IN

Slide 2

Slide 2 text

LA BASE

Slide 3

Slide 3 text

OS LA BASE De quoi j’ai besoin ? Un système d’exploitation : Linux (sur l’hôte ou virtualisé)

Slide 4

Slide 4 text

OS DOCKER LA BASE Docker, c’est quoi ? Un démon qui tourne sur le système d’exploitation hôte

Slide 5

Slide 5 text

LA BASE Docker is an open-source project that automates the deployment of applications inside software containers, by providing an additional layer of abstraction and automation of operating-system-level virtualization on Linux Docker, c’est quoi ? https://en.wikipedia.org/wiki/Docker_(software)

Slide 6

Slide 6 text

LA BASE operating-system-level virtualization on Linux DOCKER OS libcontainer LXC libvirt

Slide 7

Slide 7 text

OS DOCKER LA BASE layer of abstraction Premier niveau d’abstraction : l’interface d’accès à la virtualisation / l’isolation

Slide 8

Slide 8 text

LA BASE layer of abstraction Deuxième niveau d’abstraction : interface d’accès à Docker (API REST) wget […] https://192.168.99.100:2376/info \ -0 - -q DOCKER

Slide 9

Slide 9 text

LA BASE layer of abstraction Troisième niveau d’abstraction : exécution des ordres en CLI docker run docker stop docker start docker rm … DOCKER

Slide 10

Slide 10 text

LA BASE layer of automation Premier niveau d’automatisation : description d’un container (Dockerfile + DSL) FROM jubianchi/docker-node-4 RUN apt-get update -y ENTRYPOINT ["/bin/bash"] DOCKER

Slide 11

Slide 11 text

LA BASE layer of automation Deuxième niveau d’automatisation : packaging des images docker build -t jubianchi/dive-in-docker . DOCKER

Slide 12

Slide 12 text

LA BASE layer of automation Troisième niveau d’automatisation : publication et récupération des images docker push jubianchi/dive-in-docker docker pull jubianchi/docker-node-4 DOCKER

Slide 13

Slide 13 text

LA BASE Blablabla… • Hôte : La machine physique • Démon : Le service Docker • Noeud : Hôte + Démon • Client : Outil pour interagir avec le démon • Container : Processus (ou groupe) qui s’exécute • Image : Modèle des containers • Registre : Dépôt des images

Slide 14

Slide 14 text

LA BASE Toolbox • Engine : Le démon Docker • CLI : Client en ligne de commande • Compose : Orchestrateur • Kitematic : Client en interface graphique • Machine : Gestionnaire de noeuds Docker • Swarm : Gestionnaire de cluster • Registry : Gestionnaire de registre

Slide 15

Slide 15 text

LA BASE Workflow (1 noeud) docker-machine create -d virtualbox local-docker eval "$(docker-machine env local-docker) » docker version On provisionne un noeud Docker (local-docker)
 avec docker-machine dans virtualbox docker-machine supporte beaucoup d’autres providers (EC2, Azure, Openstack, …)

Slide 16

Slide 16 text

LA BASE Workflow (1 noeud / 1 image) docker pull jubianchi/docker-node-4:latest On récupère une image depuis le registre public avec docker CLI Une image est caractérisée par son dépôt (jubianchi), son nom (docker-node-4) et sa version (latest)

Slide 17

Slide 17 text

LA BASE Workflow (1 noeud / 1 image / 1 container) docker run -it -d \ —name dive-in-docker \ jubianchi/docker-node-4:latest On lance un container depuis une image Le container est lancé en mode détaché (-d), avec un terminal interactif (-it) et est nommé dive-in-docker

Slide 18

Slide 18 text

LA BASE Workflow (1 noeud / 1 image / 1 container) docker ps -a —format '{{.ID}}: {{.Names}} ({{.Image}})' db5d5b74c3d5: dive-in-docker (jubianchi/docker- node-4) On vérifie l’état des containers qui tournent Notre container est en cours d’exécution avec l’identifiant db5d5b74c3d5

Slide 19

Slide 19 text

LA BASE Workflow (1 noeud) On arrête le container Le container a été arrêté (stop) et les résidus supprimés (rm). docker stop dive-in-docker docker rm dive-in-docker docker ps -a —format '{{.ID}}: {{.Names}} ({{.Image}})'

Slide 20

Slide 20 text

LES CONTAINERS

Slide 21

Slide 21 text

LES CONTAINERS Un container, c’est quoi ? C’est la version dynamique d’une image docker run -it -d \ —name dive-in-docker \ jubianchi/docker-node-4:latest

Slide 22

Slide 22 text

LES CONTAINERS C’est la version statique d’un container Une image, c’est quoi ? docker build -t jubianchi/dive-in-docker .

Slide 23

Slide 23 text

LES CONTAINERS Plusieurs layers, les uns sur les autres OK, mais une image, c’est quoi ? docker pull jubianchi/docker-node-4 Using default tag: latest latest: Pulling from jubianchi/docker-node-4 b014c4494ea5: Pull complete 2f329595e406: Pull complete e7b3561fbac6: Pull complete …

Slide 24

Slide 24 text

LES CONTAINERS Un différentiel sur le système de fichier Bon OK, mais un layer, c’est quoi ? docker history b711ba37a8f5 b711ba37a8f5 /bin/sh -c #(nop) ENTRYPOINT… 32036618e030 /bin/sh -c #(nop) ENV PATH=… 2cec8d5bcfb5 /bin/sh -c rm -rf /tmp/* … …

Slide 25

Slide 25 text

LES CONTAINERS En bref IMAGE 1 LAYER 3 LAYER 2 LAYER 1 IMAGE 2 LAYER 3’ LAYER 2’ LAYER 1 CT 2 CT 1 CT 3 CT 5 CT 4 CT 6

Slide 26

Slide 26 text

LES CONTAINERS Encore mieux IMAGE 1 LAYER 3 LAYER 2 LAYER 1 IMAGE 1’ LAYER 6 LAYER 5 LAYER 4 CT 2 CT 1 CT 3 CT 5 CT 4 CT 6

Slide 27

Slide 27 text

LES CONTAINERS Les choses sérieuses ! git clone \ https://gist.github.com/d94bf59cc720e126ced8.git \ dive-in-docker cd !$ Tips : Utilisateurs de docker-machine 
 et virtualbox : clonez le dépôt dans votre home

Slide 28

Slide 28 text

LES CONTAINERS C’est parti ! docker run -it —rm \ —name dive-in-docker \ jubianchi/docker-node-4:latest > // We are in a nodejs REPL undefined > console.log(‘Hello World!’); Hello World! undefined > ^D docker ps

Slide 29

Slide 29 text

LES CONTAINERS Command container • Durée de vie du container === durée de vie du processus principal (ENTRYPOINT) • Encapsule une simple commande • Se comporte (presque) comme la commande 
 qu’il encapsule • Peut être utilisé comme alias

Slide 30

Slide 30 text

LES CONTAINERS Exécutons un fichier docker run —rm \ —volume $(pwd):/app \ —name dive-in-docker \ jubianchi/docker-node-4:latest \ /app/00-dive-in-docker.js Hello World!

Slide 31

Slide 31 text

LES CONTAINERS Les volumes • Montage d’un fichier/dossier de l’hôte dans le container • Ne font pas partie des layers • Permettent de faire de la persistence de 
 données (logs, base de données, …)

Slide 32

Slide 32 text

LES CONTAINERS Encore un fichier ! docker run —rm \ —volume $(pwd):/app \ —publish 8888:8080/tcp \ —name dive-in-docker \ jubianchi/docker-node-4:latest \ /app/01-dive-in-docker.js

Slide 33

Slide 33 text

LES CONTAINERS Publier des ports TCP/UDP • Exposer des services en TCP ou en UDP • Router le traffic d’un port de l’hôte vers le 
 container

Slide 34

Slide 34 text

LES CONTAINERS Un dernier pour la route… export GREET=‘Hello Docker!’ docker run —rm \ —volume $(pwd):/app \ —env GREET \ —publish 8888:8080/tcp \ —name dive-in-docker \ jubianchi/docker-node-4:latest \ /app/01-dive-in-docker.js

Slide 35

Slide 35 text

LES CONTAINERS Et le Dockerfile dans tout ça ? FROM jubianchi/docker-node-4 RUN opkg-cl update && \ opkg-cl upgrade ADD ./ /app EXPOSE 8080 CMD ["/app/00-dive-in-docker.js"]

Slide 36

Slide 36 text

LES CONTAINERS Construisons notre image ! docker build -t dive-in-docker . docker images

Slide 37

Slide 37 text

LES CONTAINERS Lançons un container depuis notre image ! docker run —rm \ —volume $(pwd):/app \ —name dive-in-docker \ jubianchi/docker-node-4:latest \ /app/00-dive-in-docker.js docker run —rm \ —name dive-in-docker \ dive-in-docker Hello World!

Slide 38

Slide 38 text

LES CONTAINERS Et si on changeais la CMD ? docker run —rm \ —name dive-in-docker \ dive-in-docker \ -v v4.1.0

Slide 39

Slide 39 text

LES CONTAINERS Modifions un peu notre image • Nous voulons exécuter le fichier 
 01-dive-in-docker.js, • Et relancer un container à partir de la 
 nouvelle image, • En associant le port 8080 du container au 
 port 8888 de l’hôte Tips : Tout se passe dans la CMD

Slide 40

Slide 40 text

LES CONTAINERS La solution docker build -t dive-in-docker . docker run —rm \ —name dive-in-docker \ —publish 8888:8080/tcp \ dive-in-docker FROM jubianchi/docker-node-4 … CMD ["/app/01-dive-in-docker.js"]

Slide 41

Slide 41 text

LES CONTAINERS Modifions encore un peu notre image • Nous voulons mettre à jour nodejs en 
 5.1.0 depuis http://nodejs.org/dist/v5.1.0/, • Et relancer un container à partir de la 
 nouvelle image Tips : Il faut regarder le Dockerfile de l’image de 
 base

Slide 42

Slide 42 text

LES CONTAINERS La solution FROM jubianchi/docker-node-4 RUN opkg-cl update && \ opkg-cl upgrade RUN curl -s \ http://.../node-v5.1.0-linux-x64.tar.gz \ | gunzip | tar -xf - -C / ADD ./ /app EXPOSE 8080 ENTRYPOINT ["/node-v5.1.0-linux-x64/bin/node"] CMD ["/app/01-dive-in-docker.js"]

Slide 43

Slide 43 text

LES CONTAINERS La solution docker build -t dive-in-docker . docker run —rm \ —name dive-in-docker \ dive-in-docker \ -v v5.1.0

Slide 44

Slide 44 text

LES CONTAINERS Et avec un volume pour les logs ? • Au lieu d’écrire sur stdout/stderr, nous 
 voulons écrire dans un fichier, • Et persister ce fichier sur l’hôte Tips : Utilisez la directive VOLUME dans 
 le Dockerfile et —volume en CLI

Slide 45

Slide 45 text

LES CONTAINERS La solution FROM jubianchi/docker-node-4 RUN opkg-cl update && \ opkg-cl upgrade RUN curl -s \ http://.../node-v5.1.0-linux-x64.tar.gz \ | gunzip | tar -xf - -C / ADD ./ /app EXPOSE 8080 VOLUME /logs ENTRYPOINT ["/node-v5.1.0-linux-x64/bin/node"] CMD ["/app/02-dive-in-docker.js"]

Slide 46

Slide 46 text

LES CONTAINERS La solution docker build -t dive-in-docker . docker run —rm \ —name dive-in-docker \ —publish 8888:8080/tcp \ —volume $(pwd):/logs \ dive-in-docker

Slide 47

Slide 47 text

LES CONTAINERS Application container • Durée de vie du container === durée de vie du processus principal (ENTRYPOINT) • Encapsule une application • Expose des services via TCP/UDP • Configurable via les variables d’environnement • Données persistées dans des volumes

Slide 48

Slide 48 text

SURPRISE !!! Fun tools & Docker

Slide 49

Slide 49 text

@JUBIANCHI SOFTWARE ARCHITECT [email protected][email protected]