ïŒ2018幎çïŒ
ãã²ã«ã»ã°ãªã³ããŒã°
ããã« æ»ã 
ããã¯Flaskã¡ã¬ãã¥ãŒããªã¢ã«ã·ãªãŒãºã®ç¬¬19åç®ã§ãDockerãã©ãããã©ãŒã ã«Microblogãå±éããŸãã
ãã¿ãã¬ã®äžã«ã¯ããã®2018幎ã·ãªãŒãºã®ãã¹ãŠã®èšäºã®ãªã¹ãããããŸãã
泚1ïŒãã®ã³ãŒã¹ã®å€ãããŒãžã§ã³ããæ¢ãã®å Žåã¯ããã¡ããã芧ãã ãã ã
泚2ïŒç§ïŒãã²ã«ïŒã®ä»äºãæ¯æããŠçªç¶å£°ãããããå ŽåããŸãã¯1é±éèšäºãåŸ
ã€å¿èããªãå Žåãç§ïŒãã²ã«ã°ãªãŒã³ããŒã°ïŒã¯ãã®ã¬ã€ãã®å®å
šçïŒè±èªïŒãé»åæžç±ãŸãã¯ãããªã®åœ¢åŒã§æäŸããŸãã 詳现ã«ã€ããŠã¯ã learn.miguelgrinberg.comãã芧ãã ãã ã
第17ç« ã§ã¯ããµãŒããŒæ§æã®ããããåŽé¢ãåŠçããåŸæ¥ã®å±éã«ã€ããŠåŠç¿ããŸããã æ¬¡ã«ã 第18ç« ã§ ãæ§æã¿ã¹ã¯ãšå±éã¿ã¹ã¯ãå®å
šã«å¶åŸ¡ãããµãŒãã¹ã§ããHerokuã玹ä»ãããšãã«ããã1ã€ã®æ¥µç«¯ãªæ¹æ³ã玹ä»ããŸããã ãã®ç« ã§ã¯ãç¹ã«Dockerã³ã³ãããã©ãããã©ãŒã ã§ã®ãµãŒãããŒãã£ã®ã³ã³ããããŒã¹ã®ã¢ããªã±ãŒã·ã§ã³ã®å±éæŠç¥ã«ã€ããŠåŠç¿ããŸãã ãã®3çªç®ã®ãªãã·ã§ã³ã¯ãä»ã®2ã€ã®éã®ããŽãŒã«ãã³ã¡ãŒã³ãã§ãã
ã³ã³ãããŒã¯ãåçŽåãããä»®æ³åãã¯ãããžãŒã«åºã¥ããŠæ§ç¯ãããŠãããããã¢ããªã±ãŒã·ã§ã³ã¯ãã®äŸåé¢ä¿ãšæ§æãšãšãã«å®å
šã«åé¢ããŠåäœããŸãããä»®æ³ãã·ã³ãªã©ã®ãã«æ©èœã®ä»®æ³åãœãªã¥ãŒã·ã§ã³ã¯å¿
èŠãããŸããããã¹ããšæ¯èŒããŠã ã³ã³ããããŒããšããŠæ§æãããã·ã¹ãã ã¯ããã¹ãã³ã¢ãå
±æãããã¹ãæ©åšã«çŽæ¥ã¢ã¯ã»ã¹ã§ããå€ãã®ã³ã³ãããå®è¡ã§ããŸãã ããã¯ãããã»ããµããã£ã¹ã¯ããã®ä»ã®ããŒããŠã§ã¢ãã«ãŒãã«ãªã©ãå«ãå®å
šãªã·ã¹ãã ããšãã¥ã¬ãŒãããå¿
èŠãããä»®æ³ãã·ã³ãšã¯å¯Ÿç
§çã§ãã
ã«ãŒãã«ãå
±æããŠããªãã«ãããããããã³ã³ããå
ã®åé¢ã¬ãã«ã¯éåžžã«é«ããªã£ãŠããŸãã ã³ã³ããã«ã¯ç¬èªã®ãã¡ã€ã«ã·ã¹ãã ããããã³ã³ããããŒãã§äœ¿çšããããªãã¬ãŒãã£ã³ã°ã·ã¹ãã 以å€ã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«åºã¥ãããšãã§ããŸãã ããšãã°ãFedoraãã¹ãã§Ubuntu LinuxããŒã¹ã®ã³ã³ãããŒãå®è¡ã§ããŸããéãåæ§ã§ãã ã³ã³ããã¯Linuxãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«åºæã®ãã¯ãããžãŒã§ãããšããäºå®ã«ãããããããä»®æ³åã®ãããã§ãWindowsããã³Mac OS Xãã¹ãã§Linuxã³ã³ãããå®è¡ã§ããŸãã ããã«ãããéçºã·ã¹ãã ã§å±éããã¹ãããããå¿
èŠãªå Žåã«ã®ã¿éçºã¯ãŒã¯ãããŒã«ã³ã³ãããå«ããããšãã§ããŸãã
ãã®ç« ã®GitHubãªã³ã¯ïŒ Browse ã Zip ã Diff ã
Docker CEãã€ã³ã¹ããŒã«ãã
Dockerãå¯äžã®ã³ã³ãããŒãã©ãããã©ãŒã ã§ã¯ãããŸããããDockerãæã人æ°ããããããç§ã®éžæã«ãªããŸãã ãµãã¹ã¯ãªãã·ã§ã³ããŒã¹ã®ç¡æã³ãã¥ããã£ãšãã£ã·ã§ã³ïŒCEïŒãšãšã³ã¿ãŒãã©ã€ãºãšãã£ã·ã§ã³ïŒEEïŒã®2ã€ã®DockerãªãªãŒã¹ããããŸãã ãã®ãã¥ãŒããªã¢ã«ã§ã¯ãDocker CEã§ååã§ãã
Docker CEã䜿çšããã«ã¯ããŸãã·ã¹ãã ã«ã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã Docker Webãµã€ãã«ã¯ ãWindowsãMac OS Xãããã³ããã€ãã®Linuxãã£ã¹ããªãã¥ãŒã·ã§ã³çšã®ã€ã³ã¹ããŒã©ãŒããããŸãã Microsoft Windowsãå®è¡ããŠããå ŽåãDocker CEã«ã¯Hyper-Vãå¿
èŠã§ããããšã«æ³šæããããšãéèŠã§ãã ã€ã³ã¹ããŒã©ã¯å¿
èŠã«å¿ããŠãããæå¹ã«ããŸãããHyper-Vãæå¹ã«ãããšVirtualBoxãªã©ã®ä»ã®ä»®æ³åãã¯ãããžãŒãæ©èœããªããªãããšã«æ³šæããŠãã ããã
ã·ã¹ãã ã«Docker CEãã€ã³ã¹ããŒã«ããåŸãã¿ãŒããã«ãŠã£ã³ããŠãŸãã¯ã³ãã³ãããã³ããã§æ¬¡ã®ã³ãã³ããå
¥åããŠãã€ã³ã¹ããŒã«ãæåããããšã確èªã§ããŸãã
$ docker version Client: Version: 17.09.0-ce API version: 1.32 Go version: go1.8.3 Git commit: afdb6d4 Built: Tue Sep 26 22:40:09 2017 OS/Arch: darwin/amd64 Server: Version: 17.09.0-ce API version: 1.32 (minimum version 1.12) Go version: go1.8.3 Git commit: afdb6d4 Built: Tue Sep 26 22:45:38 2017 OS/Arch: linux/amd64 Experimental: true
ã³ã³ãããŒã€ã¡ãŒãžã®æ§ç¯
ãã€ã¯ãããã°ã®ã³ã³ãããŒãäœæããæåã®ã¹ãããã¯ããã®ããã®ã€ã¡ãŒãžãäœæããããšã§ãã ã³ã³ããã€ã¡ãŒãžã¯ãã³ã³ããã®äœæã«äœ¿çšããããã³ãã¬ãŒãã§ãã ã³ã³ãããã¡ã€ã«ã·ã¹ãã ã®å®å
šãªãã¥ãŒãšããããã¯ãŒã¯ãèµ·åãªãã·ã§ã³ãªã©ã«é¢é£ããããŸããŸãªèšå®ãå«ãŸããŠããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ããã€ã¡ãŒãžãäœæããæãç°¡åãªæ¹æ³ã¯ã䜿çšããããŒã¹ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ïŒUbuntuãFedoraãªã©ïŒã®ã³ã³ãããå®è¡ããããšã§ããïŒãå®è¡äžã®bashã·ã§ã«ããã»ã¹ã«æ¥ç¶ããã¢ããªã±ãŒã·ã§ã³ãæåã§ã€ã³ã¹ããŒã«ããŸããåŸæ¥ã®å±éã«ã€ããŠã¯ã 第17ç« ã§èª¬æããæšå¥šäºé
ã«åŸã£ãŠãã ããã ãã¹ãŠãã€ã³ã¹ããŒã«ããããã³ã³ããã®åçãæ®ãããšãã§ããŸããããã¯ç»åã«ãªããŸãã ãã®ã¿ã€ãã®ã¯ãŒã¯ãããŒã¯docker
ããŒã ã«ãã£ãŠãµããŒããããŠããŸãããæ°ããã€ã¡ãŒãžãäœæããå¿
èŠããããã³ã«ã¢ããªã±ãŒã·ã§ã³ãæåã§ã€ã³ã¹ããŒã«ããã®ã¯äŸ¿å©ã§ã¯ãªããããããã«ã€ããŠã¯èª¬æããŸããã
æåã®ã¢ãããŒãã¯ãã¹ã¯ãªããã䜿çšããŠã³ã³ããã€ã¡ãŒãžãäœæããããšã§ãã ã¹ã¯ãªããã§ã³ã³ããã€ã¡ãŒãžãäœæããã³ãã³ãã¯docker build
ã§ãã ãã®ã³ãã³ãã¯ããŸã äœæããŠããªãDockerfileãããã«ãåœä»€ãèªã¿åããå®è¡ããŸãã Dockerfileã¯ãå®éã«ã¯ãã¢ããªã±ãŒã·ã§ã³å±éã®ã€ã³ã¹ããŒã«æé ãšäžéšã®ã³ã³ããèšå®ãå®è¡ããã€ã³ã¹ããŒã«ã¹ã¯ãªããã§ãã
ãã€ã¯ãããã°çšã®åºæ¬çãªDockerfileã¯æ¬¡ã®ãšããã§ãã
DockerfileïŒãã€ã¯ãããã°çšã®Dockerfileã
FROM python:3.6-alpine RUN adduser -D microblog WORKDIR /home/microblog COPY requirements.txt requirements.txt RUN python -m venv venv RUN venv/bin/pip install -r requirements.txt RUN venv/bin/pip install gunicorn COPY app app COPY migrations migrations COPY microblog.py config.py boot.sh ./ RUN chmod +x boot.sh ENV FLASK_APP microblog.py RUN chown -R microblog:microblog ./ USER microblog EXPOSE 5000 ENTRYPOINT ["./boot.sh"]
Dockerfileã®åè¡ã¯ã³ãã³ãã§ãã FROM
ã³ãã³ãã¯ãæ°ããã€ã¡ãŒãžã®æ§ç¯ã«åºã¥ããŠã³ã³ããã®ããŒã¹ã€ã¡ãŒãžãæå®ããŸãã ã¢ã€ãã¢ã¯ãæ¢åã®ã€ã¡ãŒãžããå§ããŠãããã€ãã®æ©èœã远å ãŸãã¯å€æŽããæçµçã«æŽŸçããã€ã¡ãŒãžã«ããããšã§ãã ç»åã¯ãã³ãã³ã§åºåãããååãšã¿ã°ã«ãã£ãŠåç
§ãããŸãã ãã®ã¿ã°ã¯ããŒãžã§ã³ç®¡çã¡ã«ããºã ãšããŠäœ¿çšãããã³ã³ããã€ã¡ãŒãžãããã€ãã®ãªãã·ã§ã³ãæäŸã§ããããã«ããŸãã éžæããã€ã¡ãŒãžã®ååã¯python
ã§ããããã¯ãPythonã®å
¬åŒDockerã€ã¡ãŒãžã§ãã ãã®ã€ã¡ãŒãžã®ã¿ã°ã䜿çšãããšãã€ã³ã¿ãŒããªã¿ãŒã®ããŒãžã§ã³ãšããŒã¹ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãæå®ã§ããŸãã 3.6-alpine
ã¿ã°ã¯ãAlpine Linuxã«ã€ã³ã¹ããŒã«ãããŠããPython 3.6ã€ã³ã¿ãŒããªã¿ãŒãéžæããŸãã Alpine Linuxãã£ã¹ããªãã¥ãŒã·ã§ã³ã¯ããµã€ãºãå°ãããããUbuntuãªã©ã®äžè¬çãªãã£ã¹ããªãã¥ãŒã·ã§ã³ã®ä»£ããã«ãã䜿çšãããŸãã Pythonã€ã¡ãŒãžãªããžããªã§Pythonã€ã¡ãŒãžã«äœ¿çšã§ããã¿ã°ã確èªã§ããŸã ã
RUN
ã³ãã³ãã¯ãã³ã³ããã®ã³ã³ããã¹ãã§ä»»æã®ã³ãã³ããå®è¡ããŸãã ããã¯ãã·ã§ã«ã³ãã³ãããã³ããã§ã³ãã³ããå
¥åããã®ã«äŒŒãŠããŸãã adduser-D microblog
ã³ãã³ãã¯ã adduser-D microblog
ãšããååã®æ°ãããŠãŒã¶ãŒãäœæããŸãã ã»ãšãã©ã®ã³ã³ããã€ã¡ãŒãžã«ã¯ããã©ã«ããŠãŒã¶ãŒãšããŠroot
ããããŸãããã¢ããªã±ãŒã·ã§ã³ãã«ãŒããšããŠå®è¡ããããšã¯æšå¥šãããªããããç¬èªã®ãŠãŒã¶ãŒãäœæããŸãã
WORKDIR
ã³ãã³ãã¯ãã¢ããªã±ãŒã·ã§ã³ãã€ã³ã¹ããŒã«ãããããã©ã«ãã®ãã£ã¬ã¯ããªãèšå®ããŸãã äžèšã®microblog
ãŠãŒã¶ãŒãäœæãããšãããŒã ãã£ã¬ã¯ããªãäœæãããããããã®ãã£ã¬ã¯ããªãããã©ã«ãã«ããŸãã æ°ããããã©ã«ããã£ã¬ã¯ããªã¯ãDockerfileå
ã®æ®ãã®ãã¹ãŠã®ã³ãã³ãã«é©çšãããŸãããŸããã³ã³ãããå®è¡ããããšãã«ãé©çšãããŸãã
COPY
ã¯ãã³ã³ãã¥ãŒã¿ãŒããã³ã³ãããŒãã¡ã€ã«ã·ã¹ãã ã«ãã¡ã€ã«ã転éããŸãã ãã®ã³ãã³ãã¯ããœãŒã¹ãšå®å
ã®ãã¡ã€ã«ãŸãã¯ãã£ã¬ã¯ããªã®2ã€ä»¥äžã®åŒæ°ãåããŸãã ãœãŒã¹ãã¡ã€ã«ã¯ãDockerfileã眮ãããŠãããã£ã¬ã¯ããªã«é¢é£ããŠããå¿
èŠããããŸãã å²ãåœãŠã¯ã絶察ãã¹ã§ããåã®WORKDIR
æå®ããããã£ã¬ã¯ããªããã®çžå¯Ÿãã¹ã§ãWORKDIR
ã ãã®æåã®ã³ããŒã³ãã³ãã§ã¯ã requirements.txtãã¡ã€ã«ãã³ã³ãããŒãã¡ã€ã«ã·ã¹ãã ã®microblog
ãŠãŒã¶ãŒããŒã ãã£ã¬ã¯ããªã«ã³ããŒããŸã ã
ããã§ãã³ã³ããå
ã«requirements.txtãã¡ã€ã«ãã§ããŸããRUN
ã³ãã³ãã䜿çšããŠä»®æ³ç°å¢ãäœæã§ããŸãã æåã«äœæããŠããããã¹ãŠã®èŠä»¶ãèšå®ããŸãã èŠä»¶ãã¡ã€ã«ã«ã¯äžè¬çãªäŸåé¢ä¿ã®ã¿ãå«ãŸããŠãããããWebãµãŒããŒãšããŠäœ¿çšããgunicornãæç€ºçã«ã€ã³ã¹ããŒã«ããŸãã ãŸãã¯ã requirements.txtã®ãã¡ã€ã«ã«gunicornã远å ã§ããŸã ã
ã³ã³ãããžã®ã¢ããªã±ãŒã·ã§ã³ã®ã€ã³ã¹ããŒã«ã«ç¶ã3ã€ã®COPY
ã³ãã³ãã ã¢ããªããã±ãŒãžãããŒã¿ããŒã¹ç§»è¡ã䌎ãmigrationsãã£ã¬ã¯ããªããããã¬ãã«ãã£ã¬ã¯ããªããã®microblog.pyããã³config.pyã¹ã¯ãªãããã³ããŒããŸãã ããã«ãæ°ããboot.shãã¡ã€ã«ãã³ããŒããŸããããã«ã€ããŠã¯ã以äžã§èª¬æããŸãã
RUN chmod
ã¯ããã®ä»¥åã¯äžæã ã£ãboot.shãã¡ã€ã«ãå®è¡å¯èœãã¡ã€ã«ãšããŠæ£ããã€ã³ã¹ããŒã«ãããããã«ããŸãã UnixããŒã¹ã®ãã¡ã€ã«ã·ã¹ãã ã䜿çšããŠããŠããœãŒã¹ãã¡ã€ã«ã«å®è¡å¯èœãã¡ã€ã«ã®ãã©ã°ãæ¢ã«ããå Žåãå®è¡å¯èœããããã³ããŒããããã¡ã€ã«ã«èšå®ãããŸãã Windowsã§ã¯å®è¡å¯èœããããå²ãåœãŠãã®ãããé£ãããããæç€ºçãªã€ã³ã¹ããŒã«ã远å ããŸããã Mac OS XãŸãã¯Linuxãå®è¡ããŠããå Žåãããããå¿
èŠã§ã¯ãããŸãããããããªãå Žåã§ãåé¡ã¯ãããŸããã
ENV
ã³ãã³ãã¯ãã³ã³ããå
ã®ç°å¢å€æ°ãèšå®ããŸãã FLASK_APP
ã³ãã³ãã䜿çšããããã«å¿
èŠãªFLASK_APP
ãèšå®ããå¿
èŠããããŸãã
次ã®RUN chown
ã¯ã / home / microblogã«æ°ããmicroblog
ãŠãŒã¶ãŒãšããŠä¿åãããŠãããã¹ãŠã®ãã£ã¬ã¯ããªãšãã¡ã€ã«ã®ææè
ãèšå®ããŸãã ãã®ãŠãŒã¶ãŒãDockerfileã®ã«ãŒãã§äœæããã«ããããããããã¹ãŠã®ã³ãã³ãã®ããã©ã«ããŠãŒã¶ãŒã¯root
ãŸãŸã§ããããããããã®ãã¹ãŠã®ãã¡ã€ã«ãmicroblog
ãŠãŒã¶ãŒã«åãæ¿ããŠãã³ã³ãããŒã®èµ·åæã«ãã®ãŠãŒã¶ãŒãæäœã§ããããã«ããå¿
èŠããããŸãã
次ã®è¡ã®USER
ã³ãã³ãã¯ããã®æ°ããmicroblog
ãŠãŒã¶ãŒãã以éã®æç€ºã®ããã©ã«ããšããŠããŸãã³ã³ãããèµ·åãããšãã®ããã©ã«ãã«ããŸãã
EXPOSE
ã³ãã³ãã¯ããµãŒããŒã®ããŒããæ§æããŸãã ããã¯ãDockerãã³ã³ããå
ã®ãããã¯ãŒã¯ãé©åã«æ§æã§ããããã«ããããã«å¿
èŠã§ãã æšæºããŒã5000ãéžæããŸããããã©ã®ããŒãã§ãããŸããŸããã
æåŸã«ã ENTRYPOINT
ã³ãã³ãã¯ãã³ã³ããã®èµ·åæã«å®è¡ããå¿
èŠãããã³ãã³ãã®ããã©ã«ããå®çŸ©ããŸãã ããã¯ãã¢ããªã±ãŒã·ã§ã³WebãµãŒããŒãèµ·åããã³ãã³ãã§ãã ãã¹ãŠãããŸãæŽçãããããã«ãç§ã¯ãã®ããã«å¥ã®ã¹ã¯ãªãããäœæããããšã«ããŸãããããã¯ä»¥åã«ã³ã³ããã«ã³ããŒããboot.shãã¡ã€ã«ã§ãã ãã®ã¹ã¯ãªããã®å
å®¹ã¯æ¬¡ã®ãšããã§ãã
boot.shïŒDockerã³ã³ãããŒã®èµ·åã¹ã¯ãªããã
#!/bin/sh source venv/bin/activate flask db upgrade flask translate compile exec gunicorn -b :5000 --access-logfile - --error-logfile - microblog:app
ããã¯ããªãæšæºçãªèµ·åã¹ã¯ãªããã§ããã 第17 ç« ãšç¬¬18 ç« ã§å±éãéå§ãããæ¹æ³ã«éåžžã«äŒŒãŠããŸãã ä»®æ³ç°å¢ãã¢ã¯ãã£ãã«ããç§»è¡ãã©ãããã©ãŒã ãä»ããŠããŒã¿ããŒã¹ãæŽæ°ããèšèªç¿»èš³ãã³ã³ãã€ã«ããæåŸã«gunicornã§ãµãŒããŒãèµ·åããŸãã
gunicornã³ãã³ãã®åã«ããexec
ã«æ³šæããŠãã ããã ã·ã§ã«ã¹ã¯ãªããã§ã¯ã exec
ã¯ãæ°ããããã»ã¹ãšããŠéå§ããã®ã§ã¯ãªããæå®ãããã³ãã³ãã§çœ®ãæããå¿
èŠãããã¹ã¯ãªãããå®è¡ããããã»ã¹ãéå§ããŸãã ããã¯éèŠã§ããDockerã¯ãã³ã³ããã®å¯¿åœããã³ã³ããã§å®è¡ãããæåã®ããã»ã¹ã«é¢é£ä»ããããã§ãã ãã®ãããªå Žåãã¹ã¿ãŒãã¢ããããã»ã¹ãã³ã³ããã®ã¡ã€ã³ããã»ã¹ã§ã¯ãªãå Žåãã³ã³ãããDockerã§æ©æã«çµäºããªãããã«ãã¡ã€ã³ããã»ã¹ããã®æåã®ããã»ã¹ã«åã£ãŠä»£ããããšã確èªããå¿
èŠããããŸãã
Dockerã®è峿·±ãåŽé¢ã¯ã stdout
ãŸãã¯stderr
æžã蟌ãŸãããã¹ãŠã®ã³ã³ããåºåããã£ããã£ãããã³ã³ãããã°ãšããŠä¿åãããããšã§ãã ãã®ããã --error-logfile
ãš--error-logfile
ã®æåŸã«-ãããããã°ãæšæºåºåã«--error-logfile
ããŠDockerãã°ãšããŠä¿åããŸãã
äœæãããDockerfileã䜿çšããŠãã³ã³ãããŒã€ã¡ãŒãžãäœæã§ããããã«ãªããŸããã
$ docker build -t microblog:latest .
docker build
æž¡ããã-t
åŒæ°ã¯ãæ°ããã³ã³ãããŒã€ã¡ãŒãžã®ååãšã¿ã°ãæå®ããŸãã .
ã³ã³ãããäœæããããŒã¹ãã£ã¬ã¯ããªã瀺ããŸãã ããã¯ãDockerãã¡ã€ã«ã眮ãããŠãããã£ã¬ã¯ããªã§ãã ãã«ãããã»ã¹ã¯ãDockerãã¡ã€ã«å
ã®ãã¹ãŠã®ã³ãã³ããè©äŸ¡ããç¬èªã®ãã·ã³ã«ä¿åãããã€ã¡ãŒãžãäœæããŸãã
docker images
ããŒã«ã«ã§äœ¿çšããç»åã®ãªã¹ããååŸã§ããŸãïŒ
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE microblog latest 54a47d0c27cf About a minute ago 216MB python 3.6-alpine a6beab4fa70b 3 months ago 88.7MB
ãã®ãªã¹ãã«ã¯ãæ°ããã€ã¡ãŒãžãšããããäœæãããããŒã¹ãå«ãŸããŸãã ã¢ããªã±ãŒã·ã§ã³ã«å€æŽãå ããå Žåããã«ãã³ãã³ããå床å®è¡ããŠã³ã³ããã€ã¡ãŒãžãæŽæ°ã§ããŸãã
ã³ã³ããæã¡äžã
ã€ã¡ãŒãžããã§ã«äœæãããŠããã®ã§ãã¢ããªã±ãŒã·ã§ã³ã³ã³ããã®ããŒãžã§ã³ãèµ·åã§ããŸãã ããã¯ãéåžžã倿°ã®åŒæ°ããšãdocker run
ã䜿çšããŠè¡ãããŸãã æåã«ãç°¡åãªäŸã瀺ããŸãã
$ docker run --name microblog -d -p 8000:5000 --rm microblog:latest 021da2e1e0d390320248abf97dfbbe7b27c70fefed113d5a41bb67a68522e91c
--name
ãã©ã¡ãŒã¿ãŒã¯ãæ°ããã³ã³ãããŒã®ååãæäŸããŸãã -d
ã¯ãDockerã«ããã¯ã°ã©ãŠã³ãã§ã³ã³ãããŒãéå§ããããã«æç€ºããŸãã -d
ã¹ã€ããã䜿çšããªãå Žåãã³ã³ããã¯ãã©ã¢ã°ã©ãŠã³ãã¢ããªã±ãŒã·ã§ã³ãšããŠå®è¡ãããã³ãã³ãã©ã€ã³ããããã¯ãããŸãã -p
ã¯ãã³ã³ããããŒãããã¹ãããŒãã«ãããããŸãã æåã®ããŒãã¯ãã¹ãã³ã³ãã¥ãŒã¿ãŒã®ããŒãã§ãå³åŽã®ããŒãã¯ã³ã³ãããŒå
ã®ããŒãã§ãã äžèšã®äŸã§ã¯ãããŒãã®ããŒã8000ââã®ã³ã³ãããŒã«ããŒã5000ãæäŸãããããå
éšã³ã³ãããŒã5000ã䜿çšããŠããå Žåã§ãã8000ã§ã¢ããªã±ãŒã·ã§ã³ã«ã¢ã¯ã»ã¹ããŸã--rm
ã¯ãçµäºæã«ã³ã³ãããŒãåé€ã--rm
ã ããã¯å¿
é ã§ã¯ãããŸããããéåžžãçµäºãŸãã¯ç Žæããã³ã³ããã¯å¿
èŠãªããããèªåçã«åé€ã§ããŸãã æåŸã®åŒæ°ã¯ãã³ã³ããã€ã¡ãŒãžã®ååãšã³ã³ããã«äœ¿çšãããã¿ã°ã§ãã äžèšã®ã³ãã³ããå®è¡ããåŸã httpïŒ// localhostïŒ8000ã§ã¢ããªã±ãŒã·ã§ã³ã«ã¢ã¯ã»ã¹ã§ããŸãã
docker run
ã®çµæã¯ãæ°ããã³ã³ããã«å²ãåœãŠãããèå¥åïŒIDïŒã§ãã ããã¯ãåŸç¶ã®ã³ãã³ãã§ã³ã³ãããåç
§ããå¿
èŠããããšãã«äœ¿çšã§ããé·ã16鲿°æååã§ãã å®éãèå¥åãäžæã«ããããã«å¿
èŠãªã®ã¯æåã®æ°æåã ãã§ãã
å®è¡äžã®ã³ã³ããã確èªããå Žåã¯ã docker ps
䜿çšã§ããŸãã
$ docker ps CONTAINER ID IMAGE COMMAND PORTS NAMES 021da2e1e0d3 microblog:latest "./boot.sh" 0.0.0.0:8000->5000/tcp microblog
ã芧ã®ãšããã docker ps
ã§ããã³ã³ãããŒIDãççž®ããŸãã ã³ã³ããã忢ããå¿
èŠãããå Žåã¯ã docker stop
䜿çšããŸãã
$ docker stop 021da2e1e0d3 021da2e1e0d3
ã¢ããªã±ãŒã·ã§ã³æ§æã«ã¯ãç°å¢å€æ°ããååŸãããããã€ãã®ãã©ã¡ãŒã¿ãŒããããŸãã ããšãã°ãFlaskç§å¯éµãã©ã¡ãŒã¿ãŒãããŒã¿ããŒã¹URLãããã³é»åã¡ãŒã«ãµãŒããŒã¯ãç°å¢å€æ°ããã€ã³ããŒããããŸãã äžèšã®docker run
äŸã§ã¯ããããã«ã€ããŠå¿é
ããŠããªãã£ãããããããã®æ§æãªãã·ã§ã³ã¯ãã¹ãŠããã©ã«ãå€ã䜿çšããŸãã
ããçŸå®çãªäŸã§ã¯ããããã®ç°å¢å€æ°ã¯ã³ã³ããå
ã«èšå®ãããŸãã åã®ã»ã¯ã·ã§ã³ã§ã Dockerfileã®ç°å¢å€æ°ã®èšå®ã¯ENV
ã³ãã³ãã«ãã£ãŠè¡ãããããšãèŠãŸããããããã¯éç倿°ã®äŸ¿å©ãªãªãã·ã§ã³ã§ãã ãã ããã€ã³ã¹ããŒã«ã«äŸåãã倿°ã«ã€ããŠã¯ããã«ãããã»ã¹ã®äžéšãšããŠäœ¿çšããããšã¯ã§ããŸãããããã¯ãæã¡éã³ãç°¡åãªã³ã³ããã®ã€ã¡ãŒãžã欲ããããã§ãã ã¢ããªã±ãŒã·ã§ã³ãã³ã³ããã€ã¡ãŒãžãšããŠå¥ã®ãŠãŒã¶ãŒã«è»¢éããå Žåã¯ãä»ã®å€æ°ã§ã¢ããªã±ãŒã·ã§ã³ãåæ§ç¯ããã®ã§ã¯ãªãããã®ãŠãŒã¶ãŒãã¢ããªã±ãŒã·ã§ã³ããã®ãŸãŸäœ¿çšã§ããããã«ããå¿
èŠããããŸãã
ãããã£ãŠããã«ãæã®ç°å¢å€æ°ã¯äŸ¿å©ã§ããã docker run
ã䜿çšããŠèšå®ã§ããã©ã³ã¿ã€ã ç°å¢å€æ°ãå¿
èŠã§ãããããã®å€æ°ã«ã¯-e
ã¹ã€ããã䜿çšããŸãã æ¬¡ã®äŸã§ã¯ãGmailã¢ã«ãŠã³ãã®ç§å¯éµãšã¡ãŒã«ãèšå®ããŸãã
$ docker run --name microblog -d -p 8000:5000 --rm -e SECRET_KEY=my-secret-key \ -e MAIL_SERVER=smtp.googlemail.com -e MAIL_PORT=587 -e MAIL_USE_TLS=true \ -e MAIL_USERNAME=<your-gmail-username> -e MAIL_PASSWORD=<your-gmail-password> \ microblog:latest
ã³ãã³ãã©ã€ã³ã§docker run
ãããdocker run
ãã®ãããªé·ãã¯ãç°å¢å€æ°ã®å€ãã®å®çŸ©ãååšãããããçããããšã§ã¯ãããŸããã
ãµãŒãããŒãã£ã®ãã³ã³ããããµãŒãã¹ã®äœ¿çš
Microblogã®ã³ã³ããããŒãžã§ã³ã¯è¯ãããã«èŠããŸããããããŸã§ã¹ãã¬ãŒãžã«ã€ããŠã¯ããŸãèããŠããŸããã§ããã åé¡ã¯ãç°å¢å€æ°DATABASE_URL
èšå®ããŠããããã¢ããªã±ãŒã·ã§ã³ããã£ã¹ã¯äžã®ãã¡ã€ã«ã§ãµããŒããããŠããããã©ã«ãã®SQLiteããŒã¿ããŒã¹ã䜿çšããŠããããšã§ãã ã³ã³ããã忢ããŠåé€ãããšããã®SQLiteãã¡ã€ã«ã¯ã©ããªããšæããŸããïŒ ãã¡ã€ã«ãæ¶ããŸãïŒ
ã³ã³ããå
ã®ãã¡ã€ã«ã·ã¹ãã ã¯äžæçã§ããã€ãŸããã³ã³ããã忢ãããšæ¶ããŸãã ãã¡ã€ã«ã·ã¹ãã ã«ããŒã¿ãæžã蟌ãããšãã§ããã³ã³ãããŒããããèªã¿åãå¿
èŠãããå Žåã«ããŒã¿ã䜿çšã§ããŸãããäœããã®çç±ã§ã³ã³ãããŒããªãµã€ã¯ã«ããŠæ°ãããã®ãšäº€æããå¿
èŠãããå Žåãã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠãã£ã¹ã¯ã«ä¿åãããããŒã¿ã¯æ°žä¹
ã«å€±ãããŸãã
ã³ã³ããã¢ããªã±ãŒã·ã§ã³ã®åªããèšèšæŠç¥ã¯ã ã¹ããŒãã¬ã¹ã¢ããªã±ãŒã·ã§ã³ã³ã³ãããäœæããããšã§ãã ã¢ããªã±ãŒã·ã§ã³ã³ãŒãããããããŒã¿ããªãã³ã³ãããããå Žåããããç Žæ£ããŠæ°ããã³ã³ããã«åé¡ãªã眮ãæããããšãã§ããŸããã³ã³ããã¯å®éã«1åã ãã«ãªããŸããããã¯ãæŽæ°ããã°ã©ã ã®å±éãç°¡çŽ åãããšããç¹ã§å€§ããªææã§ãã
ãããããã¡ãããããã¯ãããŒã¿ãã¢ããªã±ãŒã·ã§ã³ã³ã³ãããŒã®å€éšã®ã©ããã«é
眮ããå¿
èŠãããããšãæå³ããŸãã ããã§ãçŽ æŽãããDockerãšã³ã·ã¹ãã ãæŽ»èºããŸãã Docker Container Registryã«ã¯ãããŸããŸãªã³ã³ãããŒã€ã¡ãŒãžãå«ãŸããŠããŸãã Pythonã³ã³ããã€ã¡ãŒãžã«ã€ããŠã¯æ¢ã«èª¬æããŸããããããã¯ãã€ã¯ãããã°ã³ã³ããã®ããŒã¹ã€ã¡ãŒãžãšããŠäœ¿çšããŸãã ããã«ãDockerã¯ãä»ã®å€ãã®èšèªãããŒã¿ããŒã¹ãããã³Dockerã¬ãžã¹ããªå
ã®ä»ã®ãµãŒãã¹ã®ã€ã¡ãŒãžããµããŒãããŸããããã§ååã§ãªãå Žåãã¬ãžã¹ããªã«ãããäŒæ¥ã¯è£œåã®ã³ã³ãããŒã€ã¡ãŒãžãå
¬éã§ããŸããç»åã ããã¯ããµãŒãããŒãã£ã®ãµãŒãã¹ãã€ã³ã¹ããŒã«ããåŽåããã¬ãžã¹ããªã§é©åãªã€ã¡ãŒãžãèŠã€ããŠã察å¿ããåŒæ°ãæå®ããdocker run
ã䜿çšããŠèµ·åããããšã«è»œæžãããããšãæå³ããŸãã
ããã§ãMySQLããŒã¿ããŒã¹çšãšElasticsearchãµãŒãã¹çšã®2ã€ã®è¿œå ã³ã³ãããŒãäœæããŸããæ¬¡ã«ãããã2ã€ã®æ°ããã³ã³ãããŒãžã®ã¢ã¯ã»ã¹ãå¯èœã«ããäžé£ã®ãã©ã¡ãŒã¿ãŒã§Microblogã³ã³ãããŒãèµ·åããé·ãã³ãã³ãã©ã€ã³ãå®è¡ããŸãã
MySQLã³ã³ãããŒã®è¿œå
ä»ã®å€ãã®è£œåããµãŒãã¹ãšåæ§ã«ãMySQLã«ã¯Dockerã¬ãžã¹ããªã§å©çšå¯èœãªãããªãã¯ã³ã³ãããŒã€ã¡ãŒãžããããŸãã ç§èªèº«ã®Microblogã³ã³ãããšåæ§ã«ãMySQLã¯docker run
æž¡ãããç°å¢å€æ°ã«äŸåããŠããŸãã ãããã¯ããã¹ã¯ãŒããããŒã¿ããŒã¹åãªã©ã®èšå®ã§ãã ã¬ãžã¹ããªã«å€ãã®MySQLã€ã¡ãŒãžããããšããäºå®ã«ãããããããMySQLããŒã ã«ãã£ãŠå
¬åŒã«ãµããŒããããŠãããã®ã䜿çšããããšã«ããŸããã MySQLã³ã³ãããŒã®ã€ã¡ãŒãžã«é¢ãã詳现æ
å ±ã¯ããã®ã¬ãžã¹ããªããŒãžhttps://hub.docker.com/r/mysql/mysql-server/ã§èŠã€ããããšãã§ããŸã ã
第17ç« ã§æéã®ãããMySQLãã¥ãŒãã³ã°ããã»ã¹ãèŠããŠãããªããMySQLã®ãããã€ãã©ãã»ã©ç°¡åããèŠãŠãDockerã«æè¬ããã§ãããã MySQLãµãŒããŒãèµ·åããdocker run
ãšããã§ãã
$ docker run --name mysql -d -e MYSQL_RANDOM_ROOT_PASSWORD=yes \ -e MYSQL_DATABASE=microblog -e MYSQL_USER=microblog \ -e MYSQL_PASSWORD=<database-password> \ mysql/mysql-server:5.7
以äžã§ãïŒ Dockerãã€ã³ã¹ããŒã«ãããŠããä»»æã®ãã·ã³ã§ãäžèšã®ã³ãã³ããå®è¡ããŠãã©ã³ãã ã«çæãããã«ãŒããã¹ã¯ãŒãã microblog
ãšåŒã°ãããŸã£ããæ°ããããŒã¿ããŒã¹ãããã³ããŒã¿ããŒã¹ãžã®ãã«ã¢ã¯ã»ã¹ã®ããã®åãååãšèšå®ãæã€ãŠãŒã¶ãŒãã€ã³ã¹ããŒã«ãããMySQLãµãŒããŒãååŸã§ããŸãã MYSQL_PASSWORD
ç°å¢MYSQL_PASSWORD
å€ãšããŠæ£ãããã¹ã¯ãŒããå
¥åããå¿
èŠãããããšã«æ³šæããŠãã ããã
ã¢ããªã±ãŒã·ã§ã³åŽã§ã¯ãUbuntuã§ã®åŸæ¥ã®å±éã«ã€ããŠã¯ãMySQLã¯ã©ã€ã¢ã³ãããã±ãŒãžã远å ããå¿
èŠããããŸãã pymysql
ã䜿çšããŸãããããDockerfileã«è¿œå ã§ããŸã ã
DockerfileïŒpymysqlãDockerfileã«è¿œå ããŸãã
# ... RUN venv/bin/pip install gunicorn pymysql # ...
ã¢ããªã±ãŒã·ã§ã³ãŸãã¯Dockerfileã倿Žãããã³ã«ãã³ã³ãããŒã€ã¡ãŒãžãåæ§ç¯ããå¿
èŠããããŸãã
$ docker build -t microblog:latest .
ããã§Microblogãåã³èµ·åã§ããŸãããä»åã¯ããŒã¿ããŒã¹ã³ã³ãããŒãžã®ãªã³ã¯ã䜿çšããŠãäž¡æ¹ããããã¯ãŒã¯çµç±ã§éä¿¡ã§ããããã«ããŸãã
$ docker run --name microblog -d -p 8000:5000 --rm -e SECRET_KEY=my-secret-key \ -e MAIL_SERVER=smtp.googlemail.com -e MAIL_PORT=587 -e MAIL_USE_TLS=true \ -e MAIL_USERNAME=<your-gmail-username> -e MAIL_PASSWORD=<your-gmail-password> \ --link mysql:dbserver \ -e DATABASE_URL=mysql+pymysql://microblog:<database-password>@dbserver/microblog \ microblog:latest
--link
ãã©ã¡ãŒã¿ãŒã¯ãå¥ã®ã³ã³ãããŒã䜿çšå¯èœã«ããããã«Dockerã«æç€ºããŸãã åŒæ°ã«ã¯ãã³ãã³ã§åºåããã2ã€ã®ååãå«ãŸããŸãã æåã®éšåã¯ãéä¿¡çšã®ã³ã³ããã®ååãŸãã¯èå¥åã§ãããã®å Žåã¯ãäžèšã§äœæããmysql
ã§ãã 2çªç®ã®éšåã¯ããã®ã³ã³ãããŒã§ãªã³ã¯ã«äœ¿çšã§ãããã¹ãåãå®çŸ©ããŸãã ããã§ã¯ãããŒã¿ããŒã¹ãµãŒããŒãè¡šãæ±çšåãšããŠdbserver
ã䜿çšããŸãã
2ã€ã®ã³ã³ãããŒéã®æ¥ç¶ã確ç«ããããã DATABASE_URL
ç°å¢å€æ°ãèšå®ããŠãSQLAlchemyãå¥ã®ã³ã³ãããŒã®MySQLããŒã¿ããŒã¹ã䜿çšããããã«æç€ºã§ããŸãã ããŒã¿ããŒã¹URLã¯ãããŒã¿ããŒã¹ã®ãã¹ãåãšããŠdbserver
ã䜿çšããããŒã¿ããŒã¹ããã³ãŠãŒã¶ãŒåãšããŠmicroblog
ã䜿çšããMySQLã®èµ·åæã«éžæãã
ãŸãã
MySQLã³ã³ããã§å®éšããŠãããšãã«ãããŒã¿ããŒã¹ãžã®æ¥ç¶ãåãå
¥ããæºåãã§ãããŸã§ãã®ã³ã³ããã®èµ·åã«æ°ç§ããããšããäºå®ã«æ°ä»ããŸããã boot.shã¹ã¯ãªãããflask db migrate
ãå®è¡ããããšããçŽåŸã«MySQLã³ã³ãããšã¢ããªã±ãŒã·ã§ã³ã³ã³ãããé£ç¶ããŠèµ·åãããšãããŒã¿ããŒã¹ãæ¥ç¶ãåãå
¥ããæºåãã§ããŠããªããããã¯ã©ãã·ã¥ãçºçããå¯èœæ§ããããŸãã ãœãªã¥ãŒã·ã§ã³ã®ä¿¡é Œæ§ãé«ãããããç¹°ãè¿ãã«ãŒããboot.shã«è¿œå ããããšã«ããŸãã ã
boot.sh ïŒããŒã¿ããŒã¹ãžã®æ¥ç¶ãå詊è¡ããŸãã
#!/bin/sh source venv/bin/activate while true; do flask db upgrade if [[ "$?" == "0" ]]; then break fi echo Upgrade command failed, retrying in 5 secs... sleep 5 done flask translate compile exec gunicorn -b :5000 --access-logfile - --error-logfile - microblog:app
ãã®ã«ãŒãã¯ã flask db upgrade
ã³ãã³ãã®çµäºã³ãŒãããã§ãã¯ãããŒãã«çãããªãå Žåãäœãåé¡ãçºçããããšãæå³ããããã5ç§éäžæåæ¢ããŠããå詊è¡ããŸãã
Elasticsearchã³ã³ãããŒã®è¿œå
Dockerã®Elasticsearchããã¥ã¡ã³ãã«ã¯ã2ã€ã®ããŒãã§ããã«äœ¿çšã§ãããéçºãšå±éã®ããã®åäžããŒããšããŠãµãŒãã¹ãå®è¡ãããªãã·ã§ã³ãçšæãããŠããŸããæ¬¡ã«ãåäžããŒããªãã·ã§ã³ã§dockerãå®è¡ãããªãŒãã³ãœãŒã¹ãšã³ãžã³ã®ã¿ãåãããossãã€ã¡ãŒãžã䜿çšããŸããã³ã³ããã¯æ¬¡ã®ã³ãã³ãã§èµ·åãããŸãã
$ docker run --name elasticsearch -d -p 9200:9200 -p 9300:9300 --rm \ -e "discovery.type=single-node" \ docker.elastic.co/elasticsearch/elasticsearch-oss:6.1.1
ãã®ã³ãã³ãdocker run
ã¯ããã€ã¯ãããã°ãMySQLã§äœ¿çšããã³ãã³ããšå€ãã®å
±éç¹ããããŸãããè峿·±ãéããããã€ããããŸãããŸãã2ã€ã®ãªãã·ã§ã³-p
ããããŸããã€ãŸãããã®ã³ã³ããã¯1ã€ã§ã¯ãªã2ã€ã®ããŒãã§ãªãã¹ã³ããŸããããŒã9200ãš9300ã¯äž¡æ¹ãšãããã¹ãã³ã³ãã¥ãŒã¿ãŒã®åãããŒãã«ãããããŸãã
. , , <name>:<tag>
. MySQL <account>/<name>:<tag>
, Docker. Elasticsearch, , <registry>/<account><name>:<tag>
, . , Docker. Elasticsearch docker.elastic.co , Docker.
, Elasticsearch, Microblog, URL Elasticsearch:
$ docker run --name microblog -d -p 8000:5000 --rm -e SECRET_KEY=my-secret-key \ -e MAIL_SERVER=smtp.googlemail.com -e MAIL_PORT=587 -e MAIL_USE_TLS=true \ -e MAIL_USERNAME=<your-gmail-username> -e MAIL_PASSWORD=<your-gmail-password> \ --link mysql:dbserver \ -e DATABASE_URL=mysql+pymysql://microblog:<database-password>@dbserver/microblog \ --link elasticsearch:elasticsearch \ -e ELASTICSEARCH_URL=http://elasticsearch:9200 \ microblog:latest
, . , , Elasticsearch .
http://localhost:8000 . , . , , Python:
$ docker logs microblog
Docker
, , Docker, , . , Docker, .
Docker, https://hub.docker.com . , , , , .
docker login
:
$ docker login
, microblog:latest
, . Docker, , , MySQL. docker tag
:
$ docker tag microblog:latest <your-docker-registry-account>/microblog:latest
docker images
, , microblog:latest
, . .
Docker, docker push
:
$ docker push <your-docker-registry-account>/microblog:latest
, , Docker , MySQL .
Docker , , Docker. , , 17 Digital Ocean, Linode Amazon Lightsail. Docker .
Amazon Container Service (ECS) , , AWS , .
æåŸã«ãKubernetesãªã©ã®ãã©ãããã©ãŒã ãçµã¿åãããã³ã³ããã¯ãããŒããã©ã³ã·ã³ã°ãã¹ã±ãŒãªã³ã°ãã»ãã¥ãªãã£ç®¡çãããŒã«ããã¯å¯èœãªé æ¬¡æŽæ°ã䜿çšããŠãã·ã³ãã«ãªYAMLããã¹ããã¡ã€ã«ã§è€æ°ã®ã³ã³ããã®å±éã説æã§ãããããããã«é«ãã¬ãã«ã®èªååãšå©äŸ¿æ§ãæäŸããŸãã
ããã« æ»ã 