Docker ãã£ããã³ã¯ãéçºè ã³ãã¥ããã£ã®ãªãŒããŒã§ãããããããã®åéã®å°éå®¶ã§ãããDocker ã®ç¥èãä»ã®äººãšå ±æããããšã«æ ç±ã泚ãã§ããŸãããFrom the Captain's Chairãã¯ããããã£ããã³ã詳ããèŠãŠã圌ããšãã®çµéšã«ã€ããŠè©³ããç¥ãããã°ã·ãªãŒãºã§ãã
æ¬æ¥ã¯ã€ãŒãŽãªã»ã¢ã¬ã¯ãµã³ãããã«ã€ã³ã¿ãã¥ãŒããŸããã€ãŽãŒã«ã¯ãã¥ãŒãšãŒã¯åžã«æ ç¹ã眮ãRuby on RailséçºãšãŒãžã§ã³ã·ãŒJetRocketsã®CTOå Œå ±ååµèšè ã§ããã200820幎以äžã®ãœãããŠã§ã¢ãšã³ãžãã¢ãªã³ã°çµéšãšRailsãšã³ã·ã¹ãã ãžã®æ·±ãã³ãããã¡ã³ããæã£ãŠããŸãã圌ã¯Crystalããã°ã©ãã³ã°èšèªãKamalãªã©ã®ãããžã§ã¯ãã«ãªãŒãã³ãœãŒã¹ã§è²¢ç®ããŠãããã³ã³ãããªãŒã±ã¹ãã¬ãŒã·ã§ã³ããReactããHotwireãžã®ç§»è¡ãŸã§ãããŸããŸãªããŒãã§å°éç¥èãå ±æãã宿çãªã«ã³ãã¡ã¬ã³ã¹ã¹ããŒã«ãŒã§ãã
Dockerã«é¢ãã£ããã£ãããæããŠããã ããŸãã?ãªãDockerãã£ããã³ã«ãªãããšæã£ãã®ã§ãã?
Dockerãã£ããã³ã«ãªããŸã§ã®éã®ããæ¯ãè¿ããšããã¹ãŠã¯å€ãã®RailsããŒã ãçŽé¢ããéåžžã«å®çšçãªåé¡ãããªãã¡äŸåå°çããå§ãŸããŸãããÂ
2018幎ãŸã§ã«ãJetRocketsã¯é·å¹Žã«ãããRuby on Railsã¢ããªã±ãŒã·ã§ã³ã®éçºãè¡ã£ãŠããŸãããç§ã¯ããŒãžã§ã³2ããRailsã䜿ã£ãŠããŸããã22009幎ã«å ¥ãããã£ãããšããéçºæ £è¡ã確ç«ããŠããŸãããããããããŒã ãå¢ãããããžã§ã¯ããè€éã«ãªãã«ã€ããŠãåããã©ã¹ãã¬ãŒã·ã§ã³ã®æºãŸãåé¡ã«äœåºŠãçŽé¢ããŸãã:
- ãèªåã®ãã·ã³ã§åãããšããèšèã¯ããããã€ã¡ã³ãäžã«ããŸãã«ããã䜿ããããã¬ãŒãºãšãªããŸãã
- æ°ããéçºè ç°å¢ã®æ§ç¯ã¯æéãããããããŒãžã§ã³ã®äžäžèŽãå€ãã£ã
- ç§ãã¡ã®ã¹ããŒãžã³ã°ãå¶äœç°å¢ã¯ãæåãå°œãããŠãææç°ãªãæåãåãããšããããŸãã
- ç°ãªããããžã§ã¯ãéã®ã·ã¹ãã ã¬ãã«ã®äŸåé¢ä¿ã®ç®¡çã¯ãŸããŸãè€éã«ãªã£ãŠããŸãã
éçºãã¹ããŒãžã³ã°ãæ¬çªç°å¢ãäžè²«ããŠç®¡çã§ãããã¢ããªã±ãŒã·ã§ã³äŸåé¢ä¿ãçµ±äžããæ¹æ³ãå¿ èŠã§ããã
å€ãã®ããŒã ãããŒã«ã«ã§Dockerã䜿ãå§ããŠåŸã ã«æ¬çªç°å¢ã«ç§»è¡ããã®ã«å¯Ÿããç§ãã¡ã¯ãŸãDockerãæ¬çªç°å¢ãšã¹ããŒãžã³ã°ã§å®è£ ããããšã«ããŸãããããã¯ãªã¹ã¯ã«èããããããããŸããããçã®ç°å¢å¹³çãéæãããšããç§ãã¡ã®ç®æšãšå®å šã«äžèŽããŠããŸããã
ç§ãã¡ã¯æåã®Railsã¢ããªã±ãŒã·ã§ã³ãã³ã³ããåããæåã®Dockerfileã®äœæãå§ããŸãããåæã®Dockerfileã¯ã仿¥ç§ãã¡ãäœãé«åºŠã«æé©åããããã®ãããã£ãšã·ã³ãã«ã§ããããç§ãã¡ã®æ ¹æ¬çãªåé¡ã解決ããŸãããã€ãŸãããã¹ãŠã®ç°å¢ãåãã³ã³ãããšåãäŸåé¢ä¿ã§åãããã«ãªã£ãã®ã§ãã
AWS Beanstalkã¯éçºè ã«åªãããœãªã¥ãŒã·ã§ã³ã§ã¯ãªãã£ããã®ã®ãç®æšã¯éæãããŸãããçã®ç°å¢äžè²«æ§ãå®çŸããç°å¢éã§ç°ãªãæ§æã管çããã¡ã³ã¿ã«ãªãŒããŒãããã¯ã»ãŒæ¶ãå»ããŸããã
2018幎ã«Dockerãæ¡çšããããšããã£ãããšãªããæçµçã«ã¯Dockerãã£ããã³ã«ãªãéãæ©ã¿å§ããŸãããäŸåé¢ä¿ç®¡çã®åçŽãªããŒãºããå§ãŸããã³ã³ããæé©åã®æ·±ãå°éç¥èãKamalã®ãããªããŒã«ãçšããé«åºŠãªå±éæŠç¥ããããŠæçµçã«ã¯Dockerã³ãã¥ããã£ãžã®è²¢ç®ãžãšçºå±ããŸããã
仿¥ã¯ãç»åã¹ãªãã³ã°æè¡ããé«åºŠãªCI/CDãã€ãã©ã€ã³ãŸã§ãRailsã³ã³ããåã®ãã¹ããã©ã¯ãã£ã¹ã«ã€ããŠè©³ããå·çããŠããŸãããããããã¹ãŠã¯ 2019 幎ã«Dockerã§äŸåé¢ä¿ã®åé¡ã解決ããããšæ±ºããç¬éã«é¡ããŸãã
æ¥å¹Žã®å人çãªç®æšã¯äœã§ãã?
ãããŸã§å¹ã£ãŠããå°éç¥èãããã£ãšå€ãã®äŒè°ãããŒãã¢ããã§è©±ããããšæã£ãŠããŸããã¢ãã©ã³ã¿å°åã«äœãã§ããã®ã§ãå°å ã®ããã¯ã³ãã¥ããã£ã«ãã£ãšæº¶ã蟌ã¿ãããšæã£ãŠããŸããã¢ãã©ã³ã¿ã«ã¯æŽ»æ°ããITã·ãŒã³ããããããã§è²¢ç®ã§ããæ¬åœã®ãã£ã³ã¹ããããšæããŸããDockerã®ããŒãã¢ãããäŒç»ããããRailsã°ã«ãŒãã«åå ããããåããããªèª²é¡ã«çŽé¢ããŠããä»ã®CTOãæè¡ãªãŒããŒãšã€ãªãã£ããããŸãã
ããããªãããã¯ãããžãŒæ¥çã§åããŠãããã代ããã«äœãããŠããŸããã?
ããæè¡ç³»ã§åããŠããªããã°ãæšå·¥ãããŠãããšæããŸããæã§äœããäœãããšã«æ·±ãæºè¶³æããããæšå·¥ã¯ç§ãããã°ã©ãã³ã°ã«æ¹ãããåµé çãªåé¡è§£æ±ºåãæäŸããŠãããŸãããã ããã³ãŒãã§ã¯ãªãèªç¶çŽ æãäŒçµ±çãªéå ·ã䜿ã£ãŠäœæ¥ããã®ã§ãã
æã䜿ã£ãŠäœæ¥ããåªåã®å ·äœçãªææãèŠãã®ãæ¬åœã«æ¥œããã§ããå€ãã®ç¹ã§ããœãããŠã§ã¢äœããšå®¶å ·äœãã¯ããã»ã©éããŸãããåææã䜿ããè·äººæãšçްéšãžã®ãã ãããå¿çšããæ©èœçã§çŸãããã®ãäœãåºããŠããã®ã§ãã
æšå·¥ã§ãªããã°ããããããã€ãã³ã°ãç®æãã§ããããç§ã¯ãã§ã«PADIèªå®ã®ã¬ã¹ãã¥ãŒãã€ããŒã§ãæ¬åœã«æµ·ã奜ãã§ããæ°Žäžã®äžçã«ã¯ç§ãã¡ã®ããžã¿ã«ç掻ãšã¯ãŸã£ããç°ãªãäœãããããŸããå¹³åã§ææŠçã§ãåžžã«é©ãããããããŸãããã€ãã³ã°ã€ã³ã¹ãã©ã¯ã¿ãŒã®è³æ ŒãååŸããä»ã®äººãæ°Žäžã®äžçãçºèŠããæå©ããããããšã¯ãéåžžã«ããããã®ããããšã§ãããã
Dockerã³ãã¥ããã£ãšã®ã³ã©ãã¬ãŒã·ã§ã³ã§æãåºã«æ®ãã¹ããŒãªãŒãå ±æã§ããŸãã?
Docker CaptainãšããŠæãããããã®ããç¹ã®äžã€ã¯ã宿çãªãã£ããã³äŒè°ã§ãæ£çŽãªãšãããç§ã¯ãã®äžåäžã€ã楜ããã§ããŸãããããã¯åãªãäŒæ¥ããŒãã£ã³ã°ã§ã¯ãªããã³ã³ããååéã§æãæ ç±çã§ç¥èè±å¯ãªäººã ãšã®æ¬ç©ã®ã³ã©ãã¬ãŒã·ã§ã³ã§ãã
ãããã®äŒè°ãç¹å¥ãªã®ã¯ã倿§ãªèŠç¹ãããããšã§ãããã£ããã³ãã¡ã¯ãŸã£ããç°ãªãããã¯ã°ã©ãŠã³ããæã£ãŠããŸãããšã³ã¿ãŒãã©ã€ãºKubernetesã®ãããã€ã«ç¹åããŠãã人ãããã°ãAIã«æºãã人ãç§ã®ããã«Railsã¢ããªã±ãŒã·ã§ã³ã®æé©åãããéçºè ããããŠç§ãèããããšããªãã£ãåé¡ã解決ãã人ãã¡ãããŸãã
çŸåšãæ°ã«å ¥ãã®Docker補åãæ©èœã¯äœã§ããããããŠãã®çç±ã¯äœã§ãã?
æè¿VS Codeã«çµ±åããããã«ããããã°æ©èœã«ãšãŠãã¯ã¯ã¯ã¯ããŠããŸããRails Dockerãã¡ã€ã«ã®æé©åãã³ã³ããåã®ãã¹ããã©ã¯ãã£ã¹ã«ã€ããŠæžãããšã«å€ãã®æéãè²»ããç§ã«ãšã£ãŠããã®æ©èœã¯ç§ã®éçºã¯ãŒã¯ãããŒã«ãšã£ãŠå€§ããªè»¢æ©ãšãªããŸããã
Railsã¢ããªã±ãŒã·ã§ã³åãã«è€éãªãã«ãã¹ããŒãžãã«ããäœæããéãç¹ã«ç»åãµã€ãºã®æé©åããã«ããã£ãã·ã¥ã®ç®¡çãNode.jsãRubyãžã§ã ã®ãããªäŸåé¢ä¿ã®åŠçãèããéããã«ã倱æã®ãããã°ã¯ãã€ãŠæ¬åœã«é¢åã§ããã
æè¿è§£æ±ºããããªãããŒãªæè¡ç課é¡ã«ã€ããŠæããŠããã ããŸãã?
æè¿ãå€ãã®Railséçºè ãå ±æã§ãããšæãéåžžã«ãã©ã¹ãã¬ãŒã·ã§ã³ã®æºãŸãéçºã¯ãŒã¯ãããŒã®åé¡ã«çŽé¢ããŸãããçŽ 1504GBã®å€§ããªããŒã¿ããŒã¹ãã³ããã¡ã€ã«ãããããããããŒã«ã«éçºã®ãã³ãã¬ãŒããšããŠäœ¿ãå¿ èŠããããŸãããåé¡ã¯ããã®SQLãã³ããPostgreSQLã«åŸ©å ããã®ã«ãéçºããŒã¿ããŒã¹ãã¯ãªãŒã³ç¶æ ã«ãªã»ãããããã³ã«æå€§1æéãããã£ãŠããããšã§ãã
éçºããŒã ã«ãšã£ãŠãããã¯çç£æ§ã倧ããæãªã£ãŠããã誰ããç§»è¡ããŒã«ããã¯ããã¹ãããããããŒã¿åºæã®åé¡ããããã°ããããæåããããçŽããããããã³ã«ãããŒã¿ããŒã¹ã®åŸ©å ã«1æéåŸ ããªããã°ãªããŸããã§ãããããã¯å šãåãå ¥ããããŸããã
åœåã¯ãã»ãšãã©ã®ããŒã ããã£ãŠããããšãã€ãŸãSQLãã³ããã¡ã€ã«ã«å¯ŸããŠçŽæ¥ pg_restore ãå®è¡ãããšããæ¹æ³ã§ãããããã 150GBã®ããŒã¿ããŒã¹ã§ã¯ãPostgreSQLããã³ãå
šäœãè§£æããæ°åã®INSERTæãå®è¡ããã€ã³ããã¯ã¹ãåæ§ç¯ããããŒãã«çµ±èšãæŽæ°ããŸããããŒã¿ããŒã¹ãšã³ãžã³ãå®éã®äœæ¥ãããªããã°ãªããªããããæ¬è³ªçã«é
ãã®ã§ãã
ããã«ããã¯ã¯ããŒã¿èªäœã§ã¯ãªããããŒã¿ããŒã¹ã®åŸ©å ããã»ã¹ã«ããããšã«æ°ã¥ããŸãããããã§ç§ã¯å šãç°ãªãã¢ãããŒããåã£ãBashã®èæ¬ãæžããŸãã:
- ãã³ãã¬ãŒãããªã¥ãŒã ãäœæãã:æ°ããDockerããªã¥ãŒã ããå§ããPostgreSQLã³ã³ãããç«ã¡äžããŸã
- äžåºŠããã®åŸ©å :SQLãã³ãããã®ãã³ãã¬ãŒãããŒã¿ããŒã¹ã«åŸ©å ããŸã(ããã1æéããããŸãããäžåºŠã ãã§ã)
- ããªã¥ãŒã ã¹ãããã·ã§ãã:BusyBoxã³ã³ããã䜿ã£ãŠãã¡ã€ã«ã·ã¹ãã ã¬ãã«ã§ããŒã¿ããŒã¹å šäœã®ããªã¥ãŒã ãã³ããŒããŸã
- 峿ãªã»ãã:éçºè ãæ°ããããŒã¿ããŒã¹ãå¿ èŠãšãããšãã¯ããã³ãã¬ãŒãããªã¥ãŒã ãæ°ããäœæ¥ããªã¥ãŒã ã«ã³ããŒããã ãã§ã
éæ³ã¯ã¹ããã 4ã«ãããŸããSQLãã埩å ãã代ããã«ãåºæ¬çã«Dockerããªã¥ãŒã ã¬ãã«ã§ãã¡ã€ã«ãã³ããŒããŠããŸããããã¯1æéã§ã¯ãªãæ°ç§ã§æžã¿ãŸãããªããªãããã§ã«åŠçæžã¿ã®PostgreSQLããŒã¿ãã¡ã€ã«ãã³ããŒããã ãã ããã§ãã
Dockerããªã¥ãŒã ã¯ãå éšã«ã¯ãã¡ã€ã«ã·ã¹ãã ã®ãã£ã¬ã¯ããªã®ãããªãã®ã§ããPostgreSQLã¯éåžžã«ç¹å®ã®ãã£ã¬ã¯ããªæ§é ã«ããŒã¿ãä¿åããããŒã¿ãã¡ã€ã«ãã€ã³ããã¯ã¹ãã¡ã¿ããŒã¿ãå«ã¿ãŸããããªã¥ãŒã å šäœãã³ããŒããããšã§ãããŒã¿ããŒã¹ã®ãäœ¿çšæºåå®äºãç¶æ ã®å®ç§ãªã¹ãããã·ã§ãããåŸãããŸãã
ã¹ã¯ãªããã¯ãã¹ãŠã®ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ãæ åœããããªã¥ãŒã ã®äœæãã³ã³ããã®ã©ã€ããµã€ã¯ã«ç®¡çãã³ããŒããããŒã¿ããŒã¹ã®ã¯ãªãŒã³ãªèµ·åã確å®ã«ããŸãããã€ãŠã¯1æéã®ãªã»ãããµã€ã¯ã«ã ã£ãã®ããä»ã§ã¯æåéã 5ç§ãã€ãŸã10 ç§ã«ççž®ãããŠããŸããéçºè ã¯èªç±ã«å®éšããç Žå£çãªæäœããã¹ãããç°å¢ãããããããšãªããªã»ããã§ããŸããç§ãã¡ã®ããŒã ã®ããŒã¿ããŒã¹äŸåéçºãžã®ã¢ãããŒãã倧ããå€ãããŸããã
ãã¹ãŠã®éçºè ã«ç¥ã£ãŠãããŠã»ããDockerã®ãã³ãã¯äœã§ãã?
ããDockerfileã§äœãå€ãªæããããããããã¯ééã£ãããæ¹ã§ããããã¯ãç§ãé·å¹ŽRails Dockerfileãæé©åããŠåŠãã æãéèŠãªæèšã§ããä»ã®éçºè ã®ã³ã³ããèšå®ãèŠçŽããšãè€éãªRUNã³ãã³ããå¥åŠãªã³ããŒãã¿ãŒã³ããããã¯éåæã®ããåé¿çãããç®ã«ããŸãã
Dockerfileã¯ããã¡ããšããè«ççãªæç€ºã®ããã«èªããã¹ãã§ããããèªåããããªæãã§æžããã:
RUN apt-get update && apt-get install -y wget && \
wget some-random-script.sh && chmod +x some-random-script.sh && \
./some-random-script.sh && rm some-random-script.sh
âŠããããããªãã¯ããæ¹ãééã£ãŠããã§ãããã
æé«ã®Dockerfileã¯ããã®ã·ã³ãã«ããšæå¿«ããã»ãšãã©éå±ã«æããããŸãããã¹ãŠã®ã»ãªãã«ã¯æç¢ºãªç®çããããå šäœã®æµãã¯èªã人ã«ãšã£ãŠæå³ãéããã¹ãã§ããããå¥åŠãªããã¯ãç°åžžãªãã¡ã€ã«æš©éãè€éãªã·ã§ã«äœæãå ããŠãããªããäžæ©åŒããŠçç±ãèããŠã¿ãŠãã ããã
ãã®ååã®ãããã§ããããã°ã«ãããæéãç¡æ°ã«çããŸãããçããããšãããŸãæ©èœãããããšããã®ã§ã¯ãªããã¢ãããŒããåèšèšããããšãåŠã³ãŸãããéåžžãããªããç®æããŠããããšãéæããã«ã¯ãããã¯ãªãŒã³ã§æšæºçãªæ¹æ³ããããŸãã
å®ç掻ã§éæè¡çãªãªããžã§ã¯ããã³ã³ããåã§ãããšããããããã¯äœã§ããããããããŠãã®çç±ã¯äœã§ãã?
ããéæè¡çãªãªããžã§ã¯ããã³ã³ããåã§ãããšããããããã¯ééããªãç¥èãã®ãã®ã§ããã¹ãã«ãçµéšãå°éç¥èãæºåž¯å¯èœãªã³ã³ããã«ãŸãšããŠãå¿ èŠã«å¿ããŠå¿ããåãåºããããšãæ³åããŠã¿ãŠãã ãããåžžã«æ°ããæè¡ãåŠã³ãä»è ã«æããŠããè ãšããŠãç§ãã¡ãã©ã®ããã«ç¥èãç²åŸãã移転ããŠããã®ãã«éåžžã«èå³ãæã£ãŠããŸããçŸåšãCrystalã®ããã«æ°ããããã°ã©ãã³ã°èšèªã«æ·±ãåãçµã¿ããå ŽåããKamalã®ãããªãããã€ã¡ã³ãããŒã«ãç¿åŸãããå Žåãæ°ã¶æã®éäžçãªåŠç¿ãšç·Žç¿ãå¿ èŠã§ãã
ããããããç¥èãDockerã³ã³ããã®ããã«æ©èœãããã©ãã§ãããã?ãã«ã㌠3ãæãŠããããããŸããã3 æè¡ãã³ã³ããããé«åºŠãªKubernetesãã³ã³ããããããã¯ãæšå·¥æ¥åæè¡ãã³ã³ãããªã©ããããŸããè€éãªRailsã¢ããªã±ãŒã·ã§ã³ããããã°ããå¿ èŠãããã§ãã?ã³ã³ãããç©ã¿èŸŒãããã€ãã³ã°èªå®ã³ãŒã¹ã®åè¬äžã§ãã?æµ·æŽçç©åŠã®ç¥èããŒã¹ã眮ãæããŸãããã
æ¬åœã®åã¯äžè²«æ§ãšç§»æ€æ§ã«ãããŸããDockerã³ã³ãããã¢ããªã±ãŒã·ã§ã³ãã©ãã§ãåãããã«åããããã«ãç¥èã³ã³ããã¯æèã«é¢ä¿ãªãåãæ·±ãçè§£ãæäŸããŸããããæ§æãå¿ããããäœå¹Žãåã«ç¿ã£ããããã°ã®æè¡ãæãåºãããšèŠåŽãããã¯ããŸããã
ããã«ãã³ã©ãã¬ãŒã·ã§ã³ã®å¯èœæ§ãæ³åããŠã¿ãŠãã ãããçµéšè±å¯ãªéçºè ã¯ãèªåã®èŠåŽããŠåŸãå°éç¥èãæåéããŸãšããŠã³ãã¥ããã£ãšå ±æããããšãã§ããŸããDockerããããã€ã¡ã³ããæ°äž»åããã®ãšåãããã«ãåŠç¿ã®æ°äž»åãæãéããã§ãããã
ãã¡ããã人éã®åŠã³ãšæé·ã®çµéšã¯å€±ãããŸãããçŽç²ãªå¹çã®èгç¹ããã¯?ããã¯ä¿¡ããããªãããšã§ãã
ãªã³ã©ã€ã³ã§ã©ãã§ããªããèŠã€ããããŸãã?(è¬æŒãããã°æçš¿ããªãŒãã³ãœãŒã¹ãããžã§ã¯ããªã©)
ç§ã¯X(@igor_alexandrov)ã LinkedInã§åžžã«æŽ»åããŠããŸããæ¯å¹Žå°ãªããšã23ã®ããã¯ã«ã³ãã¡ã¬ã³ã¹ãããŒãã¢ããã§è¬æŒãå¿ãããŠããããã以å€ã«ãå人ããã°ãéå¶ããŠããŸãã
ã©ããããã¡ã€ã¢ã®è³ªå
ç«ãç¬ã?
ã€ã
æå人éãå€å人éã?
äž¡æ¹ãšã
奜ããªãããšããé£ã¹ç©ã¯?
é€å
å人ãããªãã衚ãèšèãäžèšã§è¡šçŸããŸãã?
å®ç§äž»çŸ©è
æè¿å§ããè¶£å³ã¯?
ãµã€ã¯ãªã³ã°