Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Dockerを利用したローカル環境から本番環境までの構築設計 / Project struct...
Search
Kou
February 03, 2018
Programming
370
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Dockerを利用したローカル環境から本番環境までの構築設計 / Project structure design for docker application
Kou
February 03, 2018
More Decks by Kou
See All by Kou
デザインを見ながらフロントエンドコーディングをするときの考え方 / design-coding
kkoudev
2
1.7k
React Nativeで作るiOSアプリケーションの環境構築設計 / react native env for ios
kkoudev
1
2.5k
フロントエンドコーディングにおけるPageSpeed Insights対策 / frontend pagespeed insights-
kkoudev
7
7.2k
Docker Compose利用者から見た Kubernetes 開発環境構築入門 / introduction to kubernetes for docker compose user
kkoudev
19
12k
フロントエンドデザイン・開発におけるマークアップ設計の基礎 / frontend markup design basics
kkoudev
4
2.9k
Other Decks in Programming
See All in Programming
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
300
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
620
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
4
1.9k
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
200
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
300
AI時代、エンジニアはどう育つのか -未経験エンジニアの成長を間近で見て考えたこと-
thasu0123
0
220
【SRE NEXT 2026 Lunch Session】一人目専任SREの立ち上げを加速する ― AIと進めたオンボーディングで2分を0.04秒にした話
pkshadeck
PRO
0
3.6k
【QA Test Talk Vol.8】AI-DLC による Whole Team Approach の加速
pkshadeck
PRO
0
120
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
300
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
540
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
210
仕様駆動開発へのトライを機に チームに適合する手法を模索し続けている話
freee
PRO
0
450
Featured
See All Featured
The Curious Case for Waylosing
cassininazir
1
450
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
410
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
Music & Morning Musume
bryan
47
7.3k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.8k
Leo the Paperboy
mayatellez
8
2.1k
RailsConf 2023
tenderlove
30
1.5k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Darren the Foodie - Storyboard
khoart
PRO
3
3.6k
A better future with KSS
kneath
240
18k
Into the Great Unknown - MozCon
thekraken
41
2.7k
The browser strikes back
jonoalderson
0
1.5k
Transcript
DockerΛར༻ͨ͠ϩʔΧϧ ڥ͔Βຊ൪ڥ·Ͱͷߏஙઃܭ Koichi Nagaoka
ࣗݾհ Ԭ ߒҰ (@kkoudev) ؾ͚ͮۀք12͘Β͍ɻ ϑϩϯτΤϯυɺόοΫΤ ϯυɺΠϯϑϥɺiOS/ AndroidΞϓϦ։ൃɺͳΜͰ ͬͯ·͢
Έͳ͞ΜɺDockerΛ্ख ͍͑ͯ͘·͔͢ʁ
ࢄʑޠΓਚ͘͞ΕͨDockerͷར ɾDocker͕ಈ͘ڥͰOSͷػೳ͝ͱΠϝʔδ ԽͰ͖ΔͨΊɺϗετଆ͕macOSͩΖ͏ͱLinux ͩΖ͏ͱجຊతʹಉ͡Α͏ʹಈ࡞͢Δ ɾϙʔλϏϦςΟʹ༏Ε͓ͯΓɺεέʔϧ͕؆୯ ɾ֤छϛυϧΣΞ͕ެࣜͰΠϝʔδԽ͞Ε͍ͯ ΔͨΊɺͦΕΒΛར༻͢ΕϛυϧΣΞͷΠϯ ετʔϧ͕Docker͚ͩͰ݁͢Δ
͜ͷརΛੜ͔ͨ͢ΊʹɺDockerͷಛੑ Λཧղͭͭ͠ɺϩʔΧϧڥ͔Βຊ൪ڥ ·ͰΛߟྀͨ͠ઃܭΛߦ͏ඞཁ͕͋Γ·͢
ࠓհ͢Δ͜ͱ ɾDockerΛͬͨڥߏஙͷߟ͑ํ ɾDockerΛͬͨσϓϩΠͷߟ͑ํ ɾDockerʹ͓͚ΔΞϯνύλʔϯͱରԠࡦ
1. ֤ڥΛߏங͢Δ্Ͱඞཁ ͳཁ݅Λચ͍ग़͢
Α͋͘ΔWeb։ൃݱͷಈ࡞ڥ 1. ࣗͷϚγϯͰ࣮தͷΞϓϦέʔγϣϯΛελϯυΞ ϩϯʹಈ࡞ͤ͞Δڥ (ϩʔΧϧڥ) 2. ࣮͕ྃͨ͠ΞϓϦέʔγϣϯΛଞͷϓϩδΣΫτϝϯό ʔςελʔʹಈ࡞֬ೝͯ͠Β͏͚ࣾڥ (։ൃڥ) 3.
ࣾͰಈ࡞֬ೝͨ͠ΞϓϦέʔγϣϯΛຊ൪ϦϦʔεલʹ ͓٬͞Μʹݕऩͯ͠Β͏ͨΊͷڥ (εςʔδϯάڥ) 4. ςετݕऩྃͨ͠ΞϓϦέʔγϣϯΛՔಇͤ͞Δͨ Ίͷڥ (ຊ൪ڥ)
Α͋͘Δڥ͝ͱͷཁ݅ 1. ϩʔΧϧڥίʔυमਖ਼ͨ͠Β͙͢ʹಈ࡞֬ೝΛ ߦ͑ΔΑ͏ʹ͍ͨ͠ 2. ։ൃڥ༧ࢉͷؔͰ1͔͠༻ҙͰ͖ͳ͍ɻͦͷ 1ʹશͯͷϛυϧΣΞΛΠϯετʔϧͯ͠ߏஙͯ͠ ཉ͍͠ 3. ຊ൪ӡ༻Մ༻ੑΛߟྀͯ͠ϩʔυόϥϯαʔɺ
σʔλϕʔεɺΩϟογϡϚωʔδυαʔϏε (ALBɺRDSɺElastiCache)Λར༻͍ͨ͠͠
͜ͷڥ͝ͱͷཁ݅Λ࣮ݱ ͢Δํ๏ΛɺDockerΛͬ ͯߏங͢Δ߹ͱΘͳ͍ Ͱߏங͢Δ߹ͷͦΕͧΕ Λൺֱͯ͠հ͍͖ͯ͠·͢ ɻ
2. DockerΛ֤ͬͯڥΛߏ ங͢Δ
ࠓճߏஙͯ͠ΈΔڥ
֤αʔόͰಈ࡞ͤ͞ΔϛυϧΣΞ/ΞϓϦέʔγϣϯ ▪ϩʔυόϥϯαʔ ɾ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ͷδϣϒΩϡʔͱͯ͠༻)
2-1. ϩʔΧϧڥΛߏங͢Δ
ϩʔΧϧڥʹ͍ͭͯ ϩʔΧϧڥࣗͷ࣋ͭϚγϯڥ͚ͩͰಈ ࡞Λ݁ͤ͞ΔελϯυΞϩϯͳ࡞Γʹ͠ͳ͚ Ε͍͚·ͤΜɻͦͷ্ɺWebΞϓϦʹ͓͚Δ ϩʔΧϧڥͷ࠷େͷܽ։ൃػຊ൪ػ͕ ͱOS͕ҟͳΔέʔε͕ຆͲͰ͋ΔͨΊɺڥ ࠩҟʹΑΔಈ࡞ͷҧ͍͕࠷ൃੜ͍͢͠ڥ ͱͳΓ·͢ɻ
DockerΛΘͳ͍ϩʔΧϧڥͷߏஙखॱ 1. ALBϩʔΧϧͩͱཱͯΒΕͳ͍ͷͰɺΘΓʹHAProxyΛ ͏ 2. HAProxyɺRedisɺMySQLɺNginxɺRabbitMQɺPython3Λ HomebrewͰΠϯετʔϧ͢Δ 3. ϩʔΧϧ༻ͷ֤ϛυϧΣΞͷઃఆϑΝΠϧΛهड़͢Δ 4.
WebΞϓϦέʔγϣϯͱόονΞϓϦέʔγϣϯͰґଘؔ Λͤ͞ΔͨΊʹ venv Λ༻͢Δ 5. WebΞϓϦέʔγϣϯͱόονΞϓϦέʔγϣϯͷґଘؔ ΛͦΕͧΕ pip ͰΠϯετʔϧ͠ɺͦΕͧΕىಈ͓ͯ͘͠ɻ
͜ͷखॱ͚ͩΛݟΔͱҰݟ ؆୯ʹࢥ͑Δ͕ɾɾɾ
DockerΛΘͳ͍ϩʔΧϧڥͷߏஙखॱͷܽ 1. Homebrewجຊతʹ࠷৽όʔδϣϯΛΠϯετʔϧ͢ΔͨΊɺݹ͍ όʔδϣϯΛΠϯετʔϧ͢Δࡍ͍͍ͪͪઃఆ͕໘ͳ্ʹසൟʹ ༻͕มΘΔɻ։ൃ͍ͯ͠ΔΞϓϦέʔγϣϯ͕ෳ͋Δ߹͞Βʹό ʔδϣϯΛ߹ΘͤΔͷ͕ඇৗʹେม 2. ಈ࡞ͤ͞ΔOS͕ຊ൪ػͱҟͳΔͨΊɺσΟϨΫτϦύε͔ͳΓҟ ͳΔɻϛυϧΣΞͷઃఆϑΝΠϧͰϑΝΠϧύεΛهड़͍ͯ͠ΔՕॴ ૬ରύε͕͑ͳ͚ΕϩʔΧϧઐ༻ʹઃఆΛ༻ҙ͢Δඞཁ͕͋Δ
3. 1ͱ2ͷཧ༝͔ΒɺݸਓͷϚγϯͷঢ়ଶʹґଘͯ͠ಈ࡞͠ͳ͔ͬͨΓɺ ผಈ࡞ΛҾ͖ى͜͢έʔε͕ඇৗʹଟ͍ɻڥߏஙखॱͱ֤ͯ͠ਓ͕ؾ Λ͚ͭͳ͚Ε͍͚ͳ͍ϙΠϯτ͕ଟ͘ɺཧ͢Δଆͱͯ͠ඇৗʹ໘ Ͱ͋Δ
ͱʹ͔͘େมͰ໘͍͘͞ɻ ॳʹݱʹདྷͯ1Ҏ্ηοτ ΞοϓΛ͍ͯ͠Δਓ͕ଟ͘ݟΒΕ Δ߹ɺ΄΅͜ͷΑ͏ͳߏஙΛ ͍ͯ͠Δ͍ͤ (ͱݴͬͯաݴͰ ͳ͍)
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ʹهड़ͨ͠ϛυϧΣΞͱΞϓ ϦέʔγϣϯΛىಈ͢Δ
DockerΛ͏ϩʔΧϧڥͷߏஙखॱͷར 1. Homebrewͱҧ͍ɺ֤ϛυϧΣΞ͝ͱʹಛఆͷόʔδϣϯΛ؆୯ʹ ࢦఆ͢Δ͜ͱ͕Ͱ͖ΔɻόʔδϣϯΞοϓ͢ΔͷઃఆϑΝΠϧͷॻ͖ ͚͑ͩͰOKɻ·ͨɺDockerΠϝʔδͷऔಘdocker-composeͷىಈ࣌ʹ ࣗಈతʹߦΘΕΔ 2. ϗετଆͷOS͕ҟͳͬͯDockerΠϝʔδຊ൪ػͱಉ͡OSͷಈ࡞Λ ίϯςφԽՄೳͰ͋ΔͨΊɺσΟϨΫτϦϑΝΠϧύεͷҧ͍ͱ͍ͬͨ ڥࠩҟൃੜ͠ͳ͍
3. 1ͱ2ͷཧ༝͔ΒɺݸਓͷϚγϯͷঢ়ଶʹґଘͯ͠ಈ࡞͠ͳ͔ͬͨΓɺผ ಈ࡞ΛҾ͖ى͜͢έʔεΛ΄΅ආ͚ΒΕΔɻ 4. جຊతʹdocker-compose.ymlΛཧ͍ͯ͠ΔϦϙδτϦͷऔಘͱɺ docker-compose up -d ͚ͩͰڥߏங͕ྃ͢ΔɻཧߏஙϝνϟΫ νϟ؆୯ʂ
DockerΛ͏͜ͱͰڥߏ ங͕ܶతʹ؆୯ʹͳΓ·͢ɻ ͦΕʹՃ͑ͯڥࠩҟΛͳ ͤ͘Δɻ͜Ε͕ͦ͜Docker ࠷େͷརͰ͢
2-2. ։ൃڥ͔Βຊ൪ڥ·Ͱ Λߏங͢Δ
։ൃڥ͔Βຊ൪ڥ·Ͱ ϩʔΧϧͱҧ͍ɺϏϧ υͨ͠༰ΛύοέʔδԽ ͠ɺͦΕΛαʔόσϓϩ Π͢Δέʔε͕ຆͲͰ͢
DockerΛΘͳ͍։ൃ/ຊ൪ڥͷߏஙखॱ 1. ༻͢ΔALBɺElastiCache (Redis)ɺRDS (MySQL) Λ࡞͢Δ 2. NginxɺRabbitMQɺPythonͷ༻͢ΔόʔδϣϯΛAnsibleͳͲΛͬ ͯΠϯετʔϧ͢Δ 3.
։ൃ/ຊ൪༻ͷ֤ϛυϧΣΞͷઃఆϑΝΠϧΛهड़͢Δ 4. ։ൃػʹWebΞϓϦέʔγϣϯͱόονΞϓϦέʔγϣϯΛύοέʔ δϯάͯ͠ɺϑΝΠϧసૹ͢Δ (CapistranoAnsistrano͋ͨΓΛ͏) 5. WebΞϓϦέʔγϣϯͱόονΞϓϦέʔγϣϯͰґଘؔΛ͞ ͤΔͨΊʹ venv Λ༻͢Δ 6. WebΞϓϦέʔγϣϯͱόονΞϓϦέʔγϣϯͷґଘؔΛσϓϩ Π࣌ʹͦΕͧΕ pip ͰΠϯετʔϧ͠ɺىಈ͓ͯ͘͠ɻ
ϩʔΧϧʹൺΔͱߏங େมϥΫʹͳΓ·ͨ͠ɻ͠ ͔͠ɾɾɾ
DockerΛΘͳ͍։ൃ/ຊ൪ڥͷߏஙखॱͷܽ 1. ϛυϧΣΞͷόʔδϣϯΞοϓΛ͢Δࡍ ʹɺAnsibleͳͲͰ࠶ΠϯετʔϧΛ͢Δඞཁ ͕͋Δɻ(ίϯύΠϧΛ͏ͷͰ͋Εͦͷ ͕͔͔࣌ؒΔ) ·ͨɺόʔδϣϯผʹσΟϨΫτ ϦΛ͚ΔͳͲɺ༧ΊσΟϨΫτϦߏ͕ߟྀ ͞Ε͍ͯͳ͍ͱόʔδϣϯΞοϓ͕ͮ͠Β͘ͳ Δ
DockerΛ͏։ൃ/ຊ൪ڥͷߏஙखॱ 1. ༻͢ΔALBɺElastiCache (Redis)ɺRDS (MySQL)Λ࡞ ͢Δ 2. NginxɺRabbitMQɺϏϧυͨ͠PythonΞϓϦέʔγϣϯͷ ༻͢ΔΠϝʔδ໊ͱλά໊(όʔδϣϯ)ɺઃఆΛ docker-
compose ͷઃఆϑΝΠϧ(docker-compose.yml)ʹهड़͢Δ 3. ։ൃɾຊ൪༻ͷ֤ϛυϧΣΞͷઃఆϑΝΠϧΛهड़͢Δ 4. docker-composeΛىಈ͠ɺdocker-compose.ymlʹهड़͠ ͨϛυϧΣΞͱΞϓϦέʔγϣϯΛىಈ͢Δ
DockerΛ͏։ൃ/ຊ൪ڥͷߏஙखॱͷར 1. ϛυϧΣΞͷόʔδϣϯΞοϓ͕͍͢͠ɻdocker-compose ͷઃఆϑΝΠϧΛॻ͖͑Δ͚ͩͰOK 2. ΞϓϦέʔγϣϯͱͦͷґଘؔΛ̍ͭͷΠϝʔδͱͯ͠·ͱΊ Δ͜ͱ͕ग़དྷΔɻvenvΛ͏ඞཁͳ͘ͳΔ 3. 2Ͱ࡞ͨ͠ΠϝʔδΛ։ൃػ͔Βຊ൪ڥ·Ͱશ͘ಉ͡ͷΛ ར༻Ͱ͖ΔͨΊɺڥґଘ͢Δ͜ͱ͕΄΅ͳ͍ɻ(DBଓઌͳͲͷ
ઃఆͪΖΜڥมͱͯ͠ผͷͷΛ͢ඞཁ͋Γ) 4. ϩʔΧϧಉ༷ʹɺجຊతʹdocker-compose.ymlΛཧ͍ͯ͠ΔϦ ϙδτϦͷऔಘͱɺdocker-compose up -d ͚ͩͰڥߏங͕ྃ͢ ΔɻཧߏஙϝνϟΫνϟ؆୯ʂ
։ൃڥ͔Βຊ൪ڥ·ͰDockerΛ ͏ํ͕ϝϦοτ͕ଟ͍͜ͱ͕Θ͔Δ ͔ͱࢥ͍·͢ɻdocker-composeͷઃఆ ϑΝΠϧΛ֤αʔό͝ͱʹ༻ҙ͠ɺඞཁ ͳϛυϧΣΞͱΞϓϦέʔγϣϯͷઃ ఆΛهड़͢Δ͚ͩͰߏங͕ྃ͢ΔͷͰɺ ͱʹ͔͘؆୯Ͱ͢ɻ
3. ֤ڥΛҰݩཧ͢ΔϓϩδΣ ΫτσΟϨΫτϦߏͷհ
DockerΛ͏͜ͱͰ֤ڥ ͕ߏங͘͢͠ͳΔ͜ͱ Θ͔͕ͬͨɺ۩ମతʹͲͷ Α͏ʹ͢Εྑ͍ͷ͔ɺͦ ͷҰྫΛհ͠·͢ɻ
3-1. ֤ΞϓϦέʔγϣϯɺϛυ ϧΣΞΛ౷ׅཧ͢Δϓ ϩδΣΫτΛ࡞͢Δ
౷ׅཧ͢ΔϓϩδΣΫτͱԿ͔ ɾϩʔΧϧ͔Βຊ൪·ͰͷڥͷશͯͷϛυϧΣ ΞɺΞϓϦέʔγϣϯΛཧ͢Δ docker- compose.yml Λཧ͢ΔϓϩδΣΫτ ɾ֤ϛυϧΣΞͷઃఆϑΝΠϧڥผʹཧ͢Δ ɾϩʔΧϧ͚ʹWebΞϓϦέʔγϣϯόονͷ ιʔεΛ֨ೲ֤ͨ͠ιʔεϦϙδτϦͷஔ͖ॴ֬ อ͢Δ͜ͱͰɺιʔεΛDockerίϯςφϚ
ϯτ͠ɺϩʔΧϧ։ൃΛՄೳͱ͢Δ
౷ׅཧ͢ΔϓϩδΣΫτͷ۩ମྫ DockerͰར༻͢ΔϛυϧΣΞͷઃఆϑΝΠϧɺ ϩάσΟϨΫτϦΛ֨ೲͨ͠σΟϨΫτϦ docker loginґଘؔͷΠϯετʔϧͳ Ͳɺ໘ͳίϚϯυΛ؆қ࣮ߦग़དྷΔΑ͏ ʹͨ͠εΫϦϓτͷ֨ೲઌ WebΞϓϦέʔγϣϯόονΛཧͨ͠ ผϦϙδτϦͷιʔε֨ೲઌɻσΟϨΫτϦ ͷதࣗମgitignore͓ͯ͘͠
ڥผdocker-composeઃఆϑΝΠϧΛϧʔτʹ͓͘
͜ͷߏͷར ɾ͜ͷσΟϨΫτϦߏͷϓϩδΣΫτΛ֤ڥ ͍࣋ͬͯ͘͜ͱͰɺϩʔΧϧ͔Βຊ൪·Ͱͷ ڥͷશͯΛ͜ͷ౷ׅϓϩδΣΫτ͚ͩͰ݁Ͱ͖ Δ ɾ৽ͨʹΞϓϦέʔγϣϯϛυϧΣΞ͕Ճ ʹͳͬͨ߹ɺઃఆϑΝΠϧΛॻ͖͑ͨΓɺ sourcesσΟϨΫτϦʹผϦϙδτϦΛclone͢ Δ͚ͩͰྑ͍
3-2. ڥ͝ͱͷΞϓϦέʔγϣ ϯͷґଘؔͱσϓϩΠͷ ཧΛߟ͑Δ
ϏϧυରͱͳΔΞϓϦέʔγϣϯͷྫ ɾPythonͰಈ͘ΞϓϦέʔγϣϯ ɾґଘؔ pip Λͬͯཧ ɾ։ൃதґଘؔͷՃ͕ൃੜ͢Δ ɾґଘؔ requirements.txt ʹهࡌͯ͠ιʔε ͱಉ༷ʹόʔδϣϯཧ͢Δ
ϩʔΧϧڥʹٻΊΒΕΔ͜ͱ ɾιʔεΛमਖ਼ͨ͠Βଈमਖ਼͕֬ೝͰ͖Δ͜ͱ ɾґଘؔͷՃɾআ༰қʹߦ͑ͯɺ͔ͭ ͦͷө֬ೝ͙͢ʹߦ͑Δ͜ͱ
։ൃɾຊ൪ڥʹٻΊΒΕΔ͜ͱ ɾ։ൃڥͰ֬ೝͨ͠ͷΛͦͷ··ຊ൪ڥ ͍࣋ͬͯ͘͜ͱͰಉʹಈ࡞Ͱ͖Δ͜ͱ ɾґଘؔͱιʔεΛผཧͱͤͣɺ1ͭͷΠϝ ʔδʹؚΊΔ͜ͱͰɺΠϝʔδΛΓସ͑Δͩ ͚Ͱಈ࡞ΛอূͰ͖Δ͜ͱ
ϩʔΧϧڥʹ͓͚Δґଘؔͷཧͷྫ 1. ར༻͢ΔPythonͷDockerΠϝʔδΛ༻ҙ͢Δ 2. 1ͷΠϝʔδʹґଘؔΛ֨ೲ͢ΔσΟϨΫτϦΛ VOLUME໋ྩͰϚϯτՄೳͳঢ়ଶʹ͓ͯ͘͠ (pip --user ΦϓγϣϯΛར༻͢Δ͜ͱͰɺ
PYTHONUSERBASEڥมͰࢦఆ͞ΕͨσΟϨΫτ ϦʹґଘؔΛ֨ೲ͢Δ͜ͱ͕ՄೳͱͳΔ) 3. 2Ͱࢦఆͨ͠PYTHONUSERBASEͷσΟϨΫτϦ ʹ͋ΔbinσΟϨΫτϦΛPATHʹؚΊΔΑ͏ʹ͓ͯ͘͠
docker-composeͷྫ (ϩʔΧϧڥ)
docker-composeͷྫ (ϩʔΧϧڥ) ϩʔΧϧͰରΞϓϦέʔγϣϯͷϗετଆͷ ιʔεΛϚϯτ͢Δ PYTHONUSERBASEPATHͳͲͷڥม͜ ͜Ͱࢦఆ͢Δɻenv_fileʹؚΊΔܗͰՄ
ґଘؔͷΠϯετʔϧͱىಈ (ϩʔΧϧ) # ґଘؔΛΠϯετʔϧ͢Δ docker-compose run --rm web pip install
--user -r requirements.txt # ىಈ͢Δ docker-compose -f docker-compose.local.yml up -d
ϩʔΧϧͰґଘؔͷΠϯετʔϧ ىಈલʹҰߦ͍ɺϗετଆͷσΟ ϨΫτϦஔ͓ͯ͘͜͠ͱͰΠ ϯετʔϧ͢Δ͜ͱΛ͗·͢ɻιʔ εϗετଆͷͷΛϚϯτ͢Δ͜ ͱͰɺमਖ਼ˍಈ࡞֬ೝ͕Մೳͱͳ Γɺ։ൃ͕͘͢͠ͳΓ·͢ɻ
։ൃɾຊ൪ڥʹ͓͚Δґଘؔͷཧͷྫ 1. ར༻͢ΔPythonͷDockerΠϝʔδΛ༻ҙ͢Δ 2. DockerΠϝʔδͷϏϧυ࣌ʹґଘؔΛΠϯ ετʔϧͯ͠Πϝʔδʹґଘؔ͝ͱؚΊΔ 3. 2ͷґଘؔͷΠϯετʔϧઌσΟϨΫτϦ ʹ͋ΔbinσΟϨΫτϦΛPATHʹؚΊΔΑ͏ʹ͠ ͓ͯ͘
docker-composeͷྫ (։ൃ/ຊ൪ڥ)
docker-composeͷྫ (։ൃ/ຊ൪ڥ) ։ൃͱຊ൪ͰϏϧυͨ͠ΠϝʔδΛࢦ ఆ͢Δɻ ϩάग़ྗઌσΟϨΫτϦͷΈΛϚϯτ ͢Δ
ΞϓϦέʔγϣϯͷDockerfileͷྫ
ΞϓϦέʔγϣϯͷDockerfileͷྫ ϩʔΧϧڥͰར༻͍ͯ͠ΔPython༻ ͷΠϝʔδΛݩΠϝʔδʹઃఆ͢Δ (Ϗ ϧυ࣌ؒॖͷͨΊʹॏཁ) ADDͰϓϩδΣΫτͷιʔεશମΛΠ ϝʔδʹՃ͢Δɻ/var/opt/example ͕ ΞϓϦέʔγϣϯͷϧʔτͱͳΔ pipͷΠϯετʔϧઌσΟϨΫτϦσϑΥϧτ(ϢʔβσΟ
ϨΫτϦԼͷ .local σΟϨΫτϦͱ͢Δ) ͜ΕADDର ͱͳͬͨσΟϨΫτϦԼΛΠϯετʔϧઌͱͨ͠߹ɺ ADDͨ͠ॠؒͷঢ়ଶʹϩʔϧόοΫ͞Εͯ͠·͏ͨΊɺ ϩʔΧϧͱҟͳΔσΟϨΫτϦͱ͍ͯ͠Δ
ΞϓϦέʔγϣϯͷىಈ (։ൃɾຊ൪) # ىಈ͢Δ (։ൃ) 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
։ൃɾຊ൪ͰґଘؔΛؚΊͨΞϓϦέʔγϣϯ ͷΠϝʔδΛ୯ʹىಈ͢Δ͚ͩʹͳΓ·͢ɻ͜ͷΠ ϝʔδJenkinsCircleCIͳͲɺCIڥͰdocker build͠ɺ։ൃɾຊ൪͔ΒΞΫηεՄೳͳϨδε τϦdocker push͓͖ͯ͠·͢ɻ ։ൃɾຊ൪Ϗϧυͨ͠DockerΠϝʔδΛ pull ͠ ͯىಈ͢Δ͚ͩͰσϓϩΠ͕ྃ͢ΔͨΊɺ։ൃ
ڥͰಈ࡞֬ೝͨ͠ΠϝʔδΛͦͷ··ຊ൪࣋ͬͯ ͍͘͜ͱՄೳͱͳΓɺ΄΅ڥࠩҟͷͳ͍ಈ࡞Λ ظͰ͖·͢ɻ
ڥ͝ͱͷґଘؔͷཧͱσϓϩΠͷ·ͱΊ ɾDockerΛ֤ͬͯڥΛཧ͢Δ߹ɺ౷ׅ͢ΔϓϩδΣΫτΛ࡞ ͠ɺͦ͜Ͱڥผͷdocker-compose.ymlͱϛυϧΣΞͷઃఆϑΝΠϧ Λཧ͢Δͱɺશڥͷཧ͓Αͼ։ൃ͕͘͢͠ͳΔ ɾϩʔΧϧڥϗετଆʹιʔεϑΝΠϧɺґଘؔΛஔ͠ɺͦΕ ΒΛϚϯτͯ͠ΞϓϦέʔγϣϯΛىಈ͢Δ͜ͱͰɺमਖ਼ͱ֬ೝ Λ͘͢͢͠Δ ɾ։ൃɾຊ൪ґଘؔͱιʔεΛ1ͭʹ·ͱΊͨDockerΠϝʔδΛϏϧ υˍσϓϩΠ͢Δ͜ͱͰσϓϩΠΛ؆ܿʹͭͭ͠ɺΞϓϦέʔγϣϯͷ ڥࠩҟΛ΄΅θϩʹͰ͖Δ
͓·͚-01. Dockerʹ͓͚ΔΞϯνύλʔ ϯͱରԠࡦ
࠷ޙʹɺࢲ͕ࠓ·Ͱ։ൃݱ Ͱ࣮ࡍʹૺ۰ͯ͠དྷͨ DockerͷΞϯνύλʔϯ ͱͦͷରԠࡦʹ͍ͭͯհ ͠·͢ɻ
Ξϯνύλʔϯ-01. ڊେ͗͢ΔDockerΠϝʔδ
DockerΛ͍࢝ΊͨϓϩδΣΫτA͞Μͷྫ ɾDockerͷϏϧυ͕30Ҏ্͔͔Δ ɾԿ͔ͱࢥͬͯௐͯΈΔͱDockerΠϝʔδͷ αΠζ͕2GBΛ͍͑ͯΔʢʂʣ ɾ͜ΕͰεέʔϧͮ͠Β͍͠ɺϙʔλϏϦ ςΟʹ΄Ͳԕ͍ ɾͦͦͳΜͰ2GBҎ্ͷαΠζʹͳͬͨͷ ͔
DockerΛ͍࢝ΊͨϓϩδΣΫτA͞Μͷצҧ͍ ɾࠓ·ͰVagrant͔Γ͍ͬͯͨͷͰDockerΛ ԾڥͷΑ͏ͳͷͱצҧ͍͍ͯͨ͠ ɾͦͷͨΊɺ1ͭͷΠϝʔδʹϛυϧΣΞશͯ ͱΞϓϦέʔγϣϯΛશ෦ೖΕͯ͠·͍ͬͯͨ ɾ͞ΒʹԿނ͔ຖճιʔε͔ΒϏϧυ͓ͯ͠ ΓɺDockerͷϏϧυ͕30Ҏ্͔͔͍ͬͯͨ
DockerΛ͍࢝ΊͨϓϩδΣΫτA͞ΜͷରԠࡦ 1. ϛυϧΣΞ͝ͱɺΞϓϦέʔγϣϯ͝ͱʹ DockerΠϝʔδׂ͢Δ 2. ϛυϧΣΞΛιʔε͔ΒϏϧυ͢ΔΑ͏ͳ ຖճ݁Ռ͕ಉ͡ʹͳΔΑ͏ͳ߹༧ΊϏϧυ ͨ͠ͷผΠϝʔδԽ͓͖ͯ͠ɺFROMͷϕʔε Πϝʔδͱͯ͠ࢦఆ͢ΔΑ͏ʹDockerfileΛॻ͘
Ξϯνύλʔϯ-02. ΞΧϯτใΛΠϝʔδ ʹอଘͯ͠͠·͏
DockerΛ͍࢝ΊͨϓϩδΣΫτA͞Μͷྫ̎ ɾ࡞ͨ͠DockerΠϝʔδΛಛʹύϥϝʔλΛࢦఆͤͣ ىಈ͢ΔͱಛఆͷRDSS3ଓ͢ΔΑ͏ʹͳ͍ͬͯͨ ɾԿ͔ͱࢥͬͯௐͯΈΔͱDBͷଓใAWSͷ IAMΞΧϯτͷΫϨσϯγϟϧใ(ΞΫηεΩʔγ ʔΫϨοτΩʔ)·Ͱ͕Πϝʔδʹแ͞Ε͍ͯͨ ɾ͜ΕͰηΩϡϦςΟతʹΑΖ͘͠ͳ͍͠ɺଓઌ͕ ݻఆʹͳ͍֤ͬͯͯڥͰΠϝʔδΛ͍·Θ͢͜ͱ ͕Ͱ͖ͳ͍
DockerΛ͍࢝ΊͨϓϩδΣΫτA͞ΜͷରԠࡦ 1. DockerΠϝʔδʹDBଓઌΫϨσϯγϟϧ ใแ͠ͳ͍ɻDockerΠϝʔδىಈ࣌ʹڥมͱ ͯ͢͠ 2. Ͳ͏ͯ͠ڥม͕ಡΈࠐΊͳ͍ઃఆϑΝΠϧͳ Ͳͷ߹ɺgettextʹଐ͍ͯ͠Δ envsubst ίϚϯυΛ
༻ͯ͠ઃఆϑΝΠϧʹهड़͞ΕͨڥมΛஔ͖ ͑ΔΑ͏ʹ͢Δ 3. ڥมͷཧ direnv Λ͏ͱศར
͜ΕΛػʹɺDockerʹ· ͩ৮Ε͍ͯͳ͍ํੋඇಋ ೖΛݕ౼ͯ͠ΈΔ͜ͱΛΦ εεϝ͍ͨ͠·͢ɻ
Thanks! ͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠