Development with Docker, Deployment with Docker.
Development andDeployment withDocker atDwango@ixixi
View Slide
%8"/(0$P -UE:VSJ0EBHJSJ !JYJYJ3FDPNNFOEBUJPOTZTUFNBSDIJUFDU
Development with Docker
/JDPOJDP"QQMJDBUJPO4FSWFS)551SFRVFTU8FC4FSWFS$BTTBOESB3FDPNNFOE "1*4FSWFSRecommendation API3FDPNNFOE4FSWFS0UIFS4FSWJDFTMPHT$BDIF4FSWFSMPHTw%PDLFSҎલ͔ΒՔಇ͍ͯ͠ΔϨίϝϯυ"1*wχίχίಈըͷʮؔ࿈ಈըʯͳͲΛฦ͢ɻ
Ϩίϝϯυͷ֬ೝͱςετwϨίϝϯυͷγεςϜʹखΛՃ͑ͨ߹ʹɺϨίϝϯυ݁Ռ͕Ͳ͏ มԽ͢Δ͔ͷ֬ೝɺίʔυϨϏϡʔɾ6OJU5FTUͰอূͮ͠Β͍ɻ!wQVMMSFRΛNBTUFSʹऔΓࠐΉຊ൪σϓϩΠͳͷͰɺ֬ೝແ͠Ͱͷೖͨ͘͠ͳ͍ɻ!wͲ͏ʹ͔ͯ͠ɺखܰʹʮ࣮ࡍͷڥΛ֬ೝʯग़དྷΔΑ͏ʹ͍ͨ͠ɻ
Γ͍ͨ͜ͱwQVMMSFRग़ͨ͠ΒɺϨίϝϯυʹؔΘΔ%PDLFSͷ ίϯςφҰἧ͍ lܥz͕উखʹཱͭɻwࣗͰڥΛ࡞ͬͯࢼ͞ͳͯ͘ɺ ʮ͜͜Ͱطʹಈ͍͍ͯΔΑʯͱ͍͏ঢ়ଶ͕࠷ߴɻ!wϨίϝϯυ"1*Ͱɺ࣮ࡍʹԿ͕Ϩίϝϯυ͞ΕΔ͔ දࣔग़དྷΔ3FDPNNFOE7JFXFS ෦πʔϧͰݟ͍ͨɻطʹಈ͍͍ͯΔ
/JDPOJDP"QQMJDBUJPO4FSWFS)551SFRVFTU8FC4FSWFS$BTTBOESB3FDPNNFOE "1*4FSWFSContainerize!3FDPNNFOE4FSWFS0UIFS4FSWJDFTMPHT$BDIF4FSWFSMPHT3FDPNNFOE7JFXFS)551SFRVFTU
pull request builderͰҰ্ཱࣜͪ͛&௨wKFOLJOTͷQVMMSFRVFTUCVJMEFSΛར༻ɻwKPCDIBJOͰςετ͔Βίϯςφ࡞ɺίϝϯτॻ͖ࠐΈ·Ͱ࣮ߦɻQVMMSFRVFTUCVJMEFSQVMMSFRVFTU௨ৗͷςετQVMMSFRVFTUΛөͨ͠EPDLFSίϯςφ࡞EPDLFSίϯςφͰܥΛҰࣜىಈଓઌϙʔτใΛQVMMSFRίϝϯτʹॻࠐίϝϯτʹॻ͖ࠐΈ
ίϯςφੜwQVMMSFRVFTUʹରԠͨ͠ίϯςφ໊ͷQSFpYΛ࡞Δɻ wྫQVMMSFR൪߸͕Ͱ࣌ࠁ͕ͳΒ ɹɹQVMMSFR@SFDPNNFOE@BQJ@@U wಉҰQVMMSFRͰɺߋ৽͞ΕΔʹίϯςφੜ͍ͨ͠ͷͰɺ͕࣌ඞཁɻ wQVMMSFRऴྃ࣌ ޙड़ʹ͜ͷQSFpYΛར༻ɻ
ίϯςφͰʮܥʯΛཱͯΔwHJUQVMM͔ͯ͠ΒpHCVJME͢ΔSBLFUBTLΛ࣮ߦwQVMMSFRʹରԠͨ͠CSBODIΛͬͯCVJME͕ΔɻwΞϓϦߋ৽෦ҎલΩϟογϡ͕ޮ͘ͷͰCVJMEߴ!wੜͨ͠QSFpYΛՃͨ͠ίϯςφ໊ͰpHVQ͢ΔSBLFUBTL࣮ߦ!wDBTTBOESBSFEJTͷαʔόɺμϛʔσʔλ͕ ೖͬͨίϯςφ্ཱ͕͕ͪΔɻ!wQVMMSFRͷίϝϯτͰɺىಈͤ͞Δ֤ίϯςφͷ CSBODIΛ໌ࣔࢦఆ͢Δ͜ͱՄೳɻ ผͷSFQPTJUPSZͷQVMMSFRҰॹʹద༻͢Δඞཁ͕͋Δ߹$BTTBOESB3FDPNNFE "1*4FSWFS3FDPNNFOE4FSWFS$BDIF4FSWFS3FDPNNFOE7JFXFSMJOLMJOLMJOLMJOL
PullReqίϝϯτͷॻ͖ࠐΈw֤ίϯςφׂ͕ΓͯΒΕͨϙʔτΛऔಘɻ!wଓใΛ()FͷQVMMSFRίϝϯτʹॻ͘ɻ
Garbage Collection (daily)wQVMMSFRVFTU͕DMPTF͞ΕͨΒίϯςφΛࢭΊΔআ͢Δɻ wKFOLJOTͰQVMMSFRVFTUͷDMPTFIPPL͢Δ͜ͱ͕͔ͬͨͨ͠Ίɺ࣍Ͱ($ɻ DSPO wEPDLFSͷίϯςφ໊ͷQSFpYΛQBSTFͯ͠ɺSFQPTJUPSZͱQVMMSFRVFTU൪߸Λऔಘɻ w֘QVMMSFRVFTU͕DMPTF͞Ε͍ͯΔ͔֬ೝ͠ɺด͍ͯͨ͡Βίϯςφఀࢭআɻ!wίϯςφ໊ͷQSFpYͰͳ͘FUDESFEJTʹରԠΛอ࣋ͯ͠ྑ͔͕ͬͨɺߏͷγϯϓϧ͞Λॏࢹɻ
developmentฤ Ή͢ͼwطଘͷϓϩμΫτΛ%PDLFSԽ͢Δͷਏ͍߹͕͋ͬͨɻwڥߏஙΛDIFGͰߦ͏લఏͷϓϩμΫτΛޙ͔Β%PDLFSԽ͢Δͷେมʹײͨ͡ɻ!wطଘ෦Λ%PDLFSԽ͢ΔΑΓɺ৽نͰ࡞ΔͷΛ%PDLFSԽલఏͰߏங͢Δํ͕ྑ͍ɻw1VMM3FRVFTUͰʮͦͷͰ࣮ࡍʹ৮ΕΔڥ͕طʹಈ͍͍ͯΔʯͷ࠷ߴɻ
Deployment with Docker
Personalize API/JDPOJDP"QQMJDBUJPO4FSWFS)551SFRVFTU8FC4FSWFS$BDIF %BUBCBTF3FWFSTF1SPYZ1FSTPOBMJ[F"1*• ύʔιφϥΠζʹར༻͢ΔAPI (golang࣮)• DockerલఏͰ৽نʹߏஙɻ
Containerize!• ύʔιφϥΠζAPI• ϩάసૹ&ू(fluentd)• CEPΤϯδϯ(Norikra)• ϩάอଘ (ES&InfluxDB)• ՄࢹԽ (Kibana&Grafana)• ϦόʔεϓϩΩγ1FSTPOBMJ[F"1*/JDPOJDP"QQMJDBUJPO4FSWFS)551SFRVFTU$POUBJOFSJ[F8FC4FSWFS$BDIF %BUBCBTFMPHTUPSF.FUSJDT7JTVBMJ[FS$&1-PH$PMMFDUPS3FWFSTF1SPYZ
DataflowDP4FSWFS)551SFRVFTU$BDIF %BUBCBTFMPHTUPSF.FUSJDT7JTVBMJ[FS$&13FWFSTF1SPYZ-PBE#BMBODFS-PH"HHSFHBUPSMPHpMF%PDLFS)PTU%PDLFS)PTU%PDLFS)PTU%PDLFS)PTU"1*-PH$PMMFDUPSw ֤IPTUͷϦόʔεϓϩΩγ OHJOYܦ༝Ͱ"1*ʹϦΫΤετɻw ϩάϑΝΠϧϗετଆϘϦϡʔϜΛϚϯτͯ͠ॻ͖ग़͠ɻw qVFOUEίϯςφଆͰϩάσΟϨΫτϦΛϚϯτͯ͠ɺಡΈࠐΈɻw ϩάूίϯςφͰϩάΛूΊͯɺ$&1 /PSJLSBͰूܭͭͭ͠ʹอଘˠՄࢹԽ
Docker Build ArchitectureMPDBM ()F +FOLJOT3FHJTUSZ $PNNPOQVTITPVSDFT )PPLw %PDLFS*NBHFϏϧυw ίϯςφͰܥΛ্ཱͪ͛ͯ݁߹ςετw υΩϡϝϯτͷੜw %PDLFS3FHJTUSZʹΠϝʔδొ"1*qVFOUE/HJOYSFHJTUFS"1*DPOUBJOFS*NBHFVCVOUVCVJMEͷىͱͳΔJNBHFɺ1SJWBUFSFHJTUSZʹஔ͍͓͖ͯɺ%PDLFSIVCSFHJTUSZͷར༻͠ͳ͍ɻ
Deploy Manager WebUI• WebUIσϓϩΠπʔϧ• DockerԽҎલ͔Β͍ͬͯͨπʔϧ• Capistrano task ࣮ߦ• Ϣʔβೝূ• σϓϩΠϩάͷϦΞϧλΠϜදࣔ&อଘ • DockerσϓϩΠcapistrano taskԽͯ͠ར༻ σϓϩΠઌαʔόΛબͯ͠ɺϙνοͱ 1click͚ͩͰແఀࢭσϓϩΠɻ• σϓϩΠͷrollbackλεΫ༻ҙɻ
Docker Deployment Architecture%FQMPZ.BOBHFS8FC6*3FHJTUSZ ڞ௨3FHJTUSZ QSPEVDUJPOઃఆ"1*qVFOUE/HJOY"1*TFSWFSDPOpH0QFSBUFQVMMqVFOUE3FWFSTF1SPYZ"1*QVMM"1*TFSWFSDPOpH%PDLFS)PTU0UIFS4FSWJDFT%FQMPZ$BQJTUSBOPUBTL)551SFRVFTUNPVOU• Capistrano taskͰɺίϯςφͷ ΠϝʔδΛ֤ϗετ͕pullͯ͠σϓϩΠɻ!• ࣮ߦόΠφϦͷίϯςφΠϝʔδ։ൃऀશһ͕pullՄೳɻ!• productionڥͰ͏configίϯςφɺregistry͝ͱ(ೝূ͕ҟͳΔ)ɻ
Deployment ~ step.11.APIίϯςφΠϝʔδͱɺઃఆΠϝʔδΛɺDockerHostଆͰpull͢Δ%PDLFS)PTU3FHJTUSZ ڞ௨3FHJTUSZ ઃఆ"1*qVFOUE/HJOY"1*WEPDLFSJNBHFT"1*TFSWFSDPOpH"1*TFSWFSDPOpH"1*TFSWFSDPOpHNPVOUNPVOU3FWFSTF1SPYZ"1*WqVFOUEMBUFTU
Deployment ~ step.11.APIίϯςφΠϝʔδͱɺઃఆΠϝʔδΛɺDockerHostଆͰpull͢Δ%PDLFS)PTU3FHJTUSZ ڞ௨3FHJTUSZ ઃఆ"1*qVFOUE/HJOYEPDLFSQVMMBQJMBUFTUEPDLFSQVMMBQJ@DPOpHMBUFTU"1*WEPDLFSJNBHFT"1*W MBUFTU"1*TFSWFSDPOpH"1*TFSWFSDPOpH"1*TFSWFSDPOpHNPVOUNPVOU3FWFSTF1SPYZ"1*WqVFOUEMBUFTU
Deployment ~ step.21.৽͍͠imageͷίϯςφΛىಈ2.API͕ਖ਼͘͠ϦΫΤετΛฦͤΔ·Ͱͭ ɹ(࣮ࡍʹϨεϙϯεΛ֬ೝ)%PDLFS)PTU"1*WqVFOUEMBUFTUDPOpH3FWFSTF1SPYZ
Deployment ~ step.21.৽͍͠imageͷίϯςφΛىಈ2.API͕ਖ਼͘͠ϦΫΤετΛฦͤΔ·Ͱͭ ɹ(࣮ࡍʹϨεϙϯεΛ֬ೝ)%PDLFS)PTU"1*W"1*WqVFOUEMBUFTUqVFOUEMBUFTUDPOpHDPOpH3FWFSTF1SPYZ
Deployment ~ step.21.৽͍͠imageͷίϯςφΛىಈ2.API͕ਖ਼͘͠ϦΫΤετΛฦͤΔ·Ͱͭ ɹ(࣮ࡍʹϨεϙϯεΛ֬ೝ)%PDLFS)PTU"1*W"1*WqVFOUEMBUFTUqVFOUEMBUFTUDPOpHDPOpHIFBMUIDIFDLEVNNZSFRVFTU3FWFSTF1SPYZ
Deployment ~ step.31.৽͍͠IPΛnginxͷconfʹॻ͖ࠐΉɻ2.NginxΛgraceful restartͯ͠ɺແఀࢭͰίϯςφͷ͚ઌΛมߋ͢Δɻ Reverse Proxy(nginx)ͷDockerίϯςφͰ1.$ kill -USR2 `cat /var/run/nginx.pid`2.$ kill -WINCH `cat /var/run/nginx.pid.oldbin`3.$ kill -QUIT `cat /var/run/nginx.pid.oldbin` ※࣮ࡍʹɺgracefull restart෦ γΣϧεΫϦϓτԽͯ͠ɺίϯςφʹಉࠝɻ%PDLFS)PTU"1*W"1*WqVFOUEMBUFTUqVFOUEMBUFTU3FWFSTF1SPYZDPOpHDPOpHOHJOYDPOG OHJOYQPSU
Deployment ~ step.31.৽͍͠IPΛnginxͷconfʹॻ͖ࠐΉɻ2.NginxΛgraceful restartͯ͠ɺແఀࢭͰίϯςφͷ͚ઌΛมߋ͢Δɻ Reverse Proxy(nginx)ͷDockerίϯςφͰ1.$ kill -USR2 `cat /var/run/nginx.pid`2.$ kill -WINCH `cat /var/run/nginx.pid.oldbin`3.$ kill -QUIT `cat /var/run/nginx.pid.oldbin` ※࣮ࡍʹɺgracefull restart෦ γΣϧεΫϦϓτԽͯ͠ɺίϯςφʹಉࠝɻ%PDLFS)PTU"1*W"1*WqVFOUEMBUFTUqVFOUEMBUFTU3FWFSTF1SPYZDPOpHDPOpHOHJOYDPOGMPDBUJPO\QSPYZ@QBTTIUUQ^OHJOYQPSU
Deployment ~ step.31.৽͍͠IPΛnginxͷconfʹॻ͖ࠐΉɻ2.NginxΛgraceful restartͯ͠ɺແఀࢭͰίϯςφͷ͚ઌΛมߋ͢Δɻ Reverse Proxy(nginx)ͷDockerίϯςφͰ1.$ kill -USR2 `cat /var/run/nginx.pid`2.$ kill -WINCH `cat /var/run/nginx.pid.oldbin`3.$ kill -QUIT `cat /var/run/nginx.pid.oldbin` ※࣮ࡍʹɺgracefull restart෦ γΣϧεΫϦϓτԽͯ͠ɺίϯςφʹಉࠝɻ%PDLFS)PTU"1*W"1*WqVFOUEMBUFTUqVFOUEMBUFTU3FWFSTF1SPYZDPOpHDPOpHOHJOYDPOGMPDBUJPO\QSPYZ@QBTTIUUQ^MPDBUJPO\QSPYZ@QBTTIUUQ^OHJOYQPSU
Deployment ~ step.31.৽͍͠IPΛnginxͷconfʹॻ͖ࠐΉɻ2.NginxΛgraceful restartͯ͠ɺແఀࢭͰίϯςφͷ͚ઌΛมߋ͢Δɻ Reverse Proxy(nginx)ͷDockerίϯςφͰ1.$ kill -USR2 `cat /var/run/nginx.pid`2.$ kill -WINCH `cat /var/run/nginx.pid.oldbin`3.$ kill -QUIT `cat /var/run/nginx.pid.oldbin` ※࣮ࡍʹɺgracefull restart෦ γΣϧεΫϦϓτԽͯ͠ɺίϯςφʹಉࠝɻ%PDLFS)PTU"1*W"1*WqVFOUEMBUFTUqVFOUEMBUFTU3FWFSTF1SPYZDPOpHDPOpHOHJOYDPOG OHJOYOHJOYQPSU
Deployment ~ step.41.ݹ͍ίϯςφͷఀࢭ&আ2.ݹ͍ίϯςφΠϝʔδͷআ ˞ߴʹrollbackग़དྷΔΑ͏ɺ࣮ࡍʹ ɹ5ੈલͷΠϝʔδΛআ%PDLFS)PTU"1*W"1*WqVFOUEMBUFTUqVFOUEMBUFTU3FWFSTF1SPYZDPOpHDPOpHOHJOY"1*WEPDLFSJNBHFT"1*W MBUFTU"1*TFSWFSDPOpH
Deployment ~ step.41.ݹ͍ίϯςφͷఀࢭ&আ2.ݹ͍ίϯςφΠϝʔδͷআ ˞ߴʹrollbackग़དྷΔΑ͏ɺ࣮ࡍʹ ɹ5ੈલͷΠϝʔδΛআ%PDLFS)PTU"1*WqVFOUEMBUFTU3FWFSTF1SPYZDPOpHOHJOY"1*WEPDLFSJNBHFT"1*W MBUFTU"1*TFSWFSDPOpH
Deployment ~ step.41.ݹ͍ίϯςφͷఀࢭ&আ2.ݹ͍ίϯςφΠϝʔδͷআ ˞ߴʹrollbackग़དྷΔΑ͏ɺ࣮ࡍʹ ɹ5ੈલͷΠϝʔδΛআ%PDLFS)PTU"1*WqVFOUEMBUFTU3FWFSTF1SPYZDPOpHOHJOYEPDLFSJNBHFT"1*W MBUFTU"1*TFSWFSDPOpH
deploymentฤ Ή͢ͼwμϯλΠϜແ͠ͷσϓϩΠՄೳ͕ͩɺݱঢ়ɺࣗલͰগ͠࡞Γ͜Ήඞཁ͕͋ΔɻwࣗલͷίϯςφସલϔϧενΣοΫɻ!wϗετଆͷڥ͕ԚΕͳ͍ͷૉΒ͍͠ɻ!wظӡ༻͢ΔલఏͳΒΰϛΛย͚ΔػߏΛ࣋ͱ͏ɻ wLTΛ͏ʹɺNBTUFSͷԽߴՄ༻ੑͳFUDEΫϥελͷߏஙɾӡ༻ɺ نͷׂʹ߹Θͳ͔ͬͨͷͰʮϦιʔεͷநԽʯ·Ͱ౿Έࠐ·ͳͳ͔ͬͨɻ wαʔϏεԣஅͰར༻ՄೳͳେنσϓϩΠઌαʔόࢿݯͱͯ͠நԽ͢Δ߹ʹɺ LT͕ඞཁʹͳΔͱࢥ͏ɻنͱతʹԠͯ͡ΞʔΩςΫνϟઃܭ͠Α͏ɻ
υϫϯΰࠂ ͜ͷهࣄυϫϯΰۈ࣌ؒதʹॻ͔Εͨɻ!υϫϯΰຊͷ (C++|Elrang|ݕࡧ|Ϩίϝϯυ|σʔλੳ|σʔλ࿈ܞ|FPGA|Πϯϑϥ|WEBΞϓϦ) ΤϯδχΞΛืू͍ͯ͠·͢ɻ࠾༻ใ | גࣜձࣾυϫϯΰ