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
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
11k
フロントエンドデザイン・開発におけるマークアップ設計の基礎 / frontend markup design basics
kkoudev
4
2.9k
Other Decks in Programming
See All in Programming
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
13k
The ROI of Quarkus for Spring Boot Applications
hollycummins
0
120
依存関係から依存物へ―Dependencyという言葉の歴史をひも解く
j_lee
0
120
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
6
370
肥大化するレガシーコードに立ち向かうためのインターフェース分離と依存の逆転 / JJUG CCC 2026 Spring
hirokunimaeta
0
580
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
160
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
14
5.7k
技術記事、 専門家としてのプログラマ、 言語化
mizchi
13
6.3k
ADKを使って簡単にAIエージェントを作ってみよう
k1mu21
0
270
ふつうのFeature Flag実践入門
irof
8
4.1k
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
350k
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
210
Featured
See All Featured
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
240
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
400
Git: the NoSQL Database
bkeepers
PRO
432
67k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
200
Chasing Engaging Ingredients in Design
codingconduct
0
220
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
170
Discover your Explorer Soul
emna__ayadi
2
1.1k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
620
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.3k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
The Language of Interfaces
destraynor
162
27k
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! ͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠