PHPカンファレンス福岡2016
小規模な受託開発の会社で、開発・ステージング環境用途として dockerを利用した際の経験談&まとめです。
dockerͰࣾ֎͚ͷڥΛ͑ͨ3ZP5PNJEPLPSP !IBOIBOPHPΧϯϑΝϨϯεԬ
View Slide
@hanhan1978TwitterRyo TomidokoroNameWeb App EngineerJob"CPVU.F
"HFOEBͰdockerΛ෮श׆༻ྫɾߏྫॴɾॴdocker࠾༻͢Δಋೖཧ༝
ͰEPDLFSΛ෮शDocker Inc ͷιϑτΣΞܰྔͳίϯςφԾԽϋΠύʔόΠβʔܕͰͳ͍ɻίϯςφϗετOSͷִ͞ΕͨڥͰಈ࡞֤ίϯςφϗετOSͷࢿݯΛར༻͢Δ
ͰEPDLFSΛ෮शdockerԿ͕خ͍͠ͷʁίϯςφΛߏஙɾཧ͢ΔͨΊͷΠϯλϑΣʔεΛఏڙߏங༰Dockerfileͱ͍͏ܗͰίʔυԽdockerͷίϯςφͷϨΠϠʔߏ%PDLFSpMFͷίʔυͷߦߦ͕ϕʔεΠϝʔδͷ্ʹͱͯ͠ੵΈॏͳ͍ͬͯ͘ɻϕʔεΠϝʔδ͔ΒͷϨΠϠʔશମΛؚΊͯɺίϯςφͷʮΠϝʔδʯͱݺͿɻEPDLFSެࣜΑΓҾ༻
ͰEPDLFSΛ෮शDockerfileͷதίϯςφΠϝʔδͷߏஙखॱେ·͔ʹ͚ΔͱҎԼͷ̏ͭ1 ϕʔεΠϝʔδࢦఆΠϝʔδߏங༻ͷίϚϯυ࿐ग़͢Δportͱ࣮ߦίϚϯυ23
ͰEPDLFSΛ෮शDockerfileͷ࣮ྫFROM php:7.0-apacheMaintainer hanhan1978RUN docker-php-ext-install -j$(nproc) mysqlRUN a2enmod rewriteEXPOSE 8080CMD [“/usr/sbin/httpd”, “-D”, “FOREGROUND”]123
ͰEPDLFSΛ෮शϕʔεΠϝʔδͷऔಘFROM php:7.0-apacheMaintainer hanhan19781phpͷόʔδϣϯ7(Apache)ΠϝʔδίϯςφͷཧऀࣗͷDocker ID
ͰEPDLFSΛ෮शϕʔεΠϝʔδͲ͔͜ΒʁσϑΥϧτެࣜϨϙδτϦprivateϦϙδτϦ༗ྉEPDLFSIVCEPDLFSSFHJTUSZOSSͷdocker image ετΞࣗલͰ༻ҙઐͷΠϯϑϥ୲͕͍ͳ͍ձࣾͷ߹ϝϯςೝূ͕໘ͳͷͰΊͨํ͕ແ
ͰEPDLFSΛ෮शΠϝʔδߏங༻ͷίϚϯυRUN docker-php-ext-install -j$(nproc) mysqlRUN a2enmod rewrite2• ίϚϯυΛ࣮ߦ͢ΔΑ͏ͳΠϝʔδͰཏྻ• ϩʔΧϧʹ༻ҙͨ͠ϑΝΠϧΛΠϝʔδʹCOPYͱ͔Մ• ৄ͘͠ެࣜυΩϡϝϯτࢀর
FYQPTFͨ͠ϙʔτɺίϯςφؒͰެ։ͰEPDLFSΛ෮श࿐ग़͢Δportͱ࣮ߦίϚϯυEXPOSE 8080CMD [“/usr/sbin/httpd”, “-D”, “FOREGROUND”]3• dockerͷωοτϫʔΫͰ8080൪Λެ։• CMDͰࢦఆͨ͠ϑΥΞάϥϯυͷίϚϯυΛ࣮ߦ
ͰEPDLFSΛ෮शίϯςφΛϏϧυ$ docker build -t [Πϝʔδ໊] [Dockerfileͷ͋ΔPATH]docker-hubͷΠϝʔδ໋໊نଇʹै͍·͠ΐ͏[Ϣʔβ໊]/[Πϝʔδ໊]ྫ) hanhan1978/php7
ͰEPDLFSΛ෮शίϯςφΛ࣮ߦ$ docker run -d -p 8080:80 [Πϝʔδ໊]ίϯςφͰexpose͞Εͨ80൪portΛϗετOSͷ8080ʹඥ͚جຊίϨ͚ͩʂ
ͰEPDLFSΛ෮शγϯϓϧͳdockerߏਤEPDLFSIVC֤ίϯςφEPDLFSIVC͔ΒϕʔεΠϝʔδΛQVMM%PDLFSpMFͷهड़ʹԊͬͯɺίϯςφΛCVJME
"HFOEBಋೖཧ༝׆༻ྫɾߏྫॴɾॴdocker࠾༻͢ΔͰdockerΛ෮श
ಋೖཧ༝ձࣾͰ͍ͬͯΔۀw খʙதنͷडୗ։ൃw 6*σβΠϯϑϩϯτΤϯυ։ൃ͕ϝΠϯw αʔϏε։ൃ༗Γw 4BB4Ͱେମ͏·ͬͯ͘Δ
ಋೖཧ༝๊͍͑ͯͨw ϚʔΫΞοϓ ੩త)5.-ͷ֬ೝڥ͕ແ͔ͬͨɻw ࢼͯ͠Έ͍ͨ044Λࢼ͢ڥ͕ແ͍ɻw #PUͱ͔Λৗறͤ͞Δ-BCతͳڥ͕ແ͍ɻ
ಋೖཧ༝ݕ౼ͨ͠αʔϏεࣾʹैྔ՝ۚͷߴֹٻτϥϚ͕͋ΔΒࠜ͘͠ڧ͍ෆ৴ײ͕ɾɾɾAWS or GCPHerokuOSSͰHeroku͓ࢼ͠Λఏڙ͍ͯ͠ͳ͍ͷଟ͔ͬͨࣗ༝͕͍ͷͰͱײͨ͡(ޙʑޙչ͕ͨ͠ɾɾɾ)SakuraͷVPSఆֹͰ͑Δ͠ɺ͖ͳΑ͏ʹ͑ͦ͏ͩɾɾɾ
ಋೖཧ༝ఆֹ714ϝϯςָ͕ߴՄ༻ੑϞμϯͱ͍͏Θ͚Ͱ
"HFOEB׆༻ྫɾߏྫಋೖཧ༝ॴɾॴdocker࠾༻͢ΔͰdockerΛ෮श
׆༻ྫɾߏྫOverviewDPOUBJOFSDPOUBJOFSDPOUBJOFSDPOUBJOFS୯ҰͷϗετͷΈར༻ίϯςφؒϦϯΫportͷࢦఆdocker-composekubernatisTXBSNඞཁͳ͠ʂ
׆༻ྫɾߏྫdocker-composeίϯςφ࣮ߦ࣌ͷઃఆZNMͰҰݩཧmysql:image: mysqlvolumes:- /host/mysql:/var/lib/mysqlrestart: alwaysgyazo:build: docker-files/gyazoenvironment:- SRC_PATH=/hoge/fugarestart: always
׆༻ྫɾߏྫ1. ੩తαΠτͷ֬ೝڥDPOUBJOFSgit pushͰCI௨docker-compose build [container]ϑϩϯτΤϯυΤϯδχΞɺΫϥΠΞϯτͷαΠτߋ৽ͷڞ༗Λҙࣝ͠ͳͯ͘Α͘ͳͬͨɻͱʹ͔͘ૣ͘ίʔυΛॻ͍ͯɺ164)
׆༻ྫɾߏྫ2. OSS͓ࢼ͠ڥdocker-compose up -d opengrokopengrok:image: itszero/opengrokvolumes:- /hoge/fuga:/srcports:- “3001:8080"DPNQPTFZNMʹઃఆΛՃͯ͠UP͢Δ͚ͩ
׆༻ྫɾߏྫ3. ։ൃ -> εςʔδө։ൃDPOUBJOFSDPOUBJOFSDPOUBJOFSDPOUBJOFSʹEPDLFSGPSNBD CFUBग़ͨͷͰɺͦΕͰ0,εςʔδ։ൃ࣌ͷߏͰͦͷ··UPͰ͖Δʂॴཁ࣌ؒ
"HFOEBॴɾॴಋೖཧ༝׆༻ྫɾߏྫdocker࠾༻͢ΔͰdockerΛ෮श
ॴɾॴྑ͔ͬͨ͜ͱϗετগͳͷͰϝϯςָ͕ΞϓϦͷ͓ࢼ͠ར༻ϚδͰָґଘؔίϯςφଆͰղܾ͞Ε͍ͯΔgitlab, redmine=> Έͳ͞·Πϯετʔϧ࣌ͷਏ͞ʹ͕֮͑͋Δ͔ͱɾɾɾVMΛෳ্ཱ͍ͪ͛ͯͨ࣌ʹൺΔͱஈҧ͍=> ͕֮͑ͯΒΕΔݸ੬ऑੑରԠ=> ίϯςφ࠶Ϗϧυ & ϗεταʔόʹରԠͰOK
ॴɾॴྑ͔ͬͨ͜ͱdockerೲͱ͍͏ϦΫΤετސ٬ଆ͕dockerΠϯϑϥΛ͍࣋ͬͯͨ=> dockerڥͳΜͰ͕͢ɾɾɾʹ༨༟ͰରԠ͜ͷઌ૿͑ͯ͘Δͱ༧͞Ε·͢ ʘ(^o^)ʗ
ॴɾॴѱ͔ͬͨ͜ͱਓࡐϘτϧωοΫ੩తαΠτߏஙͷίϯςφ࡞ => ٸ͍Ͱ30ϑϩϯτΤϯυΤϯδχΞͷΈͰ݁Ͱ͖ͳ͍=> ݁ہɺherokuΛ͏͜ͱʹͨ͠docker-machineͷͭΒΈVirtualBoxͰಈ࡞͢ΔdockerͳͷͰɺϗετϚγʔϯଆͱͷ௨৴ϑΝΠϧڞ༗ͳͲ͕໘ɹ=> docker for mac, windows͕ٹੈओ͔
ॴɾॴѱ͔ͬͨ͜ͱdisk༰ྔVPSͱ͔݁ߏdisk༰ྔগͳ͍ܖͩͱਏ͘ͳΔΠϝʔδϨΠϠʔ͕δϫδϫͱѹഭ=> 20ʙ30ఔͷίϯςφΠϝʔδͰ50G͘Β͍ݟͨ΄͏͕ྑ͍͔ɻ
ॴɾॴݸਓతͳײw %PDLFSpMFͬͯɺ͋Μ·Γے͕ΑΖ͘͠ࢥ͑ͳ͍ɻ΄΅TIFMMw EPDLFSGPSNBD XJOEPXTظͰ͖Δʂʂw 044ͷ͓ࢼ͠༻్ͱͯ͠ɺ࠷ڧͷڥɹେͷͷEPDLFSIVCʹ͋Δw ੈͷதʹ͍͍͚ͭͯͯΔײຯͰ͕͢େࣄ
"HFOEBdocker࠾༻͢Δಋೖཧ༝׆༻ྫɾߏྫॴɾॴͰdockerΛ෮श
docker࠾༻͢Δʁ೦಄ʹ͓͍͓ͯ͘͜ͱw EPDLFSͷݪཧΛཧղ͠ɺཧՄೳͳਓࡐΛਓଗ͍͑ͨɻw શ෦ΛEPDLFSͰΕΔͱ͍͏ࢥߟఀࢭ/(ϚωʔδυɾαʔϏεͰແྉͱ͔͋Δ͠ɺόοΫΤϯυΤϯδχΞෆཁͷιϦϡʔγϣϯΛୈҰʹߟ͑Δͷେࣄw ίϯςφࣗମΛඞཁͱ͢ΔαʔϏε։ൃͰ͋ΕɺEPDLFSΛ͏ͷݮʹͳͬͯྑͦ͞͏ɻ
dockerͬͯΈΔʁ৭ʑݒ೦͋͛·͕ͨ͠ɾɾɾͳΜ͔ͩΜͩݴͬͯɺdockerָ͍ͬͪ͢͠ΐͬͱ͘Β͍ᷖᮣͳײ͕͡ͳ͍ͱɺ৽نಋೖͳΜͯͰ͖ͳ͍YO
͓·͚dockerͰPHPڥEPDLFSIVCʹ1)1ͷެࣜΠϝʔδ༗Γw ʙͷOUTͱ[UTw QIQGQN BQBDIF DMJw BMQJOFͱॻ͔Ε͍ͯΔͷܰྔΠϝʔδ
͓·͚apacheͷ߹ContainersBQBDIFsrcw ެࣜΠϝʔδQSFGPSLNPEQIQw EPDVNFOU3PPUʹTSDΛಥͬࠐΉ͚ͩ
͓·͚php-fpmͷ߹Containers/HJOYsrcw /HJOYͷ'BTU$(*ͷαʔόΛલஈʹઃஔw QIQGQNͷ෦IIWNͱ͔ʹஔՄೳQIQGQN
"OZ2VFTUJPOಋೖཧ༝׆༻ྫɾߏྫॴɾॴͰdockerΛ෮शdocker࠾༻͢Δ