今からでも遅くない!アプリケーションエンジニアが知っておきたい、Dockerコンテナの基礎知識 / The Basic of Docker Container for Developers

今からでも遅くない!アプリケーションエンジニアが知っておきたい、Dockerコンテナの基礎知識 / The Basic of Docker Container for Developers

クラウドネイティブを取り巻く技術の中でも、ひときわKubernetes(Dockerコンテナ)は注目を浴びており、様々なシーンで利用が始まっています。本セッションでは、Dockerコンテナが私達にもたらす恩恵や、アプリケーションのコンテナ化に置いて気をつけるべきポイントについて、アプリケーションエンジニアという観点からお話したいと思います。以下の聴講者を主なターゲットとしています:
・Webアプリケーション開発者(フロント/バックエンド/モバイル)
・Dockerをローカルで動かしたことがある/CIなどで既にあるパイプラインなどを利用しているエンジニア
・KubernetesやDockerを、プロダクトに導入してみたいアプリケーション開発者

Ad22fcf5773b906c08330f4d57242212?s=128

Kohei Ota

July 22, 2019
Tweet

Transcript

  1. ࠓ͔ΒͰ΋஗͘ͳ͍ʂ ΞϓϦέʔγϣϯΤϯδχΞ͕஌͓͖ͬͯͨ ͍%PDLFSίϯςφͷجૅ஌ࣝ $MPVE/BUJWF%BZT5PLZP!ދϊ໳ώϧζϑΥʔϥϜ  גࣜձࣾ;0;0ςΫϊϩδʔζ ։ൃ෦ .-0QTνʔϜ ଠా ߤฏ

    $PQZSJHIU˜;0;05FDIOPMPHJFT *OD
  2. ˜;0;05FDIOPMPHJFT *OD גࣜձࣾ;0;0ςΫϊϩδʔζ ։ൃ෦ .-0QTνʔϜ ΤϯδχΞ ଠా ߤฏ ೥݄ʹελʔττΡσΠςΫϊϩδʔζ ݱ;0;0ςΫϊ

    ϩδʔζ ʹೖࣾɻ ։ൃ෦ͷ1#νʔϜʹͯ"84Λத৺ʹւ֎޲͚ࣗࣾ&$ͷΠϯϑ ϥ։ൃ΍ӡ༻ͳͲΛ୲౰ޙɺ43&ͱ֤ͯ͠ॴͷΠϯϑϥʹैࣄɻ ೥݄ΑΓɺ.-0QTνʔϜʹ഑ଐͱͳΓɺओʹ($1Λ࢖ͬ ͨػցֶशج൫ͷઃܭߏங΍ӡ༻ͳͲΛߦ͍ͬͯΔɻ 2
  3. ˜;0;05FDIOPMPHJFT *OD IUUQT[P[PKQ ˔ ೔ຊ࠷େڃͷϑΝογϣϯ௨ൢαΠτ ˔  Ҏ্ͷγϣοϓɺ Ҏ্ͷϒϥϯυͷऔΓѻ͍ʢͱ΋ ʹ೥݄຤࣌఺ʣ

    ˔ ৗ࣌ສ఺Ҏ্ͷ঎඼ΞΠςϜ਺ͱຖ೔ฏۉ ఺Ҏ্ͷ৽ண ঎඼Λܝࡌ ˔ ଈ೔഑ૹαʔϏε ˔ ΪϑτϥοϐϯάαʔϏε ˔ πέ෷͍ ͳͲ 3
  4. ˜;0;05FDIOPMPHJFT *OD IUUQTXFBSKQ 4 ˔ ೔ຊ࠷େڃͷϑΝογϣϯίʔσΟωʔτΞϓϦ ˔  ສμ΢ϯϩʔυಥഁɺίʔσΟωʔτ౤ߘ૯਺͸ສ݅ Ҏ্ʢͱ΋ʹ೥݄຤࣌఺ʣ

    ˔ શੈքʢ"QQ4UPSF(PPHMF1MBZ͕ར༻ՄೳͳશͯͷࠃʣͰμ ΢ϯϩʔυ͕Մೳ ˔ ສਓҎ্ͷϑΥϩϫʔΛ࣋ͭϢʔβʔʢ8&"3*45"ʣ΋஀ੜ
  5. ˜;0;05FDIOPMPHJFT *OD IUUQT[P[PKQNVMUJTJ[F ˔ ਎௕ͱମॏΛબ୒͢Δ͚ͩͰཧ૝ͷαΠζͷ঎඼͕ݟ͔ͭΔ৽͠ ͍༸෰ͷങ͍ํ ˔ ;0;046*5Ͱಘͨສ݅Ҏ্ͷମܕσʔλΛ׆༻͠ɺʙ αΠζͷϚϧναΠζʢଟαΠζʣʹల։ ˔

    ೥ळౙΞΠςϜ͔ΒɺਓؾϒϥϯυͷϚϧναΠζΞΠς ϜΛൢച։࢝ ʲࢀՃاۀʳ גࣜձࣾΞʔόϯϦαʔνɺגࣜձࣾετϥΠϓΠϯλʔφγϣφϧɺ גࣜձࣾσΠτφɾΠϯλʔφγϣφϧɺגࣜձࣾύϧɺגࣜձࣾϏʔϜεɺ גࣜձࣾϕΠΫϧʔζɺ."3,45:-&3גࣜձࣾɺϦʔόΠɾετϥ΢ε δϟύϯגࣜձࣾ ͳͲ 5
  6. ˜;0;05FDIOPMPHJFT *OD ͜ͷεϥΠυʹॻ͔Ε͍ͯΔ಺༰͸ൃදऀݸਓͷ΋ͷͰ͋ Γɺ૊৫΍ϓϩμΫτΛ୅ද͢Δ΋ͷͰ͸͋Γ·ͤΜɻ ໔੹ࣄ߲ 6

  7. ˜;0;05FDIOPMPHJFT *OD ˔%PDLFSͷ͓͞Β͍ ˔%PDLFSίϯςφͱ%PDLFSΠϝʔδ ˔%PDLFSͰղܾͰ͖Δ͜ͱɾղܾͰ͖ͳ͍͜ͱ ˔ίϯςφɾΦʔέετϨʔγϣϯͷجૅ ˔,VCFSOFUFTͱ%PDLFSͷ͔͔ΘΓ ˔,VCFSOFUFTҎ֎ͷίϯςφΦʔέετϨʔγϣϯ ΞδΣϯμ 7

  8. ˜;0;05FDIOPMPHJFT *OD ˔%PDLFSͷ͓͞Β͍ ˔%PDLFSίϯςφͱ%PDLFSΠϝʔδ ˔%PDLFSͰղܾͰ͖Δ͜ͱɾղܾͰ͖ͳ͍͜ͱ ˔ίϯςφɾΦʔέετϨʔγϣϯͷجૅ ˔,VCFSOFUFTͱ%PDLFSͷ͔͔ΘΓ ˔,VCFSOFUFTҎ֎ͷίϯςφΦʔέετϨʔγϣϯ ΞδΣϯμ 8

  9. ˜;0;05FDIOPMPHJFT *OD ˔EPU$MPVEࣾ %PDLFSࣾͷલ਎ ͕ࣗࣾͷ1BB4 1MBUGPSN BTB4FSWJDF Λ࡞ΔͨΊʹ։ൃͨ͠ίϯςφܕԾ૝Խ ͷΞϓϦέʔγϣϯ࣮ߦج൫ ˔طଘͷ7.ܕԾ૝Խʹൺ΂ɺىಈ͕ඇৗʹߴ଎

    ˔ϩΰ͕͔Θ͍͍ %PDLFSͷ͓͞Β͍ 9
  10. ˜;0;05FDIOPMPHJFT *OD ˔ίϯςφܕԾ૝Խʁ ˓ίϯςφͱ͸ ˙ΞϓϦέʔγϣϯͷ࣮ߦʹඞཁͳ؀ڥΛ Ұͭͷύοέʔδʹ·ͱΊͨԾ૝తͳ୯Ґ ˔04ΑΓ΋ԼͷϨΠϠΛʮ-JOVYΧʔωϧʯΛ࢖ͬͯ ࠶ݱ͢ΔԾ૝Խٕज़ %PDLFSͷ͓͞Β͍ 10

      (Go/Java/Ruby...)   
  11. ˜;0;05FDIOPMPHJFT *OD -JOVY,FSOFM %PDLFS&OHJOF JT ! 11

  12. ˜;0;05FDIOPMPHJFT *OD Ͱ΋͜ͷઆ໌ɺΞϓϦέʔγϣϯ ։ൃऀʹͱͬͯ͸গ͠෼͔Γʹ͘ ͘ͳ͍Ͱ͔͢ʁ 12

  13. ˜;0;05FDIOPMPHJFT *OD ˔खݩ 8JOEPXTNBD04 ͱຊ൪؀ڥͷࠩҟΛͳ͍ͨ͘͠ ˓αʔόʔ͝ͱʹΞϓϦέʔγϣϯ΍ϛυϧ΢ΣΞΛ ઃఆɾσϓϩΠ͢Δͷ͕େม ˓ϥΠϒϥϦͷΞοϓσʔτɾɾɾ ˓खݩͷ7BHSBOU "OTJCMF

    ͱຊ൪Ͱϛυϧ΢ΣΞͷ όʔδϣϯ͕͏·͘ଗ͑ΒΕͳ͍ʂ %PDLFSར༻͢΂͖ྫͷ࣮ଶ 13
  14. ˜;0;05FDIOPMPHJFT *OD ͦΕɺશ෦ʢجຊతʹʣ %PDLFSͰղܾͰ͖·͢Αʂ 14

  15. ˜;0;05FDIOPMPHJFT *OD ˔%PDLFSͷ͓͞Β͍ ˔%PDLFSίϯςφͱ%PDLFSΠϝʔδ ˔%PDLFSͰղܾͰ͖Δ͜ͱɾղܾͰ͖ͳ͍͜ͱ ˔ίϯςφΦʔέετϨʔγϣϯͷجૅ ˔,VCFSOFUFTͱ%PDLFSͷ͔͔ΘΓ ˔,VCFSOFUFTҎ֎ͷίϯςφΦʔέετϨʔγϣϯ ΞδΣϯμ 15

  16. ˜;0;05FDIOPMPHJFT *OD ˔%PDLFS্Ͱʮ͜͏͍͏ৼΔ෣͍Λ͢Δʯͱ͍͏ఆٛ ˔%PDLFSGJMFΛॻ͘ˠϏϧυ͢Δ %PDLFSΠϝʔδ ˓࣮ଶ͸UBSܗࣜͰ·ͱΊͨΞʔΧΠϒϑΝΠϧ ˔͜ͷ࣌఺Ͱ͸·࣮ͩࡍʹಈ࡞͍ͯ͠ΔΘ͚Ͱ͸ͳ͍ %PDLFSΠϝʔδͱ͸ 16 Dockerfile

    docker build Docker
  17. ˜;0;05FDIOPMPHJFT *OD ˔%PDLFSϗετͷ্Ͱ࣮ࡍʹಈ࡞͢Δϓϩηε ˔ίϯςφΛ্ཱͪ͛ΔͨΊʹ͸ɺϕʔεͱͳΔ %PDLFSΠϝʔδ͕ඞཁ %PDLFSίϯςφͱ͸ 17 Docker  Docker

     Docker   Docker  docker run
  18. ˜;0;05FDIOPMPHJFT *OD ˔ݴ͍׵͑ΔͱɺԼهΛ࣮ߦͨ͠΋ͷ͕ίϯςφʹͳΔ ˓%PDLFSGJMF͔Β࡞੒ͨ͠खݩͷΠϝʔδ ˓࡞੒ࡁΈͷ֎෦ΠϝʔδΛϨδετϦ͔Βऔಘ %PDLFSίϯςφͱ͸ 18 Docker  Docker

     Docker   Docker  docker run
  19. ˜;0;05FDIOPMPHJFT *OD ˔%PDLFSGJMF͔ΒΠϝʔδΛϏϧυ ˔Ϗϧυͨ͠ΠϝʔδΛϨδετϦʹ1VTI ˔ಈ͔͍ͨ͠؀ڥͰΠϝʔδΛ1VMM͠ɺίϯςφΛىಈ ˔͜ͷྲྀΕΛ·ͱΊͯʮ#VJME 4IBSF 3VOʯͱݺͿ #VJME 4IBSF

    3VO 19 Dockerfile docker build Docker Docker docker run
  20. ˜;0;05FDIOPMPHJFT *OD %PDLFSΠϝʔδ͕ͦͷ·· ʮΰʔϧσϯΠϝʔδʯͱͳΔͨΊɺ ϥΠϒϥϦ΍ݴޠϥϯλΠϜͷ όʔδϣϯࠩҟ͕ੜ·Εʹ͍͘ 20

  21. ˜;0;05FDIOPMPHJFT *OD %PDLFSGJMFΛ(JUͰ؅ཧ͠ɺΠϝʔδ ͷλά؅ཧʹ(JUϋογϡΛ࢖͏ ͜ͱͰʮ͍ͭʯʮͲͷΠϝʔδʯΛ ࢖͔ͬͨΛ໌֬ʹͰ͖Δ 21

  22. ˜;0;05FDIOPMPHJFT *OD ˔%PDLFSͷ͓͞Β͍ ˔%PDLFSίϯςφͱ%PDLFSΠϝʔδ ˔%PDLFSͰղܾͰ͖Δ͜ͱɾղܾͰ͖ͳ͍͜ͱ ˔ίϯςφΦʔέετϨʔγϣϯͷجૅ ˔,VCFSOFUFTͱ%PDLFSͷ͔͔ΘΓ ˔,VCFSOFUFTҎ֎ͷίϯςφΦʔέετϨʔγϣϯ ΞδΣϯμ 22

  23. ˜;0;05FDIOPMPHJFT *OD ˔%PDLFSͰղܾͰ͖Δ͜ͱ ˓શ؀ڥͷڞ௨Խ ˙Ϋϥ΢υɾΦϯϓϨ্ͱ։ൃ؀ڥͱͷࠩҟΛzݮΒ͢z ˓ߴ଎ͳΞϓϦέʔγϣϯ഑৴ɾσϓϩΠ ˓$*ͳͲʹΑΔࣗಈԽਪਐ ˙ςετ΋ಉҰ؀ڥͰ࣮ߦՄ %PDLFS͸ۜͷ஄ؙͰ͸ͳ͍ 23

  24. ˜;0;05FDIOPMPHJFT *OD ˔%PDLFS͕ۤखͳ͜ͱ ˓ϞϊϦγοΫͳΞϓϦέʔγϣϯͷ؅ཧ ˠ5IF5XFMWF'BDUPS"QQ ˠ$MPVE/BUJWF5SBJM.BQ %PDLFS͸ۜͷ஄ؙͰ͸ͳ͍ 24

  25. ˜;0;05FDIOPMPHJFT *OD ˔%PDLFSͰղܾͰ͖ͳ͍͜ͱ ˓ΞϓϦɾγεςϜϩάͷ؅ཧ ˓؂ࢹ ˓ॊೈͳϦιʔε؅ཧ %PDLFS͸ۜͷ஄ؙͰ͸ͳ͍ 25

  26. ˜;0;05FDIOPMPHJFT *OD ίϯςφΛຊ൪؀ڥͰ ಈ͔͢ʹ͸͍͔ͭ͘ͷ՝୊͕͋Δ 26

  27. ˜;0;05FDIOPMPHJFT *OD ˔%PDLFSͷ͓͞Β͍ ˔%PDLFSίϯςφͱ%PDLFSΠϝʔδ ˔%PDLFSͰղܾͰ͖Δ͜ͱɾղܾͰ͖ͳ͍͜ͱ ˔ίϯςφΦʔέετϨʔγϣϯͷجૅ ˔,VCFSOFUFTͱ%PDLFSͷ͔͔ΘΓ ˔,VCFSOFUFTҎ֎ͷίϯςφΦʔέετϨʔγϣϯ ΞδΣϯμ 27

  28. ˜;0;05FDIOPMPHJFT *OD ˔ຊ൪؀ڥͰ͸ෳ਺ͷίϯςφΛಈ͔͢͜ͱ͕Ұൠత ˓Մ༻ੑ΍଱ো֐ੑΛ্͛ΔͨΊ ˓ࣗಈεέʔϦϯάɺϩʔυόϥϯγϯάɺࣗݾ෮چ౳ʑ ˔֤ίϯςφ͸ಠཱ͓ͯ͠Γɺ͓ޓ͍Λೝࣝ͠ͳ͍ͨΊ ԿΒ͔ͷ؅ཧϨΠϠ͕ඞཁʹͳΔ ˠΦʔέετϨʔγϣϯπʔϧΛೖΕΔ ΦʔέετϨʔγϣϯʁʁ 28

  29. ˜;0;05FDIOPMPHJFT *OD ˔%PDLFSίϯςφ͸ΞϓϦέʔγϣϯ։ൃʹ͓͍ͯ ैདྷ՝୊ͱͳ͍͍͔ͬͯͨͭ͘ͷ໰୊Λղফͯ͘͠ΕΔ ˔%PDLFS୯ମͰ͸ຊ൪ӡ༻ʹඞཁͳ؅ཧ༻ͷػೳ͕ෆ଍ ͍ͯ͠ΔͨΊɺಋೖʹ೉͕͋Δ ˔ͦΕΒΛղܾ͢Δʹ͸ɺίϯςφΦʔέετϨʔγϣ ϯ͕ඞཁ ͜͜·Ͱͷ·ͱΊ 29

  30. ˜;0;05FDIOPMPHJFT *OD ˔%PDLFSͷ͓͞Β͍ ˔%PDLFSίϯςφͱ%PDLFSΠϝʔδ ˔%PDLFSͰղܾͰ͖Δ͜ͱɾղܾͰ͖ͳ͍͜ͱ ˔ίϯςφΦʔέετϨʔγϣϯͷجૅ ˔,VCFSOFUFTͱ%PDLFSͷ͔͔ΘΓ ˔,VCFSOFUFTҎ֎ͷίϯςφΦʔέετϨʔγϣϯ ΞδΣϯμ 30

  31. ˜;0;05FDIOPMPHJFT *OD ˔,VCFSOFUFT͸ίϯςφΦʔέετϨʔγϣϯπʔϧͷ ʮσϑΝΫτελϯμʔυʯ ,VCFSOFUFTʁ 31

  32. ˜;0;05FDIOPMPHJFT *OD 32

  33. ˜;0;05FDIOPMPHJFT *OD ˔ίϯςφ 1PE Λத৺ͱͨ͠෼ࢄγεςϜ ˓ϫʔΫϩʔυ͕ৗʹʮ͋Δ΂͖ঢ়ଶʯΛอͭΑ͏ಈ͘ ,VCFSOFUFTͷ֓ཁ 33 Ref: https://kubernetes.io/docs/tutorials/kubernetes-basics/explore/

  34. ˜;0;05FDIOPMPHJFT *OD :".-ʹΑΔߏ੒؅ཧ 34

  35. ˜;0;05FDIOPMPHJFT *OD ˔ίϯςφͷઃఆ ˓ϕʔεΠϝʔδɺόʔδϣϯɺϙʔτ౳ ˔ཁٻ͢Δ$16΍ϝϞϦͳͲͷϦιʔε ˔ϔϧενΣοΫ ˔؀ڥม਺ ˔ࣗಈεέʔϧͷ਺΍εέʔϧΠϯΞ΢τͷ৚݅ :".-ʹΑΔએݴతͳઃఆ 35

  36. ˜;0;05FDIOPMPHJFT *OD ˔ίϯςφͷઃఆ ˓ϕʔεΠϝʔδɺόʔδϣϯɺϙʔτ౳ ˔ཁٻ͢Δ$16΍ϝϞϦͳͲͷϦιʔε ˔ϔϧενΣοΫ ˔؀ڥม਺ ˔ࣗಈεέʔϧͷ਺΍εέʔϧΠϯΞ΢τͷ৚݅ :".-ʹΑΔએݴతͳઃఆ 36

    
  37. ˜;0;05FDIOPMPHJFT *OD 37

  38. ˜;0;05FDIOPMPHJFT *OD :".-ߏ੒؅ཧʹΑΔ੹೚෼ք఺ͷม Խ 38     VM

       SSH Git push  VM
  39. ˜;0;05FDIOPMPHJFT *OD 39     VM  

     SSH Git push  VM :".-ߏ੒؅ཧʹΑΔ੹೚෼ք఺ͷม Խ
  40. ˜;0;05FDIOPMPHJFT *OD ։ൃεΩʔϚͷมԽͱ %FW0QT 40 ˔։ൃͱΠϯϑϥͷ֞ࠜͷϥΠϯ͕มΘΔ ˓ΞϓϦଆͰߏ੒ͷมߋΛՃ͑ΒΕΔൣғ͕૿͑Δ ˔%FW0QTͷઢҾΛܾΊΔͷ͸ϓϩμΫτ΍αʔϏεʹ ؔΘΔΤϯδχΞࣗ਎

  41. ˜;0;05FDIOPMPHJFT *OD ˔,VCFSOFUFT͸ɺ%PDLFSΛ$3* ίϯςφΛ࣮ߦͤ͞Δ ͨΊͷϥϯλΠϜ࣮૷ ͷͭͱͯ͠ೝ͍ࣝͯ͠Δ ˓,VCFSOFUFT্ͰίϯςφΛʮಈ͔͚ͩ͢ʯͰ͋Ε͹ɺ ଞͷ$3*Λ࢖͏͜ͱ΋Ͱ͖Δ ˙DPOUBJOFSE ˙DSJPͳͲ

    ,VCFSOFUFTͱ%PDLFS 41
  42. ˜;0;05FDIOPMPHJFT *OD ˔$3*͕ੜ·ΕΔલɺ,VCFSOFUFT͸%PDLFSʹ׬શʹґଘ ˓%PDLFSͳ͠Ͱ,VCFSOFUFT͕ಈ͔ͳ͔ͬͨͨΊɺ %PDLFSࣗମ͕ڧ͍ྗΛ͍࣋ͬͯͨ ˔ݱࡏ͸$3*ͷ࢓༷ࡦఆʹΑͬͯଞͷϥϯλΠϜ͕ಈ͘ ˓%PDLFSࣗମ΋,VCFSOFUFT΁ͷ࿈ܞΛڧԽ͢Δಈ͖ ˠ%PDLFS͕,VCFSOFUFTʹ௥ै͢ΔΑ͏ͳߏਤʹͳͬͨ ,VCFSOFUFTͱ%PDLFS 42

  43. ˜;0;05FDIOPMPHJFT *OD ˔$3*ʹ͸ίϯςφͷ࣮ߦʹඞཁͳػೳ͔͠ͳ͍ ˓%PDLFSʹؚ·ΕΔػೳʹ΋ɺ,VCFSOFUFT্Ͱ ࢖͍ͬͯΔػೳɺ࢖͍ͬͯͳ͍ػೳ͕͋Δ ,VCFSOFUFTͱ%PDLFS 43

  44. ˜;0;05FDIOPMPHJFT *OD ˔%PDLFSͷ͓͞Β͍ ˔%PDLFSίϯςφͱ%PDLFSΠϝʔδ ˔%PDLFSͰղܾͰ͖Δ͜ͱɾղܾͰ͖ͳ͍͜ͱ ˔ίϯςφΦʔέετϨʔγϣϯͷجૅ ˔,VCFSOFUFTͱ%PDLFSͷ͔͔ΘΓ ˔,VCFSOFUFTҎ֎ͷίϯςφΦʔέετϨʔγϣϯ ΞδΣϯμ 44

  45. ˜;0;05FDIOPMPHJFT *OD ˔%PDLFS4XBSN ˔.BSBUIPO.FTPT ˔)BTIJDPSQ/PNBE ˔"NB[PO&$4 ༷ʑͳίϯςφΦʔέετϨʔγϣϯ 45

  46. ˜;0;05FDIOPMPHJFT *OD ˔%PDLFSίϯςφ͸ΞϓϦέʔγϣϯ։ൃʹ͓͍ͯ ैདྷ՝୊ͱͳ͍͍͔ͬͯͨͭ͘ͷ໰୊Λղফͯ͘͠ΕΔ ˔%PDLFS୯ମͰ͸ຊ൪ӡ༻ʹඞཁͳ؅ཧ༻ͷػೳ͕ෆ଍ ͍ͯ͠ΔͨΊɺίϯςφΦʔέετϨʔγϣϯ͕ඞཁ ˔,VCFSOFUFT͸͋͘·Ͱબ୒ࢶͷͭ ˓%PDLFSͱ͸࡞Γʹ΋ࠩҟ͕͋Γɺن໛ײ͕େ͖͍ ͨΊɺΫϥ΢υΛ࠶࣮૷͢Δ͘Β͍ͷ֮ޛͰ௅Ή΂͖ ·ͱΊ

    46
  47. ˜;0;05FDIOPMPHJFT *OD ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ 47

  48. None