INTRODUCTION À DOCKER - unice.frurvoy/docs/ADM/CM.pdf · Définit automatiquement une priorité ou...

223
INTRODUCTION À DOCKER Benoît Benedetti

Transcript of INTRODUCTION À DOCKER - unice.frurvoy/docs/ADM/CM.pdf · Définit automatiquement une priorité ou...

  • INTRODUCTIONÀDOCKERBenoîtBenedetti

  • OBJECTIFS

  • SÉANCE1Savoircequec’estqueDockeretàquoiçasert

    Conceptsetterminologie,

    Exécuterdesconteneurs,

    Gérerdesimages,

    Créersespropresimages.

    ⇒90%desconnaissancesàavoirpourleDS

    Guillaume Urvoy-Keller

  • SÉANCE2Utilisationavancée

    Interconnecterdesconteneurs

    Orchestration

  • PLANDECETTESÉANCEProblématique

    ConteneurLinux

    Docker

  • LEVEZVOTREMAINSI… VousavezinstalléDockersurvotremachine?

    Vousenaviezdéjàentenduparler?

    Vousavezlu,regardédesressources?

    Vousavezdéjàtesté?

  • PROBLÉMATIQUES

  • LEDÉVELOPPEMENTAVANTLonguephasededéveloppement

    Longuephasederecette/test

    Miseenproduction

    Ontoucheplus!

  • MAINTENANTDéveloppementAgile

    Cyclescourts(MVP,Releaseearly/Releaseoften)

  • AVANTApplicationsmonolithiques

    Evolutivitéverticale(verticalscalability)

    DevVSOps

  • MAINTENANTEnvironnementspolyglottes,différentes

    stacks/Frameworks

    Evolutivitéshorizontale(répandue)et

    architecturale(micro-services)

    DevOps,environnementsidentiquesàlaproductionsurle

    postededev

  • LAMATRICEINFERNALE

    source:docker.com@Docker,inc

  • APERÇUDOCKER

    source:docker.com@Docker,inc

  • GÉNÉRALITÉSSURLESCONTAINEURS

  • MACHINEVIRTUELLE

  • VMAvantages

    Emulationbasniveau

    Sécurité/compartimentationfortehôte/VMset

    VMs/VMs

    Inconvénients

    Usagedisqueimportant

    Impactsurlesperformances

  • CONTENEURDOCKER

  • CONTENEURAvantages:

    Espacedisqueoptimisé

    ImpactquasinulsurlesperformancesCPU,réseauet

    I/O

    Inconvénients

    FortementliéaukernelHôte

    NepeutémulerunOSdifférentquel’hôte

    Sécurité

  • CONTENEURLINUXProcessusisolépardesmécanismesnoyaux.

    3élémentsfondamentaux

    Namespaces

    CGroups

    Copy-On-Write

  • NAMESPACES

  • FONCTIONNALITÉDUKERNEL,AVECSONAPIApparuedanslenoyau2.4.19en2002,réellementutiles

    en2013danslenoyau3.8

    Limitecequ’unprocessuspeutvoirdusystème:

    unprocessusnepeututiliser/impacterquecequ’ilpeut

    voir

    Types:pid,net,mnt,uts,ipc,user

    Chaqueprocessusestdansunnamespacedechaquetype

  • NETNAMESPACELeprocessusnevoitquelapileréseauduNamespacedontil

    faitpartie:

    sesinterfaces(eth0,l0,différentesdel’hôte)

    Tablederoutagesépararée.

    règlesiptables

    socket(ss,netstat)

  • NAMESPACEUTSIdentificationpropreauNamespace:

    {get,set}hostname

  • NAMESPACEIPCPermettentàungroupedeprocessusd’unmêmenamespace

    d’avoirleurspropres:

    ipcsemaphore

    ipcmessagequeues

    ipcsharedmemory

    Sansrisquedeconflitavecd’autresgroupesd’autres

    namespaces

  • NAMESPACEUSERmappeuid/gidversdifférentsutilisateursdel’hôte

    uid0⇒9999duC1correspondàuid10000⇒119999

    surl’hôte

    uid0⇒9999duC2correspondàuid12000⇒139999

    surl’hôte

  • NAMESPACEMOUNTUnnamespacedisposedesonproprerootfs

    (conceptuellementproched’unchroot)

    peutmasquer/proc,/sys

    peutaussiavoirsesmounts"privés"

    /tmp(parutilisateur,parservice)

  • NAMESPACEPIDlesprocessusd’unnamespacepidnevoitquelesprocessus

    decelui-ci

    Chaquenamespacepidasaproprenumérotation,

    débutantà1

    SilePID1disparaît,lenamespaceestdétruit

    Lesnamespacespeuventêtreimbriqués

    UnprocessusadoncplusieursPIDs

    Unpourchaquenamespacedanslequelilestimbriqué

    ChaquenamespacepiddébuteaveclePID1etluietles

    suivantssontlesseulsvisiblesdepuiscenamespace.

  • UTILISATIONDESNAMESPACESCréésàl’aidedeclone()ouunshare()

    Matérialiséspardespseudo-filesdans/proc/$PID/ns

    fichiersdans/proc/{pid}/ns

    Guillaume Urvoy-KellerVoir : http://iutsa.unice.fr/~urvoy/ext/Cours/Virtualisation/TPs/docker-lp.pdf

  • CONTROLGROUPS

  • CGROUPSLINUXFonctionnalitédunoyau,apparueen2008(noyau2.6.24)

    Contrôlelesressourcesd’unprocessus:

    allocation

    monitoring

    limite

    type:

    cpu,memory,network,blockio,device

  • HIÉRARCHIENotiondehiérarchie:

    Chaquesoussystèmeaunehiérarchie

    hiérarchiesdifférentepourCPU,memory,blockI/O,

    etc…

    Hiérarchiesindépendantes:

    LesarbrespourMEMORYetCPUsontdifférents

    Chaqueprocessusestdansunnoeuddechaquehiérarchie

    Chaquehiérarchiepartd’uneracine

    Al’originechaqueprocessuspartdelaracine

    Chaquenoeudéquivautàungroupedeprocessus

    Guillaume Urvoy-KellerChaque noeud équivaut à un groupe de processus * partagent les mêmes ressources

    Guillaume Urvoy-Keller

  • MEMORYCGROUPLimitespossibles

    surlamémoirephysique,dunoyauettotale

    Limitessoft/hard

    Surveillancedel’utilisationdesressources

    NotificationsOOMpossibles

  • CGROUPCPUSurveillancedutempsCPUutilisateur/système,de

    l’utilisationparCPU

    Possibilitédedéfinirunpoids

    AllocationdeprocessusàunouplusieursCPU(s)

    spécifique(s).

  • CGROUPBLKIOSurveillancedesI/Odechaquegroupe/device

    Définitiondelimited’utilisationparpériphérique

    Définitiondepoids

  • CGROUPNETWORKDéfinitautomatiquementuneprioritéouclassepourun

    trafic,traficgénéréparlesprocessusdugroupe.

    Fonctionneuniquementpourletraficgénéré,sortant.

    net_clspourassigneruneclasse(àlieraveciptables)

    net_priopourassignerunepriorité

  • CGROUPDEVICEContrôlelespermissionsd’ungroupesurunnodedevice

    permissions:read/write/mknod

    Typiquement:permettre/dev/{tty,zero,random,null}

    rejetertoutlereste

    nodesintéressantes:

    /dev/net/tun(manipulationdesinterfacesréseau)

    /dev/fuse(filesystemsenespaceutilisateurs)

    /dev/kvm(vmdansdesconteneurs)

    /dev/dri(gpu)

  • SUBTILITÉSCGROUPSPid1estplacéàlaracinedechaquehiérarchie

    Lesnouveauxprocessussontdémarrésdanslegroupede

    leurparent

    Lesgroupessontmatérialiséspardespseudossystèmesde

    fichiers

    généralementmontésdans/sys/fs/cgroup

    Lesgroupessontcréésdanscespseudossystèmesde

    fichiers:

    mkdir/sys/fs/cgroup/memory/somegroup/subgroup

    Pourdéplacerunprocessusdansungroup:

    Guillaume Urvoy-Keller * echo $PID > /sys/fs/cgroup/..- Différents outils pour faire cela: systemd vs cgmanager vs ...

    Guillaume Urvoy-Keller

  • COPY-ON-WRITE

  • COWSidemultiplesentitésontbesoindelamêmeressource,

    plutôtquedeleurdonnerunecopie,onleurdonneun

    pointeurverscelle-ci:

    Réduitl’usagedisqueetletempsdecréation

    Plusieursoptionsdisponibles

    devicemapper(niveaufichier)

    btrfs,zfs(niveaufs)

    aufs,overlay(niveaufichiers)

    Letypedestockagesurveillelesmodifications

    lorsquel’appelantmodifiesa"copie"delaressource,

    Guillaume Urvoy-Kellerune copie privée spécifique lui est attribuée

    Guillaume Urvoy-Keller

  • DIFFÉRENTESIMPLÉMENTATIONSDECONTENEURSLINUX

  • LXCEnsembled’outilsenespaceutilisateur

    Unconteneurestundossierdans/var/lib/lxc

    Petitfichierdeconfiguration+rootfs

    Lespremièresversionsn’avaientpasdesupportCoW

    Lespremièresversionsnesupportaientpasle

    déplacementd’images

    Nécessitebeaucoupd’huiledecoude

  • SYSTEMD-NSPAWNPourdebugging,testing

    similaireàchroot,maispluspuissant

    Beaucoupdemanipulationsàfaire

    implémenteuneinterfacedeconteneur

    supportdesimagesdockerdepuispeu

  • DOCKERENGINEdaemonaccessibleviauneapirest

    Gestiondesconteneurs,images,builds,etplus

    enfaittroppourdenombreusespersonnes

    Guillaume Urvoy-Kellercréation image

    Guillaume Urvoy-Keller

    Guillaume Urvoy-Keller

  • RKT,RUNCRetouràlasimplicité

    Dédiéàl’exécutiondeconteneur

    Pasd’APIRest,degestiondesimages,debuild,

    implémententdifférentesspécifications

    rktimplémenteappc(appcontainerspec)

    runcimplémenteocp(opencontainerproject)

    runcutiliselibcontainerdeDocker

  • LEMEILLEUR?Utilisenttouslesmêmesfonctionnalitésnoyau

    Performancesglobalementéquivalentes

    Prendreencompte:

    Design

    Fonctionnalités

    Ecosystème

  • DOCKER

  • BANALISERL’UTILISATIONDESCONTENEURSUneplate-formeouvertepourcréer,déployeretexécuter

    desapplicationsréparties,empaquetées,demanièreisoléeet

    portable.

  • NOUVEAUTÉSStandardiseretrendreportablelesformatsdeconteneurs

    Rendrel’utilisationdesconteneurssimplespourles

    développeurs(etpasque)

    API

    Standardiserlesoutils

  • EXÉCUTERDESCONTENEURSPARTOUTSurn’importequelleplate-forme:physique,virtuel,cloud,

    Pouvoirpasserdel’uneàl’autredesplate-formes,

    Maturitédestechnologies(cgroups,namespaces,copy-on-

    write)

  • EXÉCUTERTOUTESORTED’APPLICATIONServices:web,bdd,

    CLI

    GUI

  • DISTRIBUTIONEFFICACEDESCONTENEURSDistribuerdesimages,auformatstandard

    Optimiserl’utilisationdisque,mémoireetréseau

  • GENÈSEDotCloud

    PaasenPython

    BasésurLXC

  • PIVOTRéécritureenGo:

    03/2013:V0.1

    06/2014:V1.0

  • AUJOURD’HUIVersion1.9.1

    DockerEngine

    Démongérantlesconteneurs

    DockerCLI

    peutgérerunouplusieursdémonlocauxoudistants

    Formatstandardiséd’images

    Registreetprotocolelibrepourhébergeretdistribuerles

    imagesdemanièreoptimisée

    Outillage

    Builder,Orchestration,cluster

    Guillaume Urvoy-KellerSéparation docker communiy (CE) et docker entreprise (EE) depuis ~ 2017

    Guillaume Urvoy-KellerSource : https://nickjanetakis.com/blog/docker-community-edition-vs-enterprise-edition-and-their-release-cyclePrior to March 2017, the latest version of Docker was Docker 1.13, and at the time of writing this article, the latest version of Docker is 17.07.

    There’s a pretty big difference between 1.13 and 17.07, and no, they didn’t jump 16 major versions in a few months.

    What happened was, on March 2nd 2017, Docker completely changed their version format, and also changed the name of the Docker Engine package to either Docker Community Edition or Docker Enterprise Edition.

    Guillaume Urvoy-KellerBuilder, Orchestration, cluster

  • CONTENEURS:LESBASES

  • CONTENEURBASIQUE$dockerrundebian/bin/echo"Salut"

    Salut

    $dockerrundebian/bin/echo"Coucou"

    Coucou

  • COMMANDESPS$dockerps

    CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES

    $dockerps-a

    CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES

    d0683f6462a5debian"/bin/echoSalut"AboutaminuteagoExited(0)Aboutaminuteagohungry_visvesvaraya

    e1794g7573b6debian"/bin/echoCoucou"AboutaminuteagoExited(0)Aboutaminuteagohappy_torvalds

  • RÉ-EXÉCUTERUNCONTENEUR$dockerstart-ihungry_visvesvaraya

    Salut

    Guillaume Urvoy-Kellernom donné par docker à la création si vous n’en avez pas misLe message ici : un container qui s’est arrêté n’est pas détruit

    Guillaume Urvoy-Keller

  • LOGS$dockerlogshungry_visvesvaraya

    Salut

    Salut

  • MÉNAGE$dockerrmhungry_visvesvaraya

    Guillaume Urvoy-Kellerrm uniquement sur un container arrêté! Sinon, il faut d’abord le stopper puis le détruire

  • CONTENEURENCOURSD’EXÉCUTION$dockerrun-itdebian/bin/bash

    root@2c666d3ae783:/#ps-a

    PIDTTYTIMECMD

    6?00:00:00ps

  • AFFICHAGEAVECPSDepuisuneautreconsole

    $dockerps

    CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES

    2c666d3ae783debian"/bin/bash"44secondsagoUp42secondshappy_mietner

  • DOCKERTOP$dockertophappy_mietner

    UIDPIDPPIDCSTIMETTYTIMECMD

    root23338867015:06pts/1500:00:00/bin/bash

    Guillaume Urvoy-Kellernuméro des processus dans la machine hôte, pas dans le container où cela recommence à 1.

  • INTERROMPRELECONTENEURETSONPROCESSUS

    Outoutsimplementarrêterleprocessus(exitpourbash)

    $dockerstop$conteneur

    $dockerkill$conteneur

    $dockerpause$conteneur#unpause

  • SEDÉTACHERPoursedétacherduprocessusd’unconteneursansl’arrêter

    root@2c666d3ae783:/#^P^Q

  • SERATTACHERÀUNCONTENEURLeconteneurdoitêtreencoursd’exécution,onserattache

    auprocessusexécuté:

    $dockerattachhappy_mietner

    root@2c666d3ae783:/#

  • DOCKEREXEC

    Leexitnetueraquelebashencours

    $dockerexec-ithappy_mietner/bin/bash

    root@2c666d3ae783:/#exit

    Guillaume Urvoy-Kellerdocker exec permet d’exécuter une commande (ici bash mais on aurait pu faire un ifconfig) dansl’espace du container.�

  • IMAGES

  • NOUSALLONSVOIRCequ’estuneimage

    Cequ’estunecouche

    Lesespacesdenomdesimages

    Rechercheretrécupérerdesimages

    Imagestags

  • IMAGE?Collectiondefichiers+méta-données

    CesfichiersformentleFSracineduconteneur

    Composéesdecouches,enthéoriesuperposées

    Chaquecouchepeutrajouter,modifier,supprimerdes

    fichiers

    Desimagespeuventpartagerdescouchespouroptimiser

    L’usagedisque

    Lestempsdetransfert

  • DIFFERENCESAVECLESCONTENEURSSystèmesdefichierslecture-seule

    Unconteneurestunensembledeprocessuss’exécutant

    dansunecopieenlecture-écrituredecesystèmede

    fichiers

    Pouroptimiserlesressources,leCoWestutiliséaulieude

    copierlesystèmedefichiers.

    dockerrundémarreunconteneurdepuisuneimage

  • COUCHES

  • MÉTAPHORESLesimagessontdespatronsdepuislesquellesvouscréezdes

    conteneurs.

    EnProgammationOrientéeObjet:

    LesImagessontconceptuellementsimilairesauxclasses,

    Lescouchessontconceptuellementsimilairesàl’héritage,

    LesConteneurssontconceptuellementsimilairesàdes

    instancesd’image.

  • EXEMPLESIMAGEShello-world

    ubuntu

    mysql

    Wordpress

    ApplicationJAVA

  • REGISTREHébergelesimages,etlesmetàdisposition.

    Lesimagessontrécupéréesenlocaldepuisunregistre

    distant.

    Ilexiste2typesderegistre:

    DockerHub

    Auto-hébergés

  • DOCKERHUBServiceenligne,officieldeDocker,pourdistribuerlesimages

    composants:

    Unindex:indexetouteslesméta-donnésdesimages

    hébergéespourrecherche.

    Unregistre:stockelescouchesdesimagespour

    récupérationetupload.

    Pardéfaut,lescommandesdeDockerliéesauximages

    utilisentleDockerHub.

    https://hub.docker.com/

    https://hub.docker.com/

  • REGISTREAUTO-HÉBERGÉRegistrehébergéeninterne.

    Dockerfournitunconteneurpourhébergersonpropre

    registre.

    Protocoleopen-source:différentesimplémentations

    existent.

  • ESPACESDENOMIlexiste3manièresdenommerdesimages:

    Imagesofficielles:

    Ex:ubuntu,debian

    Imagesutilisateur:

    Ex:benedetti/myapp

    Imagesauto-hébergées:

    Ex:registry.example.com:5000/my-private/image

  • ESPACEDENOMSRACINECetespacedenomestpourlesimagesdistribuées

    officiellementparDocker,maisgénéralementcrééespardes

    tiers.

    Typesd’images:

    imagesdedistributionàutilisercommebase:debian,

    ubuntu

    servicesprêtàl’emploi:mysql,tomcat

  • ESPACEDENOMUTILISATEURImagesmisesàdispositionparDockersansvérification.

    Exbenedetti/mysqloubenedetti/myapp

    benedettiestmonnomd’utilisateurchezDocker

    Lenomdel’imageestmysqloumyapp

  • ESPACEDENOMAUTO-HÉBERGÉImagesauto-hébergéesetdistribuéesnonofficiellement.

    Ex:exemple.fr:5000/wordpress

    exemple.fr:5000:hôteetportduregistreauto-hébergé

    wordpress:nomdel’image

    ⇒vousn’utiliserezsûrementpasderegistreetimageauto-

    hébergés.

  • RECHERCHERUNEIMAGEVouspouvezlefairevial’interfaceweb,ouvialaCLI:

    $dockersearchnginx

    NAMEDESCRIPTIONSTARSOFFICIALAUTOMATED

    nginxOfficialbuildofNginx.4172[OK]

    jwilder/nginx-proxyAutomatedNginxreverseproxyfordockerc...800[OK]

    richarvey/nginx-php-fpmContainerrunningNginx+PHP-FPMcapable...274[OK]

    million12/nginx-phpNginx+PHP-FPM5.5,5.6,7.0(NG),CentOS...76[OK]

    maxexcloo/nginx-phpFrameworkcontainerwithnginxandPHP-FPM...58[OK]

    webdevops/php-nginxNginxwithPHP-FPM51[OK]

  • RÉCUPÉRERUNEIMAGEFaireunpullpourrécupérerl’imageenlocal.

    Elleseraensuiteutilisablepourcréerunconteneuravec

    dockerrun

    NB:dockerrunfaitunpullsil’imagen’estpasdisponibleen

    local

    $dockerpullnginx

    Usingdefaulttag:latest

    latest:Pullingfromlibrary/nginx

    709f78077458:Pullcomplete

    5f5490fb32ee:Pullcomplete

  • LISTERLESIMAGESImagesdisponibleslocalement

    $dockerimages

    REPOSITORYTAGIMAGEIDCREATEDVIRTUALSIZE

    debianlatest93a2e30f10003daysago123MB

    nginxlateste8b9e1a0dfbe7daysago183.5MB

    hello-worldlatest95f1eedc264a11weeksago1.848kB

  • TAGSLesimagespeuventavoirdestags

    Untagdéfinirauneversion,unevariantedifférented’une

    image

    pardéfautletagestlatest:

    dockerrunubuntu==dockerrunubuntu:latest

    Untagestjusteunalias,unsurnompourunidentifiant

    d’image

    plusieurstagsdifférents==uneimage

    ex:ubuntu:latest==ubuntu:16.04

  • EXEMPLE$dockerimagesdebian

    REPOSITORYTAGIMAGEIDCREATEDVIRTUALSIZE

    debianlatest93a2e30f10004daysago123MB

    debian8.5f854eed3f31f3monthsago125.1MB

    debian8.432f2a4cccab85monthsago125MB

    debian8.2140f9bdfeb978monthsago125.1MB

  • EXEMPLETAG$dockertagdebianbenedetti/debian:8.6

    dockerimages|grepdebian

    debianlatest93a2e30f10004daysago123MB

    benedetti/debian8.693a2e30f10004daysago123MB

    debian8.5f854eed3f31f3monthsago125.1MB

    debian8.432f2a4cccab85monthsago125MB

    debian8.2140f9bdfeb978monthsago125.1MB

  • UTILISATIONDESTAGSOnn’utiliserapaslestags

    durantlestestsetprototypage

    expérimentations

    quandvousavezsimplementbesoindeladernière

    version

    Onlesutilisera

    pourutiliseruneimagespécifiqueenproduction

    pourcréeruneimagequiévolue

  • HISTORIQUED’UNEIMAGEOnpeutafficherl’historiquedelacréationd’uneimage,et

    descouchesquilaconstituent:

    $dockerhistorydebian

    IMAGECREATEDCREATEDBYSIZECOMMENT

    93a2e30f10004daysago/bin/sh-c#(nop)CMD["/bin/bash"]0B

    d5daf556aca74daysago/bin/sh-c#(nop)ADDfile:cae7a35a0d8c43d5ba123MB

  • HISTORIQUENGINX$dockerhistorynginx

    IMAGECREATEDCREATEDBYSIZECOMMENT

    e8b9e1a0dfbe8daysago/bin/sh-c#(nop)CMD["nginx""-g""daemon0B

    e856b4c52d158daysago/bin/sh-c#(nop)EXPOSE443/tcp80/tcp0B

    c7066b7f861d8daysago/bin/sh-cln-sf/dev/stdout/var/log/nginx/0B

    69afb4ee61738daysago/bin/sh-capt-keyadv--keyserverhkp://pgp.58.36MB

    452019be0ab78daysago/bin/sh-c#(nop)ENVNGINX_VERSION=1.11.4-10B

    c95559aa6ca83weeksago/bin/sh-c#(nop)MAINTAINERNGINXDockerMa0B

    5f5490fb32ee3weeksago/bin/sh-c#(nop)CMD["/bin/bash"]0B

    709f780774583weeksago/bin/sh-c#(nop)ADDfile:f2453b914e7e026efd125.1MB

  • MODIFIERUNEIMAGESiuneimageestenlecture-seule,commentest-cequel’onla

    modifie?

    Onnelamodifiepas,

    Oncréeunconteneurdepuiscetteimage,

    Onfaitnosmodificationsdansceconteneur,

    Ontransformecesmodificationsenunecouche,

    Oncréeunenouvelleimageenvalidantcettecouchepar-

    dessuscellesdel’imagedebase.

  • CRÉATIONUSUELLED’IMAGESDeuxméthodes:

    dockercommit:

    sauvegardelesmodificationsapportéesàunconteneur

    dansunenouvellecouche

    créel’image

    dockerbuild:

    séquenced’instructionsrépétables,

    Dockerfile

    Méthoderecommandée

  • CRÉATIOND’IMAGEINTERACTIVEinteractive==manuellement:

    Onlanceunshelldansconteneur

    Onfaitlesmodificationsvoulues:

    ajoutdepaquets,defichiers,etc..

    Oncommitcesmodificationsenimage

    Onpeutéventuellementtaggerl’image

  • ENPRATIQUEInstallationdeNginx

    $dockerrun-itdebian/bin/bash

    root@05739348bc4e:/#

    root@05739348bc4e:/#aptupdate&&aptinstall-ynginx

  • COUCHECOW$dockerdiff05739348bc4e

    A/etc/rc1.d/K01nginx

    C/etc/default

    A/etc/default/nginx

    C/etc/ld.so.cache

    A/etc/nginx

  • VALIDATIONENUNECOUCHE$dockercommit05739348bc4e

    4f98b27dcc19d60c913ba29516bc31c9b0c80d2ebfdd28f99f43521db3caffed

  • UTILISATIONDENOTREIMAGEdockerrun-it4f98b27dcc19d60c/bin/bash

    root@9fc1ee35e2a4:/#nginx-v

    nginxversion:nginx/1.6.2

  • TAGGERNOTREIMAGE$dockertag4f98b27dcc19d6benedetti/nginx

    $dockertagbenedetti/nginxbenedetti/nginx:0.1

    $dockerimagesbenedetti/nginx

    REPOSITORYTAGIMAGEIDCREATEDVIRTUALSIZE

    benedetti/nginx0.14f98b27dcc1912minutesago194.3MB

    benedetti/nginxlatest4f98b27dcc1912minutesago194.3MB

    $dockerrun-itbenedetti/nginxnginx-v

    nginxversion:nginx/1.6.2

  • HISTORIQUEDENOTREIMAGE$dockerhistorybenedetti/nginx

    IMAGECREATEDCREATEDBYSIZECOMMENT

    4f98b27dcc1914minutesago/bin/bash71.33MB

    93a2e30f10004daysago/bin/sh-c#(nop)CMD["/bin/bash"]0B

    d5daf556aca74daysago/bin/sh-c#(nop)ADDfile:cae7a35a0d8c43d5ba123MB

  • CRÉATIONINTERACTIVEIntérêt

    manipulationusuelle

    bienpourtesterrapidementquelquechose

    Désavantage

    Manuelle

    Nonrépétable

  • CRÉATIONAUTOMATISÉED’IMAGEEcrireunDockerfile

    Créerl’imageàpartirduDockerfile

  • DOCKERFILEPrincipe:

    Recetteautomatiséedecréationd’images

    Contientunesuited’instructions

    LacommandedockerbuildutiliseleDockerfilepourcréer

    l’image

  • NOTREPREMIERDOCKERFILEOntravailledansundossierquivacontenirleDockerfile

    propreànotrefutureimage:

    OnseplacedanscedossieretonouvreunfichierDockerfile

    ContenuduDockerfile:

    $mkdir-p~/docker/nginx

    $cd~/docker/nginx/

    $editDockerfile

    FROMdebian

    RUNapt-getupdate

    RUNapt-getinstall-ynginx

  • INSTRUCTIONSUnDockerfileestcomposéd’instruction,uneparligne.

    FROM:imagedebaseàutiliserpournotrefutureimage

    UnseulFROMparDockerfile

    RUN:commandeshellàexécuter

    serontexécutéesdurantleprocessusdebuild

    utilisableàvolonté

    non-interactive:aucuninputpossibledurantlebuild

  • BUILDIT!DepuisledossiercontenantleDockerfile

    $dockerbuild-tbenedetti/nginx:0.2.

    SendingbuildcontexttoDockerdaemon2.048kB

    Step1:FROMdebian

    --->93a2e30f1000

    Step2:RUNapt-getupdate

    --->Runningin20f50a8284f5

    Get:1http://security.debian.orgjessie/updatesInRelease[63.1kB]

    ...

    Processingtriggersforsgml-base(1.26+nmu4)...

    --->95f9e15fa8d2

    Removingintermediatecontainere99f0c6f5bd2

    Successfullybuilt95f9e15fa8d2

  • REBUILDIT!Sionrelancelebuild,ilserainstantané

    Achaqueétape,Dockerprenduninstantanédansun

    conteneur

    Avantd’exécuteruneétape,Dockervérifies’iln’apasdéjà

    exécutécetteséquence

  • EXÉCUTIONL’imageobtenuepermetdedémarrerunconteneur,de

    manièresimilaireàcellecrééemanuellement:

    $dockerrun-itbenedetti/nginx:0.2nginx-v

    nginxversion:nginx/1.6.2

  • HISTORIQUEDIFFÉRENTL’historiqueentreuneimagecrééeinteractivementet

    manuellementdiffèrenéanmoins:

    $dockerhistorybenedetti/nginx:0.2

    IMAGECREATEDCREATEDBYSIZECOMMENT

    95f9e15fa8d27minutesago/bin/sh-capt-getinstall-ynginx61.5MB

    b8b4c747628c10minutesago/bin/sh-capt-getupdate9.828MB

    93a2e30f10004daysago/bin/sh-c#(nop)CMD["/bin/bash"]0B

    d5daf556aca74daysago/bin/sh-c#(nop)ADDfile:cae7a35a0d8c43d5ba123MB

  • CMDAvecl’instructionCMD,onpeutdéfinirunecommandeà

    exécuterpardéfautlorsquel’onlanceunconteneur.

    Parexemple:

    $dockerrun-itbenedetti/nginx

    nginxversion:nginx/1.6.2

    Guillaume Urvoy-Kelleron obtient la version du nginx embarqué dans le conteneur à cause du build…transparent suivant

  • UTILISATIONDECMDFROMdebian

    RUNapt-getupdate

    RUNapt-getinstall-ynginx

    CMDnginx-v

  • BUILDETTESTDECMD$dockerbuild-tbenedetti/nginx:0.3.

    $dockerrun-itbenedetti/nginx:0.3

    nginxversion:nginx/1.6.2

  • OUTREPASSERCMD$dockerrun-itbenedetti/nginx:0.3echosalut

    salut

  • ENTRYPOINTDéfinitunecommandedebaseàexécuterparle

    conteneur,

    Lesparamètresdelalignecommandesontajoutésàces

    paramètres.

  • UTILISATIONDEENTRYPOINTFROMdebian

    RUNapt-getupdate

    RUNapt-getinstall-ynginx

    ENTRYPOINT["nginx","-g"]

  • BUILDAVECENTRYPOINT$dockerbuild-tbenedetti/nginx:0.4.

  • EXÉCUTIONDEENTRYPOINT

    Depuisunautreterminal:

    $dockerrun-itbenedetti/nginx:0.4"parambidon;"

    nginx:[emerg]unknowndirective"param"incommandline

    $dockerrun-itbenedetti/nginx:0.4"daemonoff;"

    #nginxs'exécuteenavantplan

    $dockerps

    CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES

    29e86a41e506benedetti/nginx:0.4"nginx-g'daemonoff"AboutaminuteagoUpAboutaminutefurious_mcclintock'"

  • CMDETENTRYPOINTFROMdebian

    RUNapt-getupdate

    RUNapt-getinstall-ynginx

    ENTRYPOINT["nginx","-g"]

    CMD["daemonoff;"]

    Guillaume Urvoy-KellerSource : https://stackoverflow.com/questions/21553353/what-is-the-difference-between-cmd-and-entrypoint-in-a-dockerfile#21564990

    Docker has a default entrypoint which is /bin/sh -c but does not have a default command.

    When you run docker like this: docker run -i -t ubuntu bash the entrypoint is the default /bin/sh -c, the image is ubuntu and the command is bash.

    The command is run via the entrypoint. i.e., the actual thing that gets executed is /bin/sh -c bash. This allowed Docker to implement RUN quickly by relying on the shell's parser.

    Later on, people asked to be able to customize this, so ENTRYPOINT and --entrypoint were introduced.

    Everything after ubuntu in the example above is the command and is passed to the entrypoint. When using the CMD instruction, it is exactly as if you were doing docker run -i -t ubuntu . will be the parameter of the entrypoint.

    You will also get the same result if you instead type this command docker run -i -t ubuntu. You will still start a bash shell in the container because of the ubuntu Dockerfile specified a default CMD: CMD ["bash"]

  • BUILDCMDETENTRYPOINT$dockerbuild-tbenedetti/nginx:0.5.

  • EXÉCUTIONCMDETENTRYPOINT

    Nousavonsunnginxquitourne:commentyaccéder?

    $dockerrun-dbenedetti/nginx:0.5

    10bb961dfe60fc4c92b45f6a1a390f62f7edc0f6d78fe2088a0cf08c6d6cb040

  • EXPOSERLESPORTSD’UNCONTENEURTouslesportssontprivéspardéfaut

    Unportprivén’estpasaccessibledel’extérieur

    C’estauclientàrendrepublicsounonlesportsexposés

    Public:accessiblepard’autresconteneursetendehors

    del’hôte.

  • EXPOSERUNPORTVIALACLI$dockerrun-d-p8080:80benedetti/nginx:0.5

    $dockerps

    CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES

    0ed02461dc0ebenedetti/nginx:0.5"nginx-g'daemonoff"37secondsagoUp32seconds0.0.0.0:8080->80/tcpserene_stallman

    Guillaume Urvoy-Kellerport de l’hôte

    Guillaume Urvoy-Kellerport interne du container

    Guillaume Urvoy-Keller

    Guillaume Urvoy-Keller

  • ACCÈSWEB

  • EXPOSEInstructionDockerfilequiindiqueàDockerquel(s)port(s)

    publierpournotreimage.

    Cesportsserontautomatiquementexposésavecl’option-P

    aulancementd’unconteneur.

  • EXPOSEETDOCKERFILEFROMdebian

    RUNapt-getupdate

    RUNapt-getinstall-ynginx

    EXPOSE80443

    ENTRYPOINT["nginx","-g"]

    CMD["daemonoff;"]

  • BUILDAVECEXPOSE$dockerbuild-tbenedetti/nginx:0.6.

  • EXÉCUTIONAVEC-P$dockerrun-it-P-dbenedetti/nginx:0.6

    e1696c7edeaf6c68893244e6dee10950e1829cd43a9bbc6b5abf04a5db31b341

    $dockerps

    CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES

    e1696c7edeafbenedetti/nginx:0.6"nginx-g'daemonoff"5secondsagoUp2seconds0.0.0.0:32772->80/tcp,0.0.0.0:32771->443/tcpclever_bartik

    $dockerporte1696c7edeaf

    443/tcp->0.0.0.0:32771

    80/tcp->0.0.0.0:32772

    $dockerporte1696c7edeaf80

    0.0.0.0:32772

    Guillaume Urvoy-Keller-P dit à Docker de rendre public les ports qui ont été exposés.C’est Docker qui choisit les n° publics si vous ne les préciser pas avec -p

    Guillaume Urvoy-Keller

    Guillaume Urvoy-Keller

  • TESTDEEXPOSE$curlhttp://localhost:32772

    WelcometonginxonDebian!

  • COPYL’instructionCOPYpermetdecopierfichiersetdossiers

    depuislecontextedegénération,dansleconteneur.

    Imaginonsquel’onveuillemodifierlapaged’accueildenotre

    serveurNginx?

  • DOCKERFILEAVECCOPY$echo"BienvenuesurmonimageNginx">index.html

    FROMdebian

    RUNapt-getupdate

    RUNapt-getinstall-ynginx

    EXPOSE80443

    COPYindex.html/var/www/html/index.html

    ENTRYPOINT["nginx","-g"]

    CMD["daemonoff;"]

  • BUILDAVECCOPY$dockerbuild-tbenedetti/nginx:0.7.

  • TESTDECOPY$dockerrun-it-P-dbenedetti/nginx:0.7

    87987bf2e06f0d14dcbf6d9d65eabb5adc34b5b56bc95f195b564b52de6f0a39

    $dockerport87987bf280

    0.0.0.0:32776

    $curlhttp://localhost:32776

    BienvenuesurmonimageNginx

  • ADDL’instructionADDfonctionnecommeCOPY,avecdes

    fonctionnalitésenplus:

    Peutrécupérerdesfichiersenligne(URL )

    Peutautomatiquementdécompresserdesziplocaux

    http://

    http:/

  • VOLUMESProblèmes:

    Sijeveuxmodifierindex.html,jedoisregénéreruneimage

    laborieuxsurtoutenphasedetest

    Nginxgénéredeslogs

    Cesmodificationsengendrentdesdonnéesdansune

    couche

    Jevoudraislespartageravecunautreserveur

  • VOLUMELesvolumespeuventêtrepartagés:

    entreconteneurs

    entrehôteetunconteneur

    Lesaccèsausystèmedefichiersviaunvolume

    outrepassentleCoW:

    Meilleuresperformances

    Nesontpasenregitrésdansunecouchepournepasêtre

    enregistrésparundockercommit

  • NOTREPREMIERVOLUME$dockerrun-d-v$(pwd):/var/www/html-Pbenedetti/nginx:0.7

    86bc6648b0bb2423adbb20c7dcdd6b3b27d2c4c5670a9330cc7571c2ec35be42

    $dockerexec-it86bc6648b0bb2423adbb20c7dls/var/www/html

    Dockerfileindex.html

    $dockerport86bc6648b0bb242380

    0.0.0.0:32780

    $curlhttp://localhost:32780

    BienvenuesurmonimageNginx

    $echo"Miseàjourdufichierindex.html">index.html

    $curlhttp://localhost:32780

    Miseàjourdufichierindex.html

  • CRÉATIONDEVOLUMENOMMÉ$dockervolumecreate--name=logs

    logs

    $dockerrun-P-vlogs:/var/log/nginx-dbenedetti/nginx:0.7

    055ac104acf1d734ae38005e96512f666cbe483b1db87b653648d045c2c1a744

    $dockerrun-it--volumes-from055ac104acf1d73debianls/var/log/nginx

    access.logerror.log

  • PERSISTENCELesvolumesexistentindépendammentdesconteneurs

    Siunconteneureststoppé,sesvolumessontencore

    disponibles

    Vousêtesresponsabledelagestion,delasauvegardedes

    volumes

  • LISTERLESVOLUMES

    Onpeutmontercesvolumesdepuisunautreconteneur

    dockervolumels

    DRIVERVOLUMENAME

    local57a0848c5e5f2924be84a66157e84e830757922c7b5b856aa5bac12e494da495

    locallogs

  • MÉNAGEVOLUME$dockerrm055ac104acf1d734

    $dockervolumels-fdangling=true|greplogs

    $dockervolumermlogs

  • BONUSMÉNAGESupprimertouslesvolumesnonmontés(Danger!)

    $dockervolumerm$(dockervolumels-qfdangling=true)

  • CONCLUSION

  • DOCKERBasésurdestechnologieséprouvées

    Desoutils,unéco-système

  • AVECDOCKER… ..jepeux:

    Mettremesapplicatifsdansdesconteneurs,

    Exécutercesconteneurs(presque)partout,

    Créeretautomatiserlagénérationd’images,

    HébergeretpartagermesimagesavecunRegistre.

  • RÉFÉRENCESDocumentationofficielle

    Vidéosd’apprentissageofficielles

    JérômePetazzoni-IntroductiontoDockerandcontainers

    -PyCon2016

    JérômePetazzoni:Cgroups,namespaces,andbeyond:

    whatarecontainersmadefrom?-PyCon2016

    https://docs.docker.com/https://training.docker.com/self-paced-traininghttps://www.youtube.com/watch?v=ZVaRK10HBjohttps://www.youtube.com/watch?v=sK5i-N34im8

  • ORCHESTRATIONDOCKERBenoîtBenedetti

  • PROBLÉMATIQUESJusqu’àprésent,nousavonstravailléavecuneapplication

    monolithique,surunseulhôteDocker.

    Nousvoulonsdéployeretgérerdesapplicationsdetype

    micro-services,surplusieurshôtes.

  • PLANDECETTESÉANCE

    Réseau

    DockerCompose

    DockerMachine

    DockerSwarm

  • RÉSEAU

  • INTRODUCTIONNousavonsdéjàvuquelesconteneurspouvaientexposer

    leurport.

    Dockerproposed’autresmoyenspourinterconnecterdes

    conteneurs:

    Lafonctionnaliténetwork,nouvelle

    Lesliens,historiques

  • NETWORKQuandvousinstallezDocker,3réseauxsontcréés

    automatiquement,bridge,none,ethost,suivant3pilotes

    bridge,nullethost.

    $dockernetworkls

    NETWORKIDNAMEDRIVER

    7fca4eb8c647bridgebridge

    9f904ee27bf5nonenull

    cf03ee007fb4hosthost

  • NONEETHOST

    none:

    typenull:auunréseaupourunconteneursurunréseau

    decetype

    host

    typehost:stackréseauidentiqueàl’hôte

    Vousn’aurezsûrementjamaisàutilisercesréseaux,etcréer

    desréseauxdecestypes.

  • PILOTEETRÉSEAUBRIDGELepilotebridgeinterconnectelesconteneursquisetrouve

    surunréseaudecetypedepilote.

    Vouspouvezexposerdesportssurcetypederéseau

    Lesconteneursdoiventtouss’exécutersurl’hôtedu

    réseau(mono-hôte)Pardéfaut,ledémonDockerconnecte

    vosconteneursdansleréseaubridge.

    Guillaume Urvoy-Kellernt

    Guillaume Urvoy-Keller

  • CRÉATIONDERÉSEAUVouspouvezcréerdesréseaux.Dockerproposedeuxpilotes

    pourlescréer:

    Bridge

    Overlay:

    équivalentàbridgemaismulti-host

  • EXEMPLE$dockernetworkcreate-dbridgemy-bridge-network

    $dockerrun-d--network=my-bridge-network--namedbtraining/postgres

  • COMPOSE

  • BILAN

    Onsaitcréerdesimages

    demanièremanuelle

    demanièreautomatisée

    Onsaitlancerdesconteneurs

    partagerlesdonnéesavecdesvolumes

    lesinterconnectersurleréseau

  • PROBLÈME

    Onveutcoordonnerdesconteneurs

    Onveutsimplifierlagestionmulti-conteneurs

    Onneveutpasutiliserdescriptsshellcomplexes

    Onveutuneinterfacestandardiséeavecl’APIDocker

  • EXEMPLE:WORDPRESS$dockerrun--namedb-eMYSQL_ROOT_PASSWORD=secret-dmysql

    $dockerrun--namewp-p8080:80--linkdb:mysql-dwordpress

    Guillaume Urvoy-Keller-e : permet le passage de paramètre- d expose un volume-- link récupère le volume d’un autre container

  • COMMENTFAIREPOUR

    Gérerlesdeuxconteneursàlavolée?

    Gérerdesvolumes?

    Gérerdesportsdifférents?

    Mesouvenirdecescommandes?

  • SOLUTIONComposevouspermetd’éviterdegérerindividuellementdes

    conteneursquiformentlesdifférentsservicesdevotre

    application.

    Outilquidéfinitetexécutedesapplicationsmulti-

    conteneurs

    Utiliseunfichierdeconfigurationdanslequelvous

    définissezlesservicesdel’application

    Al’aided’unesimplecommande,vouscontrôlezlecyclede

    viedetouslesconteneursquiexécutentlesdifférents

    servicesdel’application.

  • UTILISATION

    Vousdéfinissezl’environnementdevotreapplicationpour

    qu’ilsoitpossibledelagénérerden’importeoù

    àl’aidedeDockerfile

    àl’aided’imageofficielle

    Vousdéfinissezvosservicesdansunfichierdocker-

    compose.ymlpourlesexécuteretlesisoler.

    Exécutezdocker-composequisechargerad’exécuter

    l’ensembledevotreapplication

  • SERVICESComposeintroduitunenotiondeservice:

    Concrétement,unconteneurexécutantunprocessus

    Chaqueconteneurexécuteunserviceinter-dépendant

    Leservicepeut-êtreévolutifenlançantplusoumoins

    d’instancesduconteneuravecCompose.

    ExempleWordpress:

    Servicedb

    Servicewordpress

  • EXEMPLEDOCKER-COMPOSE.YMLversion:'2'

    services:

    db:

    image:mysql:5.7

    volumes:

    -"./.data/db:/var/lib/mysql"

    restart:always

    environment:

    MYSQL_ROOT_PASSWORD:wordpress

    MYSQL_DATABASE:wordpress

    MYSQL_USER:wordpress

    MYSQL_PASSWORD:wordpress

    wordpress:

    depends_on:

    -db

    image:wordpress:latest

    links:

    -db

    ports:

    -"8000:80"

    restart:always

    environment:

    WORDPRESS_DB_HOST:db:3306

    WORDPRESS_DB_PASSWORD:wordpress

  • DÉMARRAGED’UNEAPPLICATION

    Lesdifférentsservicesquicomposentmonapplicationont

    étédémarrés,aveclaconfigurationetl’environnementquiva

    bien.

    $docker-composeup-d

    Creatingwordpress_db_1

    Creatingwordpress_wordpress_1

  • INFORMATIONDEMONAPPLICATIONOnutiliselacommandepsdeCompose:

    $docker-composeps

    NameCommandStatePorts

    -------------------------------------------------------------------------------------

    wordpress_db_1docker-entrypoint.shmysqldUp3306/tcp

    wordpress_wordpress_1/entrypoint.shapache2-for...Up0.0.0.0:8000->80/tcp

    $docker-composepswordpress

    NameCommandStatePorts

    -------------------------------------------------------------------------------------

    wordpress_wordpress_1/entrypoint.shapache2-for...Up0.0.0.0:8000->80/tcp

  • CONTENEURSCLASSIQUESLesservicess’exécutentviadesconteneurssurl’hôte.Les

    commandesdockerclassiquessonttoujoursfonctionnelles.

    $dockerps

    CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES

    8d086aeba614wordpress:latest"/entrypoint.shapach"7minutesagoUp7minutes0.0.0.0:8000->80/tcpwordpress_wordpress_1

    689405bb755dmysql:5.7"docker-entrypoint.sh"7minutesagoUp7minutes3306/tcpwordpress_db_1

  • LOGSLogsd’uneapplication:

    Logsd’unservice

    $docker-composelogs

    $docker-composelogsdb

  • PASSAGEÀL’ÉCHELLEOnpeutpasseràl’échelleunservice.Autrementdit,onpeut

    augmenter/diminuerlenombredeconteneursexécutantun

    service

    Pardéfaut,Composeexécutechaqueserviceavecun

    conteneur.

  • SCALEOnutiliselacommandescalepourchangerlenombrede

    réplicasd’unservice:

    $docker-composescaledb=3

    $docker-composepsdb

    NameCommandStatePorts

    ---------------------------------------------------------------

    wordpress_db_1docker-entrypoint.shmysqldUp3306/tcp

    wordpress_db_2docker-entrypoint.shmysqldUp3306/tcp

    wordpress_db_3docker-entrypoint.shmysqldUp3306/tcp

    $docker-composescaledb=2

  • CYCLEDEVIE$docker-composeup

    $docker-composestop#oukill

    $docker-composestart

    $docker-composerestart

    $docker-composerm

    $docker-composedown#==stop+rm

    Guillaume Urvoy-Kellerle kill est à faire dans le répertoire du .yml

  • RÉSUMÉCOMPOSE

    Composeestunoutilpourdéfinir,lanceretgérerdes

    servicesquisontdéfiniscommeuneouplusieursinstances

    d’unconteneur,

    ComposeutiliseunfichierdeconfigurationYAMLcomme

    définitiondel’environnement,

    Avecdocker-composeonpeutgénérerdesimages,lancer

    etgérerdesservices,…

    Certainescommandesdedocker-composesont

    équivalentesàl’outildocker,maiss’appliquentseulement

    auxconteneursdelaconfigurationdecompose.

  • DOCKERMACHINE

  • PROBLÉMATIQUE

    JeveuxpouvoirdéployerdeshôtesDockeràlavolée.

    Jeveuxlesutiliserdemanièretransparente

    Jeveuxconfigurermonclientdockerfacilementpour

    utiliserteloutelhôteDocker.

  • PRINCIPEOutilenCLIquivouspermetd’installerDockerEnginesur

    deshôtesvirtuels,etdelesadministreraveclescommandes

    docker-machine.

    Vouspouvezl’utiliserpourcréerdeshôtesDockersurvotre

    Linux,WindowsouMaclocal,survotreréseau,dansvotre

    datacenter,ousurunfournisseurcloudcommeAmazon

    AWS.

  • DOCKER-MACHINEAl’aidedescommandesdocker-machinevouspouvez

    démarrer,inspecter,stopperetmettreàjourunserveur

    Docker,etconfigurervotreclientlocalpourutilisercette

    hôte.Vouspourrezensuiteutiliserdockerrun,dockerps,

    etc.,commed’habitude.

    Guillaume Urvoy-Keller

  • CRÉATIOND’UNEMACHINELacommandelaplusimportanteàconnaîtreestcellede

    créationd’unemachine:

    $docker-machinecreate--drivervirtualboxhost1

  • EFFETLacommandeprécédenteapoureffetde:

    Créerundossierdeconfigurationpourchaquemachine

    (~/.docker/machine/machines/host1)

    Créerunemachine(virtuelle,locale,…)suivantlepilote

    utilisé

    D’yinstallerDocker

    VirtualBox=Boot2Docker

    Cloud:Ubuntu

    Deconfigurerlescléssshpourutilisernotremachine

  • GESTIOND’UNEMACHINE$docker-machinels

    NAMEACTIVEDRIVERSTATEURLSWARMDOCKERERRORS

    host1-virtualboxRunningtcp://192.168.99.108:2376v1.12.1

    $docker-machinesshhost1

    $docker-machineinspecthost1

    $docker-machineiphost1

    192.168.99.108

  • UTILISATION99%desinteractionsavecunhôteDockerserontdes

    opérationsvialesclientsDocker.

    InutiledeseconnecterenSSH.

    DockerfournitunmoyendeconfigurersonclientDocker

    pourutiliserunemachine.

    Guillaume Urvoy-Kelleri.e. les commandes Docker

  • CONFIGURATIONDUCLIENTIlfautconfigurerdesvariablesd’environnement.Pourles

    connaître,onexécute:

    $docker-machineenvhost1

    exportDOCKER_TLS_VERIFY="1"

    exportDOCKER_HOST="tcp://192.168.99.108:2376"

    exportDOCKER_CERT_PATH="/home/benben/.docker/machine/machines/host1"

    exportDOCKER_MACHINE_NAME="host1"

    #Runthiscommandtoconfigureyourshell:

    #eval$(docker-machineenvhost1)

  • RÉSULTAT

    Machinehost1estdésormaisactive.

    $eval$(docker-machineenvhost1)

    $docker-machinels

    NAMEACTIVEDRIVERSTATEURLSWARMDOCKERERRORS

    host1*virtualboxRunningtcp://192.168.99.108:2376v1.12.1

  • UTILISATIONMaintenantquevotreclientestconfiguré,l’utilisationdela

    machineactivesefaitdemanièretransparente:

    Utilisationduclientdocker

    Utilisationdedocker-compose

    etc

  • RÉ-INITIALISERLECLIENTJeveuxré-initialiserleclientDockerpourutiliserl’hôtelocal:

    $docker-machineenv-u

    unsetDOCKER_TLS_VERIFY

    unsetDOCKER_HOST

    unsetDOCKER_CERT_PATH

    unsetDOCKER_MACHINE_NAME

    #Runthiscommandtoconfigureyourshell:

    #eval$(docker-machineenv-u)

    $eval$(docker-machineenv-u)

    $docker-machinels

    NAMEACTIVEDRIVERSTATEURLSWARMDOCKERERRORS

    host1-virtualboxRunningtcp://192.168.99.108:2376v1.12.1

  • RÉSUMÉMACHINEMachinepermetde:

    CréerdeshôtesDockerrépartis

    Lesutiliserdemanièretransparente

    ConfigurerrapidementleclientDockerpourutiliserl’un

    oul’autre

    Inconvénients:

    Onnepeututiliserqu’unhôteàlafois

    Ilfautdoncmettreàjourlaconfigurationduclientpour

    utiliserunhôte

  • SWARM

  • PROBLÈMEVousavezplusieurshôtesDocker.

    Vousdésirezlesutilisersousformedecluster,etrépartirde

    manièretransparentel’exécutiondeconteneur.

  • SOLUTIONDockerEngine1.12inclutlemodeswarmpournativement

    gérerunclusterdeDockerEnginesqu’onnommeunswarm

    (essaim).

    OnutiliselaCLIDockerpourcréerunswarm,déployerdes

    serviced’applicationsurunswarm,etgérerlecomportement

    devotreswarm.

  • MODESWARM

    Lesfonctionnalitésdegestionetorchestrationdecluster

    inclusesdansleDockerEngine.

    LesMoteursDockerparticipantàunclusters’exécutenten

    modeswarm.

    Unswarm(essaim)estunclusterdeDockerEnginessur

    lequelvousdéployezdesservices.

    LaCLIDockerinclutlagestiondesnoeudsd’unswarm

    ajoutdenoeuds,

    déploiementdeservices,

    gestiondel’orchestrationdesservices

  • NOEUDUnnoeudestuneinstanceDockerEngineparticipantàun

    swarm.

    Noeuddetypemanager:

    déploielesapplicationssuivantlesdéfinitionsde

    servicesquevousluisoumettez,

    dispatchelestâchesaunoeuddetypeworker,

    Gestionducluster,orchestration

    Unleaderestchoisiparmilesmanagerspourgérerles

    tâchesd’orchestration

    NoeudWorker:

    Guillaume Urvoy-KellerNoeud Worker: * reçoit et exécute les tâches depuis les managers * un manager est également un worker * Notifie les managers de son état pour l'orchestration

    Guillaume Urvoy-Keller

  • SERVICESETTÂCHES

    Unserviceestladéfinitiondetâchesàexécuterparles

    workers

    exécutiond’unecommandeviaunconteneur

    utiliseuneimage

    deuxmodesd’exécutiondeservice:

    repliqué:unmanagerdistribueunnombredonnéde

    tâchessurchaquenoeud

    global:exactementunetâcheestexécutéparnoeud

    tâche:unitéatomiqued’exécutiond’unswarm

    représenteleconteneuretlacommandeàyexécuter

    Guillaume Urvoy-Keller tâche: unité atomique d'exécution d'un swarm * représente le conteneur et la commande à y exécuter * assigné à un worker par un manager suivant le nombre de réplica défini par le service * ne peut changer de noeud, s'exécute sur ce noeud ou échoue.

    Guillaume Urvoy-Keller

  • DIAGRAMMEDESSERVICESETTÂCHES

  • RÉPARTITIONDECHARGE

    Lemanagerutiliseunerépartitiondechargeverstousles

    workerspourexposerlesportsdesservices

    Leportrendupublicestégalementaccessiblesurtout

    workerduswarm

    ChaqueserviceduswarmàsonproprenomDNSinterne:

    Lemanagerutiliseunerépartitiondechargeinterne

    pourdistribuerlesrequêtesdesservicesducluster.

  • COMMANDENODE

    Unclusterestinitialiséavecdockerswarminit.Aexécuter

    unefoissurunhôte.

    $dockernodels

    Errorresponsefromdaemon:Thisnodeisnotaswarmmanager.[...]

  • CRÉERNOTRESWARM

    Danslasortiedelacommande,unmessagenousindiquela

    commandeàexécuterpourajouterunworkerànotre

    nouveauswarm.

    $dockerswarminit--advertise-addr

    Swarminitialized:currentnode(8jud...)isnowamanager.

    Toaddaworkertothisswarm,runthefollowingcommand:

    dockerswarmjoin\

    --tokenSWMTKN-1-59fl4ak4nqjmao1ofttrc4eprhrola2l87...\

    172.31.4.182:2377

  • VÉRIFIERL’ÉTATDENOTRESWARMOnutiliselaclassiquecommandedockerinfo:

    $dockerinfo

    Swarm:active

    NodeID:8jud7o8dax3zxbags3f8yox4b

    IsManager:true

    ClusterID:2vcw2oa9rjps3a24m91xhvv0c

  • PREMIÈRECOMMANDEENMODESWARMPourvoirlesinformationsdesnoeudsduswarm:

    $dockernodels

    IDHOSTNAMESTATUSAVAILABILITYMANAGERSTATUS

    8jud...ox4b*ip-172-31-4-182ReadyActiveLeader

  • SOUSLECAPOTlorsdudockerswarminit,uncertificatRacineTLSaétécréé.

    Puisunepairedecléspournotrepremiernoeud,signéeavec

    lecertificat.

    Pourchaquenouveaunoeudseracrééesapairedeclésignée

    aveclecertificat.

    TouteslescommunicationssontainsichiffréesenTLS.

  • TOKENDockeragénéré2tokensdesécurité(équivalentd’une

    passphraseoupassword)pournotrecluster,àutiliserlorsde

    l’ajoutdenouveauxnoeuds:

    Untokenpourlesworkers

    Untokenpourlesmanagers

    Récupérationdestokens:

    $dockerswarmjoin-tokenworker

    $dockerswarmjoin-tokenmanager

  • AJOUTD’UNWORKERAUCLUSTERSeconnecteràunautreserveurDocker:

    $dockerswarmjoin\

    --tokenTOKEN-WORKER...\

    172.31.4.182:2377

  • CLUSTERDE2NOEUDS$dockernodels

    IDHOSTNAMESTATUSAVAILABILITYMANAGERSTATUS

    8jud...ox4b*ip-172-31-4-182ReadyActiveLeader

    ehb0...4fvxip-172-31-4-180ReadyActive

  • AJOUTD’UNMANAGER$dockerswarmjoin\

    --tokenTOKEN_MANAGER...\

    172.31.4.182:2377

  • CLUSTERDE3NOEUDS$dockernodels

    IDHOSTNAMESTATUSAVAILABILITYMANAGERSTATUS

    8jud...ox4b*ip-172-31-4-182ReadyActiveLeader

    abcd...1234ip-172-31-4-181ReadyActiveManager

    ehb0...4fvxip-172-31-4-180ReadyActive

  • PROMOUVOIRUNWORKERENMANAGER

    Inverse:demote

    $dockernodepromoteNODE

  • QUITTERUNSWARM$dockerswarmleavenode-2

    $dockernodermnode-2

  • EXÉCUTERUNSERVICEOnutiliselacommandeservicesurunmanagerenmode

    Swarm:

    $dockerservicecreate--replicas1--namehelloworldalpinepingdocker.com

    9uk4639qpg7npwf3fn2aasksr

  • LISTERLESSERVICES$dockerservicels

    IDNAMESCALEIMAGECOMMAND

    9uk4639qpg7nhelloworld1/1alpinepingdocker.com

  • PSExécutezpspoursavoirsurquelnoeuds’exécutelatâche

    d’unservice:

    $dockerservicepshelloworld

    IDNAMESERVICEIMAGELASTSTATEDESIREDSTATENODE

    8p1vev3fq5zm0mi8g0as41w35helloworld.1helloworldalpineRunning3minutesRunningworker2

  • PASSAGEÀL’ÉCHELLEOnutilisescale

    $dockerservicescale=

  • EXEMPLE$dockerservicescalehelloworld=5

    helloworldscaledto5

    $dockerservicepshelloworld

    IDNAMESERVICEIMAGELASTSTATEDESIREDSTATENODE

    8p1vev3fq5zm0mi8g0as41w35helloworld.1helloworldalpineRunning7minutesRunningworker2

    c7a7tcdq5s0uk3qr88mf8xco6helloworld.2helloworldalpineRunning24secondsRunningworker1

    6crl09vdcalvtfehfh69ogfb1helloworld.3helloworldalpineRunning24secondsRunningworker1

    auky6trawmdlcne8ad8phb0f1helloworld.4helloworldalpineRunning24secondsAssignedmanager1

    ba19kca06l18zujfwxyc5lkynhelloworld.5helloworldalpineRunning24secondsRunningworker2

  • MODEGLOBALPardéfautlemoderépliquéestutilisé.Pourpasserenmode

    global:

    Chaqueworkerexécuteraunseulréplicaduservice

    Pourchaquenouveauworkerajouté,leréplicasera

    automatiquementdémarré

    $dockerservicecreate--namemyservice--modeglobalalpinetop

  • ROLLINGUPDATEMettreàjourunservice

    $dockerserviceupdate--imagenginx:3.0.7nginx

  • MISESÀJOURLemanagervaappliquerlamiseàjourduserviceaunoeud:

    Arrêtdelatâche

    miseàjourd’unetâchearrêtée

    démarrageduconteneurdelatâchemiseàjour

    attendreuncertaindélaiavantdepasseràl’autretâche

    etc,

    Siunetâcheestenéchec,interromprelamiseàjour.

  • STRATÉGIEDEMISEÀJOURVouspouvezconfigurerleparallélismedesmisesàjour,etun

    délaid’exécutionentrechaquemiseàjourdetâche:

    $dockerserviceupdateworker--update-parallelism2--update-delay5s

  • MODEMAINTENANCEPardéfaut,toutnoeudestACTIVE.Maisvouspouvezpasser

    unnoeudenmodemaintenance:

    $dockernodeupdate--availabilitydrainworker1

  • SORTIEDEMAINTENANCE$dockernodeupdate--availabilityactiveworker1

  • SUPPRIMERUNSERVICE$dockerservicermhelloworld

  • DISTRIBUTEDAPPLICATIONBUNDLESNousavonsvucommentgérerindividuellementdesservices.

    Nousallonsvoircommentoptimiserlagestiondeplusieurs

    servicesaveclespaquetsd’applicationrépartie.

    UnDABestàSwarm,cequeComposeestàunserveur

    uniqueDocker.

  • DABDescriptionauformatJSONdécrivantlesservicesd’une

    application

    Génération:

    Généreunfichier.dab

    $docker-composebundle

  • UTILISATIONLacommandestackpermetd’utilisercefichier.dab

    $dockerstackdeploydockercoins

    $dockerstackpsdockercoins

    $dockerstackrmdockercoins

  • LACUNESDESTACKOutilexpérimental,certainesfonctionnalitésnesontpas

    encoredisponibles:

    Globalscheduling

    Scaling

    etc

    Ilfautencorepasserparlacommandeserviceetgérerles

    servicesunàunpourcesopérations.

  • POURCONCLURE

    SwarmestunmoyendeconsolidervoshôtesDocker

    Moyensimplecompatibleavecl’APIdeDocker

    Beaucoupdefonctionnalitésencoreenbeta

  • NOUSAVONSVU

    Réseau

    Compose

    Machine

    Swarm

  • RÉFÉRENCES

    RéseaudansDocker

    DockerCompose

    DockerMachine

    DockerSwarm

    AtelierOrchestrationofficiel

    https://docs.docker.com/engine/userguide/networking/https://docs.docker.com/compose/overview/https://docs.docker.com/machine/overview/https://docs.docker.com/engine/swarm/https://jpetazzo.github.io/orchestration-workshop/#1