Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Dockerを利用したローカル環境から本番環境までの構築設計 / Project structure design for docker application

7f95c6712be7d9a89aae7b9b152dad90?s=47 Kou
February 03, 2018

Dockerを利用したローカル環境から本番環境までの構築設計 / Project structure design for docker application

7f95c6712be7d9a89aae7b9b152dad90?s=128

Kou

February 03, 2018
Tweet

Transcript

  1. DockerΛར༻ͨ͠ϩʔΧϧ؀ ڥ͔Βຊ൪؀ڥ·Ͱͷߏஙઃܭ Koichi Nagaoka

  2. ࣗݾ঺հ ௕Ԭ ߒҰ (@kkoudev) ؾ͚ͮ͹ۀք12೥͘Β͍ɻ ϑϩϯτΤϯυɺόοΫΤ ϯυɺΠϯϑϥɺiOS/ AndroidΞϓϦ։ൃɺͳΜͰ ΋΍ͬͯ·͢

  3. Έͳ͞ΜɺDockerΛ্ख ͘࢖͍͑ͯ·͔͢ʁ

  4. ࢄʑޠΓਚ͘͞ΕͨDockerͷར఺ ɾDocker͕ಈ͘؀ڥͰ͸OSͷػೳ͝ͱΠϝʔδ ԽͰ͖ΔͨΊɺϗετଆ͕macOSͩΖ͏ͱLinux ͩΖ͏ͱجຊతʹಉ͡Α͏ʹಈ࡞͢Δ ɾϙʔλϏϦςΟʹ༏Ε͓ͯΓɺεέʔϧ͕؆୯ ɾ֤छϛυϧ΢ΣΞ͕ެࣜͰΠϝʔδԽ͞Ε͍ͯ ΔͨΊɺͦΕΒΛར༻͢Ε͹ϛυϧ΢ΣΞͷΠϯ ετʔϧ͕Docker͚ͩͰ׬݁͢Δ

  5. ͜ͷར఺Λੜ͔ͨ͢Ίʹ͸ɺDockerͷಛੑ Λཧղͭͭ͠ɺϩʔΧϧ؀ڥ͔Βຊ൪؀ڥ ·ͰΛߟྀͨ͠ઃܭΛߦ͏ඞཁ͕͋Γ·͢

  6. ࠓ೔঺հ͢Δ͜ͱ ɾDockerΛ࢖ͬͨ؀ڥߏஙͷߟ͑ํ ɾDockerΛ࢖ͬͨσϓϩΠͷߟ͑ํ
 ɾDockerʹ͓͚ΔΞϯνύλʔϯͱରԠࡦ


  7. 1. ֤؀ڥΛߏங͢Δ্Ͱඞཁ ͳཁ݅Λચ͍ग़͢

  8. Α͋͘ΔWeb։ൃݱ৔ͷಈ࡞؀ڥ 1. ࣗ෼ͷϚγϯ಺Ͱ࣮૷தͷΞϓϦέʔγϣϯΛελϯυΞ ϩϯʹಈ࡞ͤ͞Δ؀ڥ (ϩʔΧϧ؀ڥ) 2. ࣮૷͕׬ྃͨ͠ΞϓϦέʔγϣϯΛଞͷϓϩδΣΫτϝϯό ʔ΍ςελʔʹಈ࡞֬ೝͯ͠΋Β͏ࣾ಺޲͚؀ڥ (։ൃ؀ڥ) 3.

    ࣾ಺Ͱಈ࡞֬ೝͨ͠ΞϓϦέʔγϣϯΛຊ൪ϦϦʔεલʹ ͓٬͞Μʹݕऩͯ͠΋Β͏ͨΊͷ؀ڥ (εςʔδϯά؀ڥ) 4. ςετ΋ݕऩ΋׬ྃͨ͠ΞϓϦέʔγϣϯΛՔಇͤ͞Δͨ Ίͷ؀ڥ (ຊ൪؀ڥ)
  9. Α͋͘Δ؀ڥ͝ͱͷཁ݅ 1. ϩʔΧϧ؀ڥ͸ίʔυमਖ਼ͨ͠Β͙͢ʹಈ࡞֬ೝΛ ߦ͑ΔΑ͏ʹ͍ͨ͠ 2. ։ൃ؀ڥ͸༧ࢉͷؔ܎Ͱ1୆͔͠༻ҙͰ͖ͳ͍ɻͦͷ 1୆ʹશͯͷϛυϧ΢ΣΞΛΠϯετʔϧͯ͠ߏஙͯ͠ ཉ͍͠ 3. ຊ൪͸ӡ༻΍Մ༻ੑΛߟྀͯ͠ϩʔυόϥϯαʔɺ

    σʔλϕʔεɺΩϟογϡ͸ϚωʔδυαʔϏε (ALBɺRDSɺElastiCache)Λར༻͍ͨ͠͠
  10. ͜ͷ؀ڥ͝ͱͷཁ݅Λ࣮ݱ ͢Δํ๏ΛɺDockerΛ࢖ͬ ͯߏங͢Δ৔߹ͱ࢖Θͳ͍ Ͱߏங͢Δ৔߹ͷͦΕͧΕ Λൺֱͯ͠঺հ͍͖ͯ͠·͢ ɻ

  11. 2. DockerΛ࢖֤ͬͯ؀ڥΛߏ ங͢Δ

  12. ࠓճߏஙͯ͠ΈΔ؀ڥ

  13. ֤αʔόͰಈ࡞ͤ͞Δϛυϧ΢ΣΞ/ΞϓϦέʔγϣϯ ▪ϩʔυόϥϯαʔ
 ɾAWSͷApplication Load Balancer (ALB)Λ࢖༻
 
 ▪Ωϟογϡαʔό
 ɾAWSͷElastiCache (Redis)Λ࢖༻


    
 ▪σʔλϕʔε
 ɾAWSͷRDS (MySQL)Λ࢖༻
 
 ▪web01/02 (EC2αʔό)
 ɾNginx (HTTPαʔό)
 ɾWebΞϓϦέʔγϣϯ (DjangoͰಈ͘Python3ΞϓϦέʔγϣϯ)
 
 ▪batch01/02 (EC2αʔό)
 ɾPython3Ͱಈ͘όονΞϓϦέʔγϣϯ
 ɾδϣϒεέδϡʔϥ(Celery beat)
 ɾRabbitMQ (CeleryͷδϣϒΩϡʔͱͯ͠࢖༻)
  14. 2-1. ϩʔΧϧ؀ڥΛߏங͢Δ

  15. ϩʔΧϧ؀ڥʹ͍ͭͯ ϩʔΧϧ؀ڥ͸ࣗ਎ͷ࣋ͭϚγϯ؀ڥ͚ͩͰಈ ࡞Λ׬݁ͤ͞ΔελϯυΞϩϯͳ࡞Γʹ͠ͳ͚ Ε͹͍͚·ͤΜɻͦͷ্ɺWebΞϓϦʹ͓͚Δ ϩʔΧϧ؀ڥͷ࠷େͷܽ఺͸։ൃػ΍ຊ൪ػ͕ ͱ͸OS͕ҟͳΔέʔε͕ຆͲͰ͋ΔͨΊɺ؀ڥ ࠩҟʹΑΔಈ࡞ͷҧ͍͕࠷΋ൃੜ͠΍͍͢؀ڥ ͱͳΓ·͢ɻ

  16. DockerΛ࢖Θͳ͍ϩʔΧϧ؀ڥͷߏஙखॱ 1. ALB͸ϩʔΧϧͩͱཱͯΒΕͳ͍ͷͰɺ୅ΘΓʹHAProxyΛ ࢖͏
 2. HAProxyɺRedisɺMySQLɺNginxɺRabbitMQɺPython3Λ HomebrewͰΠϯετʔϧ͢Δ
 3. ϩʔΧϧ༻ͷ֤ϛυϧ΢ΣΞͷઃఆϑΝΠϧΛهड़͢Δ
 4.

    WebΞϓϦέʔγϣϯͱόονΞϓϦέʔγϣϯͰґଘؔ܎ Λ෼཭ͤ͞ΔͨΊʹ venv Λ࢖༻͢Δ
 5. WebΞϓϦέʔγϣϯͱόονΞϓϦέʔγϣϯͷґଘؔ܎ ΛͦΕͧΕ pip ͰΠϯετʔϧ͠ɺͦΕͧΕىಈ͓ͯ͘͠ɻ
  17. ͜ͷखॱ͚ͩΛݟΔͱҰݟ ؆୯ʹࢥ͑Δ͕ɾɾɾ

  18. DockerΛ࢖Θͳ͍ϩʔΧϧ؀ڥͷߏஙखॱͷܽ఺ 1. Homebrew͸جຊతʹ࠷৽όʔδϣϯΛΠϯετʔϧ͢ΔͨΊɺݹ͍ όʔδϣϯΛΠϯετʔϧ͢Δࡍ͸͍͍ͪͪઃఆ͕໘౗ͳ্ʹසൟʹ࢖ ༻͕มΘΔɻ։ൃ͍ͯ͠ΔΞϓϦέʔγϣϯ͕ෳ਺͋Δ৔߹͸͞Βʹό ʔδϣϯΛ߹ΘͤΔͷ͕ඇৗʹେม
 2. ಈ࡞ͤ͞ΔOS͕ຊ൪ػͱ͸ҟͳΔͨΊɺσΟϨΫτϦύε΋͔ͳΓҟ ͳΔɻϛυϧ΢ΣΞͷઃఆϑΝΠϧͰϑΝΠϧύεΛهड़͍ͯ͠ΔՕॴ ͸૬ରύε͕࢖͑ͳ͚Ε͹ϩʔΧϧઐ༻ʹઃఆΛ༻ҙ͢Δඞཁ͕͋Δ


    3. 1ͱ2ͷཧ༝͔ΒɺݸਓͷϚγϯͷঢ়ଶʹґଘͯ͠ಈ࡞͠ͳ͔ͬͨΓɺ ผಈ࡞ΛҾ͖ى͜͢έʔε͕ඇৗʹଟ͍ɻ؀ڥߏஙखॱͱ֤ͯ͠ਓ͕ؾ Λ͚ͭͳ͚Ε͹͍͚ͳ͍ϙΠϯτ͕ଟ͘ɺ؅ཧ͢Δଆͱͯ͠΋ඇৗʹ໘ ౗Ͱ͋Δ
  19. ͱʹ͔͘େมͰ໘౗͍͘͞ɻ
 ॳ೔ʹݱ৔ʹདྷͯ1೔Ҏ্ηοτ ΞοϓΛ͍ͯ͠Δਓ͕ଟ͘ݟΒΕ Δ৔߹͸ɺ΄΅͜ͷΑ͏ͳߏஙΛ ͍ͯ͠Δ͍ͤ (ͱݴͬͯ΋աݴͰ͸ ͳ͍)

  20. DockerΛ࢖͏ϩʔΧϧ؀ڥͷߏஙखॱ 1. ALB͸ϩʔΧϧͩͱཱͯΒΕͳ͍ͷͰɺ୅ΘΓʹHAProxyΛ࢖͏
 2. HAProxyɺRedisɺMySQLɺNginxɺRabbitMQɺPythonͷ࢖༻͢ΔΠϝʔδ໊ͱ λά໊(όʔδϣϯ)ɺઃఆ஋Λ docker-compose ͷઃఆϑΝΠϧ(docker- compose.yml)ʹهड़͢Δ
 3.

    ϩʔΧϧ༻ͷ֤ϛυϧ΢ΣΞͷઃఆϑΝΠϧΛهड़͢Δ
 4. मਖ਼Λ͙͢ʹ֬ೝͰ͖ΔΑ͏ʹ͢ΔͨΊɺϗετଆʹ͋ΔΞϓϦέʔγϣϯͷι ʔεϑΝΠϧΛVOLUME໋ྩͰϚ΢ϯτͯ͠ར༻͢Δ
 5. WebΞϓϦέʔγϣϯͱόονΞϓϦέʔγϣϯͷґଘؔ܎ΛͦΕͧΕDockerͰ औಘͨ͠Pythonͷ pip ͰΠϯετʔϧ͠ɺϗετଆͷͦΕͧΕผσΟϨΫτϦ΁อ ଘͰ͖ΔΑ͏ʹ͓ͯ͘͠
 6. docker-composeΛىಈ͠ɺdocker-compose.ymlʹهड़ͨ͠ϛυϧ΢ΣΞͱΞϓ ϦέʔγϣϯΛىಈ͢Δ
  21. DockerΛ࢖͏ϩʔΧϧ؀ڥͷߏஙखॱͷར఺ 1. Homebrewͱ͸ҧ͍ɺ֤ϛυϧ΢ΣΞ͝ͱʹಛఆͷόʔδϣϯΛ؆୯ʹ ࢦఆ͢Δ͜ͱ͕Ͱ͖ΔɻόʔδϣϯΞοϓ͢Δͷ΋ઃఆϑΝΠϧͷॻ͖׵ ͚͑ͩͰOKɻ·ͨɺDockerΠϝʔδͷऔಘ΋docker-composeͷىಈ࣌ʹ ࣗಈతʹߦΘΕΔ
 2. ϗετଆͷOS͕ҟͳͬͯ΋DockerΠϝʔδ͸ຊ൪ػͱಉ͡OSͷಈ࡞Λ ίϯςφԽՄೳͰ͋ΔͨΊɺσΟϨΫτϦ΍ϑΝΠϧύεͷҧ͍ͱ͍ͬͨ ؀ڥࠩҟ͸ൃੜ͠ͳ͍


    3. 1ͱ2ͷཧ༝͔ΒɺݸਓͷϚγϯͷঢ়ଶʹґଘͯ͠ಈ࡞͠ͳ͔ͬͨΓɺผ ಈ࡞ΛҾ͖ى͜͢έʔεΛ΄΅ආ͚ΒΕΔɻ
 4. جຊతʹdocker-compose.ymlΛ؅ཧ͍ͯ͠ΔϦϙδτϦͷऔಘͱɺ docker-compose up -d ͚ͩͰ؀ڥߏங͕׬ྃ͢Δɻ؅ཧ΋ߏங΋ϝνϟΫ νϟ؆୯ʂ
  22. DockerΛ࢖͏͜ͱͰ؀ڥߏ ங͕ܶతʹ؆୯ʹͳΓ·͢ɻ ͦΕʹՃ͑ͯ؀ڥࠩҟΛͳ ͤ͘Δɻ͜Ε͕ͦ͜Docker ࠷େͷར఺Ͱ͢

  23. 2-2. ։ൃ؀ڥ͔Βຊ൪؀ڥ·Ͱ Λߏங͢Δ

  24. ։ൃ؀ڥ͔Βຊ൪؀ڥ·Ͱ ͸ϩʔΧϧͱ͸ҧ͍ɺϏϧ υͨ͠಺༰ΛύοέʔδԽ ͠ɺͦΕΛαʔό΁σϓϩ Π͢Δέʔε͕ຆͲͰ͢

  25. DockerΛ࢖Θͳ͍։ൃ/ຊ൪؀ڥͷߏஙखॱ 1. ࢖༻͢ΔALBɺElastiCache (Redis)ɺRDS (MySQL) Λ࡞੒͢Δ
 2. NginxɺRabbitMQɺPythonͷ࢖༻͢ΔόʔδϣϯΛAnsibleͳͲΛ࢖ͬ ͯΠϯετʔϧ͢Δ
 3.

    ։ൃ/ຊ൪༻ͷ֤ϛυϧ΢ΣΞͷઃఆϑΝΠϧΛهड़͢Δ
 4. ։ൃػʹWebΞϓϦέʔγϣϯͱόονΞϓϦέʔγϣϯΛύοέʔ δϯάͯ͠ɺϑΝΠϧసૹ͢Δ (Capistrano΍Ansistrano͋ͨΓΛ࢖͏)
 5. WebΞϓϦέʔγϣϯͱόονΞϓϦέʔγϣϯͰґଘؔ܎Λ෼཭͞ ͤΔͨΊʹ venv Λ࢖༻͢Δ
 6. WebΞϓϦέʔγϣϯͱόονΞϓϦέʔγϣϯͷґଘؔ܎Λσϓϩ Π࣌ʹͦΕͧΕ pip ͰΠϯετʔϧ͠ɺىಈ͓ͯ͘͠ɻ
  26. ϩʔΧϧʹൺ΂Δͱߏங͸ େมϥΫʹͳΓ·ͨ͠ɻ͠ ͔͠ɾɾɾ

  27. DockerΛ࢖Θͳ͍։ൃ/ຊ൪؀ڥͷߏஙखॱͷܽ఺ 1. ϛυϧ΢ΣΞͷόʔδϣϯΞοϓΛ͢Δࡍ ʹɺAnsibleͳͲͰ࠶౓ΠϯετʔϧΛ͢Δඞཁ ͕͋Δɻ(ίϯύΠϧΛ൐͏΋ͷͰ͋Ε͹ͦͷ෼ ͕͔͔࣌ؒΔ) ·ͨɺόʔδϣϯผʹσΟϨΫτ ϦΛ෼͚ΔͳͲɺ༧ΊσΟϨΫτϦߏ੒͕ߟྀ ͞Ε͍ͯͳ͍ͱόʔδϣϯΞοϓ͕ͮ͠Β͘ͳ Δ

  28. DockerΛ࢖͏։ൃ/ຊ൪؀ڥͷߏஙखॱ 1. ࢖༻͢ΔALBɺElastiCache (Redis)ɺRDS (MySQL)Λ࡞੒ ͢Δ
 2. NginxɺRabbitMQɺϏϧυͨ͠PythonΞϓϦέʔγϣϯͷ ࢖༻͢ΔΠϝʔδ໊ͱλά໊(όʔδϣϯ)ɺઃఆ஋Λ docker-

    compose ͷઃఆϑΝΠϧ(docker-compose.yml)ʹهड़͢Δ
 3. ։ൃɾຊ൪༻ͷ֤ϛυϧ΢ΣΞͷઃఆϑΝΠϧΛهड़͢Δ
 4. docker-composeΛىಈ͠ɺdocker-compose.ymlʹهड़͠ ͨϛυϧ΢ΣΞͱΞϓϦέʔγϣϯΛىಈ͢Δ
  29. DockerΛ࢖͏։ൃ/ຊ൪؀ڥͷߏஙखॱͷར఺ 1. ϛυϧ΢ΣΞͷόʔδϣϯΞοϓ͕͠΍͍͢ɻdocker-compose ͷઃఆϑΝΠϧΛॻ͖׵͑Δ͚ͩͰOK
 2. ΞϓϦέʔγϣϯͱͦͷґଘؔ܎Λ̍ͭͷΠϝʔδͱͯ͠·ͱΊ Δ͜ͱ͕ग़དྷΔɻvenvΛ࢖͏ඞཁ΋ͳ͘ͳΔ
 3. 2Ͱ࡞੒ͨ͠ΠϝʔδΛ։ൃػ͔Βຊ൪؀ڥ·Ͱશ͘ಉ͡΋ͷΛ ར༻Ͱ͖ΔͨΊɺ؀ڥґଘ͢Δ͜ͱ͕΄΅ͳ͍ɻ(DB઀ଓઌͳͲͷ

    ઃఆ஋͸΋ͪΖΜ؀ڥม਺ͱͯ͠ผͷ΋ͷΛ౉͢ඞཁ͸͋Γ)
 4. ϩʔΧϧಉ༷ʹɺجຊతʹdocker-compose.ymlΛ؅ཧ͍ͯ͠ΔϦ ϙδτϦͷऔಘͱɺdocker-compose up -d ͚ͩͰ؀ڥߏங͕׬ྃ͢ Δɻ؅ཧ΋ߏங΋ϝνϟΫνϟ؆୯ʂ
  30. ։ൃ؀ڥ͔Βຊ൪؀ڥ·Ͱ΋DockerΛ ࢖͏ํ͕ϝϦοτ͕ଟ͍͜ͱ͕Θ͔Δ ͔ͱࢥ͍·͢ɻdocker-composeͷઃఆ ϑΝΠϧΛ֤αʔό͝ͱʹ༻ҙ͠ɺඞཁ ͳϛυϧ΢ΣΞͱΞϓϦέʔγϣϯͷઃ ఆΛهड़͢Δ͚ͩͰߏங͕׬ྃ͢ΔͷͰɺ ͱʹ͔͘؆୯Ͱ͢ɻ

  31. 3. ֤؀ڥΛҰݩ؅ཧ͢ΔϓϩδΣ ΫτσΟϨΫτϦߏ੒ͷ঺հ

  32. DockerΛ࢖͏͜ͱͰ֤؀ڥ ͕ߏங͠΍͘͢ͳΔ͜ͱ͸ Θ͔͕ͬͨɺ۩ମతʹͲͷ Α͏ʹ͢Ε͹ྑ͍ͷ͔ɺͦ ͷҰྫΛ঺հ͠·͢ɻ

  33. 3-1. ֤ΞϓϦέʔγϣϯɺϛυ ϧ΢ΣΞΛ౷ׅ؅ཧ͢Δϓ ϩδΣΫτΛ࡞੒͢Δ

  34. ౷ׅ؅ཧ͢ΔϓϩδΣΫτͱ͸Կ͔ ɾϩʔΧϧ͔Βຊ൪·Ͱͷ؀ڥͷશͯͷϛυϧ΢Σ ΞɺΞϓϦέʔγϣϯΛ؅ཧ͢Δ docker- compose.yml Λ؅ཧ͢ΔϓϩδΣΫτ ɾ֤ϛυϧ΢ΣΞͷઃఆϑΝΠϧ΋؀ڥผʹ؅ཧ͢Δ ɾϩʔΧϧ޲͚ʹWebΞϓϦέʔγϣϯ΍όονͷ ιʔεΛ֨ೲ֤ͨ͠ιʔεϦϙδτϦͷஔ͖৔ॴ΋֬ อ͢Δ͜ͱͰɺιʔεΛ௚઀Dockerίϯςφ΁Ϛ΢

    ϯτ͠ɺϩʔΧϧ։ൃΛՄೳͱ͢Δ
  35. ౷ׅ؅ཧ͢ΔϓϩδΣΫτͷ۩ମྫ DockerͰར༻͢Δϛυϧ΢ΣΞͷઃఆϑΝΠϧɺ ϩάσΟϨΫτϦΛ֨ೲͨ͠σΟϨΫτϦ docker login΍ґଘؔ܎ͷΠϯετʔϧͳ Ͳɺ໘౗ͳίϚϯυΛ؆қ࣮ߦग़དྷΔΑ͏ ʹͨ͠εΫϦϓτͷ֨ೲઌ WebΞϓϦέʔγϣϯ΍όονΛ؅ཧͨ͠ ผϦϙδτϦͷιʔε֨ೲઌɻσΟϨΫτϦ ͷத਎ࣗମ͸gitignore͓ͯ͘͠

    ؀ڥผdocker-composeઃఆϑΝΠϧΛϧʔτʹ͓͘
  36. ͜ͷߏ੒ͷར఺ ɾ͜ͷσΟϨΫτϦߏ੒ͷϓϩδΣΫτΛ֤؀ڥ ΁͍࣋ͬͯ͘͜ͱͰɺϩʔΧϧ͔Βຊ൪·Ͱͷ؀ ڥͷશͯΛ͜ͷ౷ׅϓϩδΣΫτ͚ͩͰ׬݁Ͱ͖ Δ ɾ৽ͨʹΞϓϦέʔγϣϯ΍ϛυϧ΢ΣΞ͕௥Ճ ʹͳͬͨ৔߹͸ɺઃఆϑΝΠϧΛॻ͖׵͑ͨΓɺ sourcesσΟϨΫτϦ಺ʹผϦϙδτϦΛclone͢ Δ͚ͩͰྑ͍

  37. 3-2. ؀ڥ͝ͱͷΞϓϦέʔγϣ ϯͷґଘؔ܎ͱσϓϩΠͷ ؅ཧΛߟ͑Δ

  38. Ϗϧυର৅ͱͳΔΞϓϦέʔγϣϯͷྫ ɾPythonͰಈ͘ΞϓϦέʔγϣϯ ɾґଘؔ܎͸ pip Λ࢖ͬͯ؅ཧ ɾ։ൃத͸ґଘؔ܎ͷ௥Ճ͕౎౓ൃੜ͢Δ ɾґଘؔ܎͸ requirements.txt ʹهࡌͯ͠ιʔε ͱಉ༷ʹόʔδϣϯ؅ཧ͢Δ

  39. ϩʔΧϧ؀ڥʹٻΊΒΕΔ͜ͱ ɾιʔεΛमਖ਼ͨ͠Βଈमਖ਼͕֬ೝͰ͖Δ͜ͱ ɾґଘؔ܎ͷ௥Ճɾ࡟আ΋༰қʹߦ͑ͯɺ͔ͭ ͦͷ൓ө֬ೝ΋͙͢ʹߦ͑Δ͜ͱ

  40. ։ൃɾຊ൪؀ڥʹٻΊΒΕΔ͜ͱ ɾ։ൃ؀ڥͰ֬ೝͨ͠΋ͷΛͦͷ··ຊ൪؀ڥ ΁͍࣋ͬͯ͘͜ͱͰಉ౳ʹಈ࡞Ͱ͖Δ͜ͱ ɾґଘؔ܎ͱιʔεΛผ؅ཧͱͤͣɺ1ͭͷΠϝ ʔδʹؚΊΔ͜ͱͰɺΠϝʔδΛ੾Γସ͑Δͩ ͚Ͱಈ࡞ΛอূͰ͖Δ͜ͱ

  41. ϩʔΧϧ؀ڥʹ͓͚Δґଘؔ܎ͷ؅ཧͷྫ 1. ར༻͢ΔPythonͷDockerΠϝʔδΛ༻ҙ͢Δ 2. 1ͷΠϝʔδʹґଘؔ܎Λ֨ೲ͢ΔσΟϨΫτϦΛ VOLUME໋ྩͰϚ΢ϯτՄೳͳঢ়ଶʹ͓ͯ͘͠
 (pip ͸ --user ΦϓγϣϯΛར༻͢Δ͜ͱͰɺ

    PYTHONUSERBASE؀ڥม਺Ͱࢦఆ͞ΕͨσΟϨΫτ Ϧʹґଘؔ܎Λ֨ೲ͢Δ͜ͱ͕ՄೳͱͳΔ) 3. 2Ͱࢦఆͨ͠PYTHONUSERBASEͷσΟϨΫτϦ಺ ʹ͋ΔbinσΟϨΫτϦΛPATHʹؚΊΔΑ͏ʹ͓ͯ͘͠
  42. docker-composeͷྫ (ϩʔΧϧ؀ڥ)

  43. docker-composeͷྫ (ϩʔΧϧ؀ڥ) ϩʔΧϧͰ͸ର৅ΞϓϦέʔγϣϯͷϗετଆͷ ιʔεΛϚ΢ϯτ͢Δ PYTHONUSERBASE΍PATHͳͲͷ؀ڥม਺͸͜ ͜Ͱࢦఆ͢Δɻenv_fileʹؚΊΔܗͰ΋Մ

  44. ґଘؔ܎ͷΠϯετʔϧͱىಈ (ϩʔΧϧ) # ґଘؔ܎ΛΠϯετʔϧ͢Δ
 docker-compose run --rm web pip install

    --user -r requirements.txt # ىಈ͢Δ
 docker-compose -f docker-compose.local.yml up -d
  45. ϩʔΧϧͰ͸ґଘؔ܎ͷΠϯετʔϧ ͸ىಈલʹҰ౓ߦ͍ɺϗετଆͷσΟ ϨΫτϦ΁഑ஔ͓ͯ͘͜͠ͱͰ౎౓Π ϯετʔϧ͢Δ͜ͱΛ๷͗·͢ɻιʔ ε΋ϗετଆͷ΋ͷΛϚ΢ϯτ͢Δ͜ ͱͰɺ౎౓मਖ਼ˍಈ࡞֬ೝ͕Մೳͱͳ Γɺ։ൃ͕͠΍͘͢ͳΓ·͢ɻ

  46. ։ൃɾຊ൪؀ڥʹ͓͚Δґଘؔ܎ͷ؅ཧͷྫ 1. ར༻͢ΔPythonͷDockerΠϝʔδΛ༻ҙ͢Δ 2. DockerΠϝʔδͷϏϧυ࣌ʹґଘؔ܎ΛΠϯ ετʔϧͯ͠Πϝʔδʹґଘؔ܎͝ͱؚΊΔ 3. 2ͷґଘؔ܎ͷΠϯετʔϧઌσΟϨΫτϦ಺ ʹ͋ΔbinσΟϨΫτϦΛPATHʹؚΊΔΑ͏ʹ͠ ͓ͯ͘

  47. docker-composeͷྫ (։ൃ/ຊ൪؀ڥ)

  48. docker-composeͷྫ (։ൃ/ຊ൪؀ڥ) ։ൃͱຊ൪Ͱ͸Ϗϧυͨ͠ΠϝʔδΛࢦ ఆ͢Δɻ ϩάग़ྗઌσΟϨΫτϦͷΈΛϚ΢ϯτ ͢Δ

  49. ΞϓϦέʔγϣϯͷDockerfileͷྫ

  50. ΞϓϦέʔγϣϯͷDockerfileͷྫ ϩʔΧϧ؀ڥͰ΋ར༻͍ͯ͠ΔPython༻ ͷΠϝʔδΛݩΠϝʔδʹઃఆ͢Δ (Ϗ ϧυ࣌ؒ୹ॖͷͨΊʹ௒ॏཁ) ADDͰϓϩδΣΫτͷιʔεશମΛΠ ϝʔδʹ௥Ճ͢Δɻ/var/opt/example ͕ ΞϓϦέʔγϣϯͷϧʔτͱͳΔ pipͷΠϯετʔϧઌσΟϨΫτϦ͸σϑΥϧτ(ϢʔβσΟ

    ϨΫτϦ഑Լͷ .local σΟϨΫτϦͱ͢Δ) ͜Ε͸ADDର ৅ͱͳͬͨσΟϨΫτϦ഑ԼΛΠϯετʔϧઌͱͨ͠৔߹ɺ ADDͨ͠ॠؒͷঢ়ଶʹϩʔϧόοΫ͞Εͯ͠·͏ͨΊɺ ϩʔΧϧͱ͸ҟͳΔσΟϨΫτϦͱ͍ͯ͠Δ
  51. ΞϓϦέʔγϣϯͷىಈ (։ൃɾຊ൪) # ىಈ͢Δ (։ൃ)
 docker-compose -f docker-compose.development.yml pull docker-compose

    -f docker-compose.development.yml run --rm web python manage.py collectstatic -- noinput
 docker-compose -f docker-compose.development.yml up -d # ىಈ͢Δ (ຊ൪Web)
 docker-compose -f docker-compose.production_web.yml pull
 docker-compose -f docker-compose.production_web.yml run --rm web python manage.py collectstatic -- noinput docker-compose -f docker-compose.production_web.yml up -d
 # ىಈ͢Δ (ຊ൪Batch)
 docker-compose -f docker-compose.production_batch.yml pull docker-compose -f docker-compose.production_batch.yml up -d
  52. ։ൃɾຊ൪Ͱ͸ґଘؔ܎ΛؚΊͨΞϓϦέʔγϣϯ ͷΠϝʔδΛ୯ʹىಈ͢Δ͚ͩʹͳΓ·͢ɻ͜ͷΠ ϝʔδ͸Jenkins΍CircleCIͳͲɺCI؀ڥͰdocker build͠ɺ։ൃɾຊ൪͔Β΋ΞΫηεՄೳͳϨδε τϦ΁docker push͓͖ͯ͠·͢ɻ ։ൃɾຊ൪͸Ϗϧυͨ͠DockerΠϝʔδΛ pull ͠ ͯىಈ͢Δ͚ͩͰσϓϩΠ͕׬ྃ͢ΔͨΊɺ։ൃ؀

    ڥͰಈ࡞֬ೝͨ͠ΠϝʔδΛͦͷ··ຊ൪΁࣋ͬͯ ͍͘͜ͱ΋ՄೳͱͳΓɺ΄΅؀ڥࠩҟͷͳ͍ಈ࡞Λ ظ଴Ͱ͖·͢ɻ
  53. ؀ڥ͝ͱͷґଘؔ܎ͷ؅ཧͱσϓϩΠͷ·ͱΊ ɾDockerΛ࢖֤ͬͯ؀ڥΛ؅ཧ͢Δ৔߹ɺ౷ׅ͢ΔϓϩδΣΫτΛ࡞੒ ͠ɺͦ͜Ͱ؀ڥผͷdocker-compose.ymlͱϛυϧ΢ΣΞͷઃఆϑΝΠϧ Λ؅ཧ͢Δͱɺશ؀ڥͷ؅ཧ͓Αͼ։ൃ͕͠΍͘͢ͳΔ ɾϩʔΧϧ؀ڥ͸ϗετଆʹιʔεϑΝΠϧɺґଘؔ܎Λ഑ஔ͠ɺͦΕ ΒΛϚ΢ϯτͯ͠ΞϓϦέʔγϣϯΛىಈ͢Δ͜ͱͰɺ౎౓मਖ਼ͱ֬ೝ Λ͠΍͘͢͢Δ
 ɾ։ൃɾຊ൪͸ґଘؔ܎ͱιʔεΛ1ͭʹ·ͱΊͨDockerΠϝʔδΛϏϧ υˍσϓϩΠ͢Δ͜ͱͰσϓϩΠΛ؆ܿʹͭͭ͠ɺΞϓϦέʔγϣϯͷ ؀ڥࠩҟΛ΄΅θϩʹͰ͖Δ

  54. ͓·͚-01. Dockerʹ͓͚ΔΞϯνύλʔ ϯͱରԠࡦ

  55. ࠷ޙʹɺࢲ͕ࠓ·Ͱ։ൃݱ ৔Ͱ࣮ࡍʹૺ۰ͯ͠དྷͨ DockerͷΞϯνύλʔϯ ͱͦͷରԠࡦʹ͍ͭͯ঺հ ͠·͢ɻ

  56. Ξϯνύλʔϯ-01. ڊେ͗͢ΔDockerΠϝʔδ

  57. DockerΛ࢖͍࢝Ίͨ๭ϓϩδΣΫτA͞Μͷྫ ɾDockerͷϏϧυ͕30෼Ҏ্͔͔Δ
 ɾԿ͔ͱࢥͬͯௐ΂ͯΈΔͱDockerΠϝʔδͷ αΠζ͕2GBΛ௒͍͑ͯΔʢʂʣ ɾ͜ΕͰ͸εέʔϧ΋ͮ͠Β͍͠ɺϙʔλϏϦ ςΟʹ͸΄Ͳԕ͍
 ɾͦ΋ͦ΋ͳΜͰ2GBҎ্ͷαΠζʹͳͬͨͷ ͔

  58. DockerΛ࢖͍࢝ΊͨϓϩδΣΫτA͞Μͷצҧ͍ ɾࠓ·ͰVagrant͹͔Γ࢖͍ͬͯͨͷͰDockerΛ Ծ૝؀ڥͷΑ͏ͳ΋ͷͱצҧ͍͍ͯͨ͠
 ɾͦͷͨΊɺ1ͭͷΠϝʔδʹϛυϧ΢ΣΞશͯ ͱΞϓϦέʔγϣϯΛશ෦ೖΕͯ͠·͍ͬͯͨ
 ɾ͞Βʹ͸Կނ͔ຖճιʔε͔ΒϏϧυ͓ͯ͠ ΓɺDockerͷϏϧυ͕30෼Ҏ্͔͔͍ͬͯͨ

  59. DockerΛ࢖͍࢝ΊͨϓϩδΣΫτA͞ΜͷରԠࡦ 1. ϛυϧ΢ΣΞ͝ͱɺΞϓϦέʔγϣϯ͝ͱʹ DockerΠϝʔδ͸෼ׂ͢Δ
 2. ϛυϧ΢ΣΞΛιʔε͔ΒϏϧυ͢ΔΑ͏ͳ ຖճ݁Ռ͕ಉ͡ʹͳΔΑ͏ͳ৔߹͸༧ΊϏϧυ ͨ͠΋ͷผΠϝʔδԽ͓͖ͯ͠ɺFROMͷϕʔε Πϝʔδͱͯ͠ࢦఆ͢ΔΑ͏ʹDockerfileΛॻ͘


  60. Ξϯνύλʔϯ-02. ΞΧ΢ϯτ৘ใΛΠϝʔδ಺ ʹอଘͯ͠͠·͏

  61. DockerΛ࢖͍࢝Ίͨ๭ϓϩδΣΫτA͞Μͷྫ̎ ɾ࡞੒ͨ͠DockerΠϝʔδΛಛʹύϥϝʔλΛࢦఆͤͣ ىಈ͢ΔͱಛఆͷRDS΍S3΁઀ଓ͢ΔΑ͏ʹͳ͍ͬͯͨ
 ɾԿ͔ͱࢥͬͯௐ΂ͯΈΔͱDBͷ઀ଓ৘ใ΍AWSͷ IAMΞΧ΢ϯτͷΫϨσϯγϟϧ৘ใ(ΞΫηεΩʔ΍γ ʔΫϨοτΩʔ)·Ͱ΋͕Πϝʔδ಺ʹ಺แ͞Ε͍ͯͨ ɾ͜ΕͰ͸ηΩϡϦςΟతʹΑΖ͘͠ͳ͍͠ɺ઀ଓઌ͕ ݻఆʹͳ͍ͬͯͯ͸֤؀ڥͰΠϝʔδΛ࢖͍·Θ͢͜ͱ ͕Ͱ͖ͳ͍

  62. DockerΛ࢖͍࢝Ίͨ๭ϓϩδΣΫτA͞ΜͷରԠࡦ 1. DockerΠϝʔδ಺ʹDB઀ଓઌ΍ΫϨσϯγϟϧ৘ ใ͸಺แ͠ͳ͍ɻDockerΠϝʔδىಈ࣌ʹ؀ڥม਺ͱ ͯ͠౉͢
 2. Ͳ͏ͯ͠΋؀ڥม਺͕ಡΈࠐΊͳ͍ઃఆϑΝΠϧͳ Ͳͷ৔߹ɺgettextʹ෇ଐ͍ͯ͠Δ envsubst ίϚϯυΛ

    ࢖༻ͯ͠ઃఆϑΝΠϧʹهड़͞Εͨ؀ڥม਺Λஔ͖׵ ͑ΔΑ͏ʹ͢Δ 3. ؀ڥม਺ͷ؅ཧ͸ direnv Λ࢖͏ͱศར
  63. ͜ΕΛػʹɺDockerʹ· ͩ৮Ε͍ͯͳ͍ํ΋ੋඇಋ ೖΛݕ౼ͯ͠ΈΔ͜ͱΛΦ εεϝ͍ͨ͠·͢ɻ

  64. Thanks! ͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠