Dockerãš
Ansibleã®æè¡ã³ãã¥ããã£ã«ã¯éåžžã«å€ãã®é¢å¿ãå¯ããããŠããŸãããã®èšäºãèªãã åŸãããã®é¢å¿ãå
±æããŠãã ããã ãŸããRailsã¢ããªã±ãŒã·ã§ã³ã®ãµãŒããŒãšç°å¢ãã»ããã¢ããããéã«ãAnsibleãšDockerã®å®çšçãªã¢ããªã±ãŒã·ã§ã³ã®ã¹ãã«ãç¿åŸããŸãã
ãHerokuã䜿çšããã ãã§ã¯ã©ãã§ããïŒããšå°ããŸãã
ãŸã第äžã«ãDockerãšAnsibleã¯ããããããã¹ãã£ã³ã°ãããã€ããŒã®ãããããã·ã³ã§å®è¡ã§ããŸãã 第äºã«ãå©äŸ¿æ§ãããæè»æ§ã奜ã¿ãŸãã åæ§ã«ãWebã¢ããªã±ãŒã·ã§ã³ã ãã§ãªããäœã§ãå®è¡ã§ããŸãã ãããŠæåŸã«ãç§ã¯ç§ã®éã®äžã§å®éšè
ãªã®ã§ãããããã¹ãŠäžç·ã«æ©èœããæ¹æ³ãç解ããããšã楜ããã§ããŸãã Herokuã®åºæ¬çãªåºç€ã¯ãLinuxã³ã³ãããŒã§ãã åããã¯ãããžãŒãDockerã®äžæ žã«ãããŸãã å®éãDockerã®ã¢ãããŒã®1ã€ã¯ãã³ã³ãããŒåã¯æ°ããä»®æ³åã§ããã§ãã
ãªãAnsibleãªã®ãïŒ
Chefã4幎éç©æ¥µçã«äœ¿çšããåŸãã³ãŒããšããŠã®ã€ã³ãã©ã¹ãã©ã¯ãã£ã¯éåžžã«éå±ã«ãªããŸããã ã€ã³ãã©ã¹ãã©ã¯ãã£ã管çããã³ãŒãã«ããå€ãã®æéãè²»ãããŸããããã€ã³ãã©ã¹ãã©ã¯ãã£èªäœã«ã¯è²»ãããŠããŸããã ã©ããªå°ããªå€æŽã§ããããããªå©çã®ããã«å€ãã®åªåãå¿
èŠã«ãªããŸãã
Ansibleã§ã¯ãäžæ¹ã§ã€ã³ãã©ã¹ãã©ã¯ãã£ãèšè¿°ããããŒã¿ããããä»æ¹ã§ä»ã®ã³ã³ããŒãã³ãã®çžäºäœçšéã«å¶éããããŸãã ãã®ã¢ãã«ã¯ã¯ããã«åçŽã§ãã¯ããã«éã移åã§ãããããç§ã®ã€ã³ãã©ã¹ãã©ã¯ãã£ã®å®è¡å
容ã«éäžã§ããŸãã Unixã¢ãã«ãšåæ§ã«ãAnisibleã¯ãç¡éã®æ¹æ³ã§çµã¿åãããããšãã§ããåäžã®è²¬ä»»ã¢ãžã¥ãŒã«ãæäŸããŸãã
Ansibleã«ã¯PythonãšSSH以å€ã®äŸåé¢ä¿ã¯ãããŸããã 圌女ã¯ããªã¢ãŒããã·ã³ã«ãšãŒãžã§ã³ããã€ã³ã¹ããŒã«ããå¿
èŠã¯ãããŸãããäœæ¥åŸã«ãŽããæ®ããŸããã ããã«ãã¯ã©ãŠãã®ããã±ãŒãžãããŒãžã£ãŒããããŒã¿ããŒã¹ãŸã§ããã¹ãŠã管çããããã®ã¢ãžã¥ãŒã«ã®æšæºã©ã€ãã©ãªãä»å±ããŠããŸãã
ãªãDockerãªã®ãïŒ
Dockerã¯ãããã»ã¹ããã·ã³ã«ãããã€ããæãä¿¡é Œæ§ãé«ã䟿å©ãªæ¹æ³ãšããŠäœçœ®ä»ããŠããŸãã mysqldããredisãŸã§ãRailsã¢ããªã±ãŒã·ã§ã³ã§çµãããã®ã§ããã°äœã§ãããŸããŸããã gitã¹ãããã·ã§ããããã³ã³ãŒãé
åžãšåãå¹ççãªæ¹æ³ã§ãDockerã¯ããã»ã¹ã§ãåãããšãè¡ããŸãã ãã®ããã»ã¹ãå®è¡ãããã·ã³ã«é¢ä¿ãªãããã®ããã»ã¹ãéå§ããããã«å¿
èŠãªãã¹ãŠã®ãã®ãæäŸãããããšãä¿èšŒãããŸãã
Dockerã³ã³ãããšVMãæ¯èŒããäž»ãªããããç解ã§ããééãã å¯äžã®è²¬ä»»ã®ååãããã«é©çšãããŸã;ã³ã³ããããšã«1ã€ã®ããã»ã¹ãéå§ãããšãå€æŽå¯èœæ§ãšãµããŒããç°¡åã«ãªããŸãã ãã®ã¢ãã«ã¯ãUnixã®å²åŠã§æã®è©Šç·Žã«èããã¢ã¯ã·ã§ã³ã®åŒ·åºãªåºç€ãæäŸããŸãã
ã«ã¹ã¿ãã€ãº
ã¿ãŒããã«ãé¢ããããšãªããAWSãLinodeãRackspaceããŸãã¯DigitalOceanã®ããããã®ãã¹ãã£ã³ã°ãµãŒãã¹ã§Ansibleããã«ã¹ã¿ãã€ãºããããã·ã³ãååŸã§ããŸãã å
·äœçã«ã¯ãAnsibleã䜿çšããŠãAmsterdam 2ãªãŒãžã§ã³ã®DigitalOceanã«2 GBã®ã¡ã¢ãªãæã€æ°ããããããã¬ããã1å25ç§ã§äœæããŸãã ããã«1å50ç§éãDockerããã³ãã®ä»ã®èšå®ã§ã«ã¹ã¿ãã€ãºãããã·ã¹ãã ãååŸã§ããŸãã åºæ¬ã·ã¹ãã ãã§ããã®ã§ãã¢ããªã±ãŒã·ã§ã³ããããã€ã§ããŸãã ããã°ã©ãã³ã°èšèªãŸãã¯ããŒã¿ããŒã¹ãæ§æããªãã£ãããšã«æ³šæããŠãã ããã Dockerã¯ãããèªåã§åŠçããŸããã
Ansibleã¯ããªã¢ãŒããã·ã³äžã§SSHãä»ããŠãã¹ãŠã®ã³ãã³ããå®è¡ããŸãã ããŒã«ã«ssh-agentã«ããç§ã®SSHããŒã¯ãAnsible SSHã»ãã·ã§ã³ãéããŠãªã¢ãŒãã§å
±æãããŸãã ãªã¢ãŒããã·ã³ã§ãã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒããè€è£œãããããgitã§ã®èªèšŒã«ããŒã¿ãäžèŠãªå ŽåãããŒã«ã«ãã·ã³ãã転éãããssh-agentãèªèšŒã«äœ¿çšãããŸãã
Dockerãšã¢ããªã±ãŒã·ã§ã³ã®äŸåé¢ä¿
ã»ãšãã©ã®éçºè
ã¯ãã«ãŒãã«ã®ããŒãžã§ã³ãPythonã®ã¢ãžã¥ãŒã«ãRuby gemããŸãã¯ã¢ããªã±ãŒã·ã§ã³ã«å¿
èŠãªnode.jsã¢ãžã¥ãŒã«ãæ£ç¢ºã«ç€ºããŠããã®ã«é¢çœããšæããŸãããããŒã¿ããŒã¹ãµãŒããŒããã¥ãŒãµãŒããŒãªã©ã®éèŠãªããšã«ãªããšãããã䜿çšããŸãçŸæç¹ã§å©çšå¯èœãªãã®ã ããã
DevOpséåã®çç±ã®1ã€ã ãšæããŸããéçºè
ã¯ãã¢ããªã±ãŒã·ã§ã³ãå®è¡ããç°å¢ã«è²¬ä»»ãè² ããŸãã Dockerã¯ãæ¢åã®ãã©ã¯ãã£ã¹ã«å®çšæ§ãšèªä¿¡ãå°ãå ããããšã§ããã®ã¿ã¹ã¯ãããç°¡åã«ããŸãã
ç§ã®ã¢ããªã±ãŒã·ã§ã³ã¯ã
.docker_container_dependencies
ãã¡ã€ã«ãå«ãMySQL 5.5ãRedis 2.8ãªã©ã®ããã»ã¹ãžã®äŸåé¢ä¿ãå®çŸ©ããŠããŸã
gerhard/mysql:5.5 gerhard/redis:2.8
Ansibleãã¬ã€ããã¯ã¯ãã®ãã¡ã€ã«ãåç
§ããDockerã«ç»åã®ã€ã³ããã¯ã¹ããæ£ããç»åãååŸããŠã³ã³ãããŒãšããŠå®è¡ããããã«æ瀺ããŸãã ãŸãããããã®ã³ã³ããã¯ã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ããã«ãªã³ã¯ãããŠããŸãã ã³ã³ãããªã³ã¯ã®æäœã«é¢ãã詳现æ
å ±ãå¿
èŠãªå Žå
ã¯ãDocker 0.6.5ã®çºè¡šãã芧ãã ãããç§ã®ã¢ããªã±ãŒã·ã§ã³ã«ã¯ãRuby Dockerã€ã¡ãŒãžã«åºæã®Dockerfileãä»å±ããŠããŸãã ã€ã¡ãŒãžãã€ã³ã¹ããŒã«ããããšãDockerfileã®æé ã«ãããæ£ããããŒãžã§ã³ã®Rubyãã€ã³ã¹ããŒã«ãããŸãã
FROM howareyou/ruby:2.0.0-p353 ADD ./ /terrabox RUN \ . /.profile ;\ rm -fr /terrabox/.git ;\ cd /terrabox ;\ bundle install --local ;\ echo '. /.profile && cd /terrabox && RAILS_ENV=test bundle exec rake db:create db:migrate && bundle exec rspec' > /test-terrabox ;\ echo '. /.profile && cd /terrabox && export RAILS_ENV=production && rake db:create db:migrate && bundle exec unicorn -c config/unicorn.rails.conf.rb' > /run-terrabox ;\
æåã®ã¹ãããã¯ãã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãŠã®ã³ãŒããDockerã€ã¡ãŒãžã«ã³ããŒããåã®ã€ã¡ãŒãžã«ãã£ãŠè¿œå ãããã°ããŒãã«ç°å¢å€æ°ãããŒãããããšã§ãã ããšãã°ãRuby Dockerã€ã¡ãŒãžã¯ãã¹ãPATHã«è¿œå ããŠãæ£ããããŒãžã§ã³ã®Rubyãæ£ããããŒãããŸãã
次ã«ããã®ã³ã³ããã¹ãã§ã¯å¿
èŠãªããããgitå±¥æŽãåé€ããŸãã ãã¹ãŠã®gemãã€ã³ã¹ããŒã«ããŠããããã¹ãå°çšã«å®è¡ããã/ test-terraboxãã¡ã€ã«ãäœæããŸãã ãã®ãã¹ãŠã®ç®çã¯ãã¢ããªã±ãŒã·ã§ã³ãšãã®ãã¹ãŠã®äŸåé¢ä¿ããã§ãã¯ãããã«ããªã¢ãããŒãžã§ã³ãçšæããã¢ããªã±ãŒã·ã§ã³ãå®éã«èµ·åããåã«ããã¹ãŠã®Dockerã³ã³ãããæ£ãããªã³ã¯ããããã¹ãŠã®ãã¹ããæ£åžžã«åæ Œããããšã§ãã
æ°ããã³ã³ããã®èµ·åæã«åŒã³åºãããã³ãã³ãã¯ãCMDã¹ãããã§å®çŸ©ãããŸãã
start / run-terraboxã³ãã³ãã¯ããã¹ãå®è¡ããã»ã¹ã®çŽåŸã«ããã«ãããã»ã¹ã®äžéšãšããŠå®çŸ©ãããŸãã
Dockerfileã®æåŸã®åœä»€ã¯ãããŒã3000ãDockerã³ã³ãããŒå
ããDockerãå®è¡ãããŠãããã¹ããã·ã³ã«è»¢éããŸãã ãµãŒããŒãŸãã¯ããŒããã©ã³ãµãŒãã³ã³ããã¢ããªã±ãŒã·ã§ã³ãžã®ãªã¯ãšã¹ãããããã·ããããã«äœ¿çšã§ãããã®ã
Dockerã³ã³ãããŒå
ã§Railsã¢ããªã±ãŒã·ã§ã³ãå®è¡ãã
çŽ100åã®gemãšå€ãã®çµ±åãã¹ããRailsã®äžããå®è¡ãããå¹³åçãªRailsã¢ããªã±ãŒã·ã§ã³ã®å ŽåãããŒã«ã«Dockerã€ã¡ãŒãžãªãã§2GBãš2åºã®åååãã·ã³ã§å®è¡ããã«ã¯8å16ç§ããããŸãã ãã®ãã·ã³ã«ãã§ã«RubyãMysqlãããã³Redisã®ã€ã¡ãŒãžãããå Žåã4å45ç§ããããŸãã ããã«ãã¢ããªã±ãŒã·ã§ã³ã®åç
§ã€ã¡ãŒãžãæ¢ã«ããå Žåã2å23ç§ããããŸãã é è¿æ³ã§èŠããšãMySQLãRedisãªã©ã®äŸåé¢ä¿ãå«ãæ°ããRailsã¢ããªã±ãŒã·ã§ã³ã®ãããã€ã«ã¯2åããããããŸããã
ãŸããã¢ããªã±ãŒã·ã§ã³ã®å±éã«ã¯ããšã³ãããŒãšã³ãã§1åããããã¹ãŠã®ãã¹ãã®èµ·åãå«ãŸããããšã«ã泚æããŠãã ããã
èªåŒµããããšãªããDockerã¯ç¶ç¶çãªçµ±åã®åçŽãªæ段ã«ãªããŸãããã¹ãã倱æããå ŽåããŸãã¯ãã¹ãã«åæ Œãããšãã«æ°ããã¢ããªã±ãŒã·ã§ã³ã³ã³ãããŒãææ°ããŒãžã§ã³ã§èµ·åããå ŽåãDockerã¯ç 究çšã®ãã¹ãã³ã³ãããŒã®ã¿ãäºçŽããŸãã çªç¶ãã客æ§ã«æ°ããã³ãŒããæ°åã§ç¢ºèªã§ããŸããããã«ããããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¬ãã«ã§ã¢ããªã±ãŒã·ã§ã³ã®ä»ã®ããŒãžã§ã³ããéé¢ãããããšãä¿èšŒãããŸãã æ°åã§ããŒãããåŸæ¥ã®VMãšã¯ç°ãªããDockerã¯ããã«æ°ç§ãè²»ãããŸãã ããã«ãDockerã€ã¡ãŒãžãäœæããã¢ããªã±ãŒã·ã§ã³ã®ç¹å®ã®ããŒãžã§ã³ã®ãã¹ãŠã®ãã¹ãã«åæ Œããããšã確èªãããããã®ã€ã¡ãŒãžããã©ã€ããŒãã¬ãžã¹ããªã«ã¢ããããŒãããDockerãåããä»ã®ãã·ã³ã§ããŒãããŠãæ°ããã³ã³ãããŒãšããŠèµ·åã§ããŸããããããã¹ãŠãæ°ç§ã§ã
ãããã«
Ansibleã«ãããã€ã³ãã©ã¹ãã©ã¯ãã£ç®¡çããã»ã¹ãå確èªã§ããŸããã Dockerã¯ãæãéèŠãªéçºã¹ãããã®1ã€ã§ããé
ä¿¡ãã§ãŒãºã«é¢ããŠãèªä¿¡ãšå®å®æ§ãäžããŠãããŸããã çµã¿åãããŠããããã¯æ¯é¡ã®ãªãã§ãã
å®å
šã«ã«ã¹ã¿ãã€ãºãããRailsã¢ããªã±ãŒã·ã§ã³ããŒãããããã12åã§ååŸããããšã¯ãã©ã®æšæºã§ãå°è±¡çã§ãã åºæ¬çãªç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ã·ã¹ãã ãç¡æã§å
¥æã§ããŸããã¢ããªã±ãŒã·ã§ã³ã®ããŸããŸãªããŒãžã§ã³ã䞊ã¹ãŠãã¬ãã¥ãŒã§ããŸããåããã·ã³ã§å®è¡ãããŠãããåäœäžãããŒãžã§ã³ã«åœ±é¿ãäžãããéåžžã«åŒ·åã§ãã ããã¯ç§ãåã°ããèšäºã®çµããã«éãããšãããªããç§ã®åã³ãç§ãšåãã¡åãããšãæãã ãã§ãã