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/#1Top Related