INTRODUCTION À DOCKER - unice.frurvoy/docs/ADM/CM.pdf · Définit automatiquement une priorité ou...
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