Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Dive in Docker

Dive in Docker

Avatar for Julien BIANCHI

Julien BIANCHI

November 10, 2015
Tweet

More Decks by Julien BIANCHI

Other Decks in Programming

Transcript

  1. OS LA BASE De quoi j’ai besoin ? Un système

    d’exploitation : Linux (sur l’hôte ou virtualisé)
  2. OS DOCKER LA BASE Docker, c’est quoi ? Un démon

    qui tourne sur le système d’exploitation hôte
  3. 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)
  4. OS DOCKER LA BASE layer of abstraction Premier niveau d’abstraction

    : l’interface d’accès à la virtualisation / l’isolation
  5. 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
  6. 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
  7. 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
  8. LA BASE layer of automation Deuxième niveau d’automatisation : packaging

    des images docker build -t jubianchi/dive-in-docker . DOCKER
  9. 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
  10. 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
  11. 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
  12. 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, …)
  13. 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)
  14. 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
  15. 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
  16. 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}})'
  17. 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
  18. LES CONTAINERS C’est la version statique d’un container Une image,

    c’est quoi ? docker build -t jubianchi/dive-in-docker .
  19. 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 …
  20. 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/* … …
  21. 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
  22. 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
  23. 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
  24. 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
  25. 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
  26. 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!
  27. 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, …)
  28. 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
  29. 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
  30. 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
  31. 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"]
  32. 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!
  33. LES CONTAINERS Et si on changeais la CMD ? docker

    run —rm \ —name dive-in-docker \ dive-in-docker \ -v v4.1.0
  34. 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
  35. 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"]
  36. 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
  37. 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"]
  38. LES CONTAINERS La solution docker build -t dive-in-docker . docker

    run —rm \ —name dive-in-docker \ dive-in-docker \ -v v5.1.0
  39. 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
  40. 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"]
  41. 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
  42. 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