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

Dive in Docker

Dive in Docker

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