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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Kou
February 03, 2018
Programming
360
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
AI時代、エンジニアはどう育つのか -未経験エンジニアの成長を間近で見て考えたこと-
thasu0123
0
110
霧の中の代数的エフェクト
funnyycat
1
390
광주소프트웨어마이스터고등학교 DevFest 특강 - 바이브 코딩 시대에서 주니어 개발자로 살아남는 방법
utilforever
1
130
分散システム、なんですぐ死んでしまうん?耐障害性を高めたいあなたのためのレジリエンスパターン入門
mshibuya
7
6.2k
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
850
共通化で考えるべきは、実装より公開する型だった
codeegg
0
240
Snowflake Summitでの新機能 CoCo / CoWork / snowflake-summit-2026-overall-what-new-coco
tatsuhiro
1
230
5分で問診!Composer セキュリティ健康診断
codmoninc
0
270
PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜
kashioka
0
450
エンジニアにデザインハーネスを 〜デザインプロセスを規定するためのハーネス〜 / Design harness from an engineer's perspective
rkaga
2
1.5k
AWS CDK を「作」ってみた 〜フルスクラッチで見えた CDK の裏側〜 / aws-cdk-from-scratch
gotok365
3
400
なぜ関数型プログラミングで「型」と「証明」が語られるのか #fp_matsuri
kajitack
3
930
Featured
See All Featured
The agentic SEO stack - context over prompts
schlessera
0
850
Building a Scalable Design System with Sketch
lauravandoore
463
34k
We Have a Design System, Now What?
morganepeng
55
8.2k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
360
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Tell your own story through comics
letsgokoyo
1
990
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
800
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
390
Rebuilding a faster, lazier Slack
samanthasiow
85
9.6k
Deep Space Network (abreviated)
tonyrice
0
230
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
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! ͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠