ããŒã«ã«ç°å¢ã§ã®Pythonãããžã§ã¯ãã®éçºã¯ãè€æ°ã®ãããžã§ã¯ããåæã«éçºãããŠããå Žåãããªãå°é£ã«ãªãå¯èœæ§ããããŸãã ãããžã§ã¯ãã®ããŒãã¹ãã©ããã¯ãããŒãžã§ã³ã管çããäŸåé¢ä¿ãšæ§æãèšå®ããå¿ èŠããããããæéããããå ŽåããããŸãã 以åã¯ããã¹ãŠã®ãããžã§ã¯ãèŠä»¶ãããŒã«ã«ç°å¢ã«çŽæ¥ã€ã³ã¹ããŒã«ããŠãããã³ãŒãã®èšè¿°ã«éäžããŠããŸããã ãã ããåãç°å¢ã§è€æ°ã®ãããžã§ã¯ããé²è¡äžã§ãããšãæ§æãäŸåé¢ä¿ã®ç«¶åãçºçããå¯èœæ§ããããããããã«åé¡ã«ãªããŸãã ããã«ãããŒã ã¡ã€ããšãããžã§ã¯ããå ±æãããšãã¯ãç°å¢ã調æŽããå¿ èŠããããŸãã ãã®ããã«ã¯ããããžã§ã¯ãç°å¢ãç°¡åã«å ±æã§ããããã«å®çŸ©ããå¿ èŠããããŸããÂ
ãã®ããã®è¯ãæ¹æ³ã¯ããããžã§ã¯ãããšã«åé¢ãããéçºç°å¢ãäœæããããšã§ãã ããã¯ãã³ã³ãããŒãš Docker Compose ã䜿çšããŠç®¡çããããšã§ç°¡åã«è¡ãããšãã§ããŸãã ããã«ã€ããŠã¯ãããããç¹å®ã® çŠç¹ãåœãŠãäžé£ã®ããã°èšäºã§åãäžããŠããŸãã
ãã®æåã®éšåã§ã¯ãPython ãµãŒãã¹/ããŒã«ãã³ã³ãããŒåããæ¹æ³ãšãã®ãã¹ã ãã©ã¯ãã£ã¹ã«ã€ããŠèª¬æããŸãã
å¿ èŠæ¡ä»¶
ãã® ããã°èšäºã·ãªãŒãºã§èª¬æããå 容ãç°¡åã«å®è¡ããã«ã¯ãã³ã³ããåãããç°å¢ãããŒã«ã«ã§ç®¡çããããã«å¿ èŠãªæå°éã®ããŒã«ã»ãããã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã
- Windows ãŸã㯠macOS: Docker Desktop ãã€ã³ã¹ããŒã«ãã
- Linux: Docker ãã€ã³ã¹ããŒã«ããŠãã Docker Compose ãã€ã³ã¹ããŒã«ãã
Python ãµãŒãã¹ãã³ã³ãããŒåãã
åçŽãª Flask ãµãŒãã¹ã䜿çšããŠãããè¡ãæ¹æ³ã瀺ããä»ã®ã³ã³ããŒãã³ããèšå®ããã«ã¹ã¿ã³ãã¢ãã³ã§å®è¡ã§ããããã«ããŸãã
server.py
from flask import Flask
server = Flask(__name__)
@server.route("/")
 def hello():
    return "Hello World!"
if __name__ == "__main__":
   server.run(host='0.0.0.0')
ãã®ããã°ã©ã ãå®è¡ããã«ã¯ãæåã«å¿ èŠãªãã¹ãŠã®äŸåé¢ä¿ãã€ã³ã¹ããŒã«ãããŠããããšã確èªããå¿ èŠããããŸãã äŸåé¢ä¿ã管çãã 1 ã€ã®æ¹æ³ã¯ãpip ãªã©ã®ããã±ãŒãž ã€ã³ã¹ããŒã©ãŒã䜿çšããããšã§ãã ãã®ããã«ã¯ãèŠä»¶.txtãã¡ã€ã«ãäœæãããã®äžã«äŸåé¢ä¿ãæžã蟌ãå¿ èŠããããŸãã åçŽãª server.py ã®ãã®ãããªãã¡ã€ã«ã®äŸã¯æ¬¡ã®ãšããã§ãã
requirements.txt
Flask==1.1.1
ããã§ãæ¬¡ã®æ§é ã«ãªããŸããã
app
ââââ requirements.txt
ââââ src
     ââââ server.py
ãœãŒã¹ã³ãŒãå°çšã®ãã£ã¬ã¯ããªãäœæããŠãä»ã®æ§æãã¡ã€ã«ããåé¢ããŸãã ãããè¡ãçç±ã¯åŸã§èª¬æããŸãã
Pythonããã°ã©ã ãå®è¡ããã«ã¯ãããšã¯Pythonã€ã³ã¿ããªã¿ãã€ã³ã¹ããŒã«ããŠå®è¡ããã ãã§ããÂ
ãã®ããã°ã©ã ã¯ããŒã«ã«ã§å®è¡ã§ããŸãã ããããããã¯ãç°ãªãç«¶åããèŠä»¶ãæã€ãããžã§ã¯ãéã§ç°¡åã«åãæ¿ããããšãã§ããã¯ãªãŒã³ãªæšæºéçºç°å¢ãç¶æãããšããéçºãã³ã³ããåããç®çã«åããŸãã
次ã«ããã®PythonãµãŒãã¹ãç°¡åã«ã³ã³ããåããæ¹æ³ã«ã€ããŠèª¬æããŸãã
ããã«ãŒãã¡ã€ã«Â
Python ã³ãŒããã³ã³ãããŒã§å®è¡ããæ¹æ³ã¯ãPython ã³ãŒãã Docker ã€ã¡ãŒãžãšããŠããã¯ããããã«åºã¥ããŠã³ã³ãããŒãå®è¡ããããšã§ãã æé ã以äžã«ã¹ã±ããããŸãã
Docker ã€ã¡ãŒãžãçæããã«ã¯ãã€ã¡ãŒãžã®ãã«ãã«å¿ èŠãªæé ãå«ã Dockerfile ãäœæããå¿ èŠããããŸãã ãã®åŸãããã«ãŒãã¡ã€ã«ã¯ãããã«ãŒã€ã¡ãŒãžãçæããããã«ãŒãã«ããŒã«ãã£ãŠåŠçãããŸãã æ¬¡ã«ãåçŽãª docker run ã³ãã³ãã䜿çšããŠãPython ãµãŒãã¹ã§ã³ã³ãããŒãäœæããŠå®è¡ããŸãã
ããã«ãŒãã¡ã€ã«ã®åæ
hello world Python ãµãŒãã¹çšã® Docker ã€ã¡ãŒãžãã¢ã»ã³ãã«ããããã®æé ãå«ã Dockerfile ã®äŸã¯æ¬¡ã®ãšããã§ãã
Dockerfile
# set base image (host OS)
FROM python:3.8
# set the working directory in the container
WORKDIR /code
# copy the dependencies file to the working directory
COPY requirements.txt .
# install dependencies
RUN pip install -r requirements.txt
# copy the content of the local src directory to the working directory
COPY src/ .
# command to run on container start
CMD [ "python", "./server.py" ]
Dockerfile ããã®åœä»€ãŸãã¯ã³ãã³ãããšã«ãDocker ãã«ããŒã¯ã€ã¡ãŒãž ã¬ã€ã€ãŒãçæãããããåã®ã¬ã€ã€ãŒã«ã¹ã¿ãã¯ããŸãã ãããã£ãŠãããã»ã¹ã®çµæãšããŠåŸãããDockerã€ã¡ãŒãžã¯ãç°ãªãã¬ã€ã€ãŒã®èªã¿åãå°çšã¹ã¿ãã¯ã«ãããŸããã
ãã«ãã³ãã³ãã®åºåã§ã¯ãDockerfileåœä»€ãã¹ããããšããŠå®è¡ãããŠããã®ã確èªã§ããŸãã
$ docker build -t myimage .
Sending build context to Docker daemon 6.144kB
Step 1/6 : FROM python:3.8
3.8.3-alpine: Pulling from library/python
âŠ
Status: Downloaded newer image for python:3.8.3-alpine
---> 8ecf5a48c789
Step 2/6 : WORKDIR /code
---> Running in 9313cd5d834d
Removing intermediate container 9313cd5d834d
---> c852f099c2f9
Step 3/6 : COPY requirements.txt .
---> 2c375052ccd6
Step 4/6 : RUN pip install -r requirements.txt
---> Running in 3ee13f767d05
âŠ
Removing intermediate container 3ee13f767d05
---> 8dd7f46dddf0
Step 5/6 : COPY ./src .
---> 6ab2d97e4aa1
Step 6/6 : CMD python server.py
---> Running in fbbbb21349be
Removing intermediate container fbbbb21349be
---> 27084556702b
Successfully built 70a92e92f3b5
Successfully tagged myimage:latest
次ã«ãã€ã¡ãŒãžãããŒã«ã«ã€ã¡ãŒãžã¹ãã¢ã«ããããšã確èªã§ããŸãã
$ docker images
REPOSITORYÂ Â Â Â TAGÂ Â Â Â Â Â Â IMAGE IDÂ Â Â Â Â Â Â Â CREATEDÂ Â Â Â Â Â Â Â Â Â SIZE
myimage       latest    70a92e92f3b5    8 seconds ago    991MB
éçºäžã«ãPython ãµãŒãã¹ã®ã€ã¡ãŒãžãè€æ°ååæ§ç¯ããå¿ èŠãããå Žåããããã§ããã ãæéãççž®ããå¿ èŠããããŸãã æ¬¡ã«ãããã«åœ¹ç«ã€å¯èœæ§ã®ããããã€ãã®ãã¹ããã©ã¯ãã£ã¹ãåæããŸãã
ããã«ãŒãã¡ã€ã«ã®éçºã®ãã¹ããã©ã¯ãã£ã¹
çŸåšãéçºãµã€ã¯ã«ãã¹ããŒãã¢ããããããã®ãã¹ããã©ã¯ãã£ã¹ã«çŠç¹ãåœãŠãŠããŸãã æ¬çªç°å¢ã«çŠç¹ãåœãŠããã®ã«ã€ããŠã¯ããã® ããã°æçš¿ ãš ããã¥ã¡ã³ã㧠詳ãã説æããŸãã
ããŒã¹ã€ã¡ãŒãž
Dockerfile ã®æåã®åœä»€ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®æ°ããã¬ã€ã€ãŒã远å ããåºæ¬ã€ã¡ãŒãžãæå®ããŸãã ããŒã¹ã€ã¡ãŒãžã®éžæã¯ããã®äžã«æ§ç¯ãããã¬ã€ã€ãŒã®å質ã«åœ±é¿ãäžããå¯èœæ§ããããããéåžžã«éèŠã§ããÂ
å¯èœã§ããã°ãäžè¬çã«é »ç¹ã«æŽæ°ãããã»ãã¥ãªãã£äžã®æžå¿µãå°ãªãå ¬åŒç»åãåžžã«äœ¿çšããå¿ èŠããããŸãã
åºæ¬ã€ã¡ãŒãžã®éžæã¯ãæçµçãªã€ã¡ãŒãžã®ãµã€ãºã«åœ±é¿ãäžããå¯èœæ§ããããŸãã ä»ã®èæ ®äºé ããããµã€ãºãåªå ããå Žåã¯ãéåžžã«å°ãããµã€ãºã§ãªãŒããŒãããã®äœãåºæ¬ã€ã¡ãŒãžã®äžéšã䜿çšã§ããŸãã ãããã®ç»åã¯éåžžã é«å±± ååžã«åºã¥ããŠãããããã«å¿ããŠã¿ã°ä»ããããŠããŸãã ãã ããPythonã¢ããªã±ãŒã·ã§ã³ã®å Žåãå ¬åŒã®Docker Pythonã€ã¡ãŒãžã®ã¹ãªã ããªã¢ã³ãã¯ãã»ãšãã©ã®å Žå(äŸ:. python:3.8-slim)ã
ãã«ããã£ãã·ã¥ã掻çšããããã®åœä»€é åºã®åé¡
ã€ã¡ãŒãžãé »ç¹ã«ãã«ãããå Žåã¯ããã«ããŒãã£ãã·ã¥ã¡ã«ããºã ã䜿çšããŠãåŸç¶ã®ãã«ããé«éåããå¿ èŠããããŸãã åè¿°ã®ããã«ãDockerfile åœä»€ã¯æå®ãããé åºã§å®è¡ãããŸãã åœä»€ããšã«ããã«ããŒã¯æåã«ãã£ãã·ã¥ããã§ãã¯ããŠãåå©çšããã€ã¡ãŒãžãæ¢ããŸãã ã¬ã€ã€ãŒã®å€æŽãæ€åºããããšããã®ã¬ã€ã€ãŒãšãã以éã®ãã¹ãŠã®ã¬ã€ã€ãŒãåæ§ç¯ãããŸãã
ãã£ãã·ã³ã°ã¡ã«ããºã ãå¹ççã«äœ¿çšããããã«ãé »ç¹ã«å€æŽãããã¬ã€ã€ãŒã®åœä»€ãã倿Žã®å°ãªãã¬ã€ã€ãŒã®åŸã«é 眮ããå¿ èŠããããŸãã
Dockerfile ã®äŸã確èªããŠãåœä»€ã®é åºããã£ãã·ã¥ã«ã©ã®ããã«åœ±é¿ããããçè§£ããŸãããã è峿·±ãè¡ã¯ä»¥äžã®ãã®ã§ãã
...
# copy the dependencies file to the working directory
COPY requirements.txt .
# install dependencies
RUN pip install -r requirements.txt
# copy the content of the local src directory to the working directory
COPY src/ .
...
éçºäžãã¢ããªã±ãŒã·ã§ã³ã®äŸåé¢ä¿ã¯ Python ã³ãŒããããé »ç¹ã«å€æŽãããŸããã ãã®ãããã³ãŒã1ã®åã®ã¬ã€ã€ãŒã«äŸåé¢ä¿ãã€ã³ã¹ããŒã«ããããšãéžæããŸãã ãããã£ãŠãäŸåé¢ä¿ãã¡ã€ã«ãã³ããŒããŠã€ã³ã¹ããŒã«ããŠããããœãŒã¹ã³ãŒããã³ããŒããŸãã ãããããœãŒã¹ã³ãŒãããããžã§ã¯ãæ§é ã®å°çšãã£ã¬ã¯ããªã«åé¢ããäž»ãªçç±ã§ãã
ãã«ãã¹ããŒãžãã«ãÂ
ããã¯éçºæã«ã¯ããŸã圹ã«ç«ããªããããããŸããããéçºãå®äºãããã³ã³ããåãããPythonã¢ããªã±ãŒã·ã§ã³ãåºè·ããã®ã«è峿·±ãã®ã§ãããã«èª¬æããŸããÂ
ãã«ãã¹ããŒãžãã«ãã䜿çšããéã«ç§ãã¡ãæ±ããŠããã®ã¯ãäžèŠãªãã¡ã€ã«ãšãœãããŠã§ã¢ããã±ãŒãžããã¹ãŠæçµçãªã¢ããªã±ãŒã·ã§ã³ã€ã¡ãŒãžããåãé€ããPythonã³ãŒãã®å®è¡ã«å¿ èŠãªãã¡ã€ã«ã®ã¿ãé ä¿¡ããããšã§ãã åã®äŸã®ãã«ãã¹ããŒãž Dockerfile ã®ç°¡åãªäŸã¯æ¬¡ã®ãšããã§ãã
# first stage
FROM python:3.8 AS builder
COPY requirements.txt .
# install dependencies to the local user directory (eg. /root/.local)
RUN pip install --user -r requirements.txt
# second unnamed stage
FROM python:3.8-slim
WORKDIR /code
# copy only the dependencies installation from the 1st stage image
COPY --from=builder /root/.local /root/.local
COPY ./src .
# update PATH environment variable
ENV PATH=/root/.local:$PATH
CMD [ "python", "./server.py" ]
2 段éã®ãã«ãããããæåã®ãã«ãã®ã¿ã ãã«ããŒãšããŠæå®ããŠããããšã«æ³šæããŠãã ããã FROM åœä»€ã« AS
ãã®çµæãã¢ããªã±ãŒã·ã§ã³ã®æçµçãªç»åãã¹ãªã ã«ãªããŸãã
$ docker images
REPOSITORYÂ Â Â Â TAGÂ Â Â Â Â Â IMAGE IDÂ Â Â Â Â Â Â CREATEDÂ Â Â Â Â Â Â Â Â SIZE
myimage       latest   70a92e92f3b5   2 hours ago     991MB
multistage    latest   e598271edefa   6 minutes ago   197MB
âŠ
ãã®äŸã§ã¯ã pip ã® âuser ãªãã·ã§ã³ã䜿çšããŠãããŒã«ã« ãŠãŒã¶ãŒ ãã£ã¬ã¯ããªãžã®äŸåé¢ä¿ãã€ã³ã¹ããŒã«ãããã®ãã£ã¬ã¯ããªãæçµçãªã€ã¡ãŒãžã«ã³ããŒããŸãã ãã ããvirtualenvãããã±ãŒãžããã€ãŒã«ãšããŠæ§ç¯ããããããã³ããŒããŠæçµã€ã¡ãŒãžã«ã€ã³ã¹ããŒã«ãããªã©ãä»ã®ãœãªã¥ãŒã·ã§ã³ãå©çšã§ããŸãã
ã³ã³ãããŒãå®è¡ãã
Dockerfile ãæžã蟌ã¿ãããããã€ã¡ãŒãžããã«ãããããPython ãµãŒãã¹ã䜿çšããŠã³ã³ãããŒãå®è¡ã§ããŸãã
$ docker images
REPOSITORYÂ Â Â TAGÂ Â Â Â Â Â IMAGE IDÂ Â Â Â Â Â Â CREATEDÂ Â Â Â Â Â Â SIZE
myimage      latest   70a92e92f3b5   2 hours ago   991MB
...
$ docker ps
CONTAINER IDÂ Â Â IMAGEÂ Â Â COMMANDÂ Â Â CREATEDÂ Â Â STATUSÂ Â Â PORTSÂ Â Â NAMES
$ docker run -d -p 5000:5000 myimage
befb1477c1c7fc31e8e8bb8459fe05bcbdee2df417ae1d7c1d37f371b6fbf77f
ããã§ãhello worldãµãŒããŒãã³ã³ããåããlocalhostã«ããããããããŒããç §äŒã§ããããã«ãªããŸããã
$ docker ps
CONTAINERÂ Â Â Â Â IDÂ Â Â Â Â Â Â Â IMAGEÂ Â Â Â Â Â Â Â COMMANDÂ Â Â Â Â Â Â Â PORTSÂ Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â ...
befb1477c1c7  myimage   "/bin/sh -c  'python ..."   0.0.0.0:5000->5000/tcp  ...
$ curl http://localhost:5000
"Hello World!"
次ã¯äœã§ãã?
ãã®æçš¿ã§ã¯ãéçºãšã¯ã¹ããªãšã³ã¹ãåäžãããããã« Python ãµãŒãã¹ãã³ã³ãããŒåããæ¹æ³ã瀺ããŸããã ã³ã³ããåã¯ãä»ã®ãã©ãããã©ãŒã ã§ç°¡åã«åçŸã§ããæ±ºå®è«çãªçµæãæäŸããã ãã§ãªããäŸåé¢ä¿ã®ç«¶åãåé¿ããã¯ãªãŒã³ãªæšæºéçºç°å¢ãç¶æããããšãå¯èœã«ããŸãã ã³ã³ãããŒåãããéçºç°å¢ã¯ãæšæºç°å¢ã倿Žããããšãªãç°¡åã«ãããã€ã§ããããã管çã容æã§ãä»ã®éçºè ãšå ±æã§ããŸãã Â
ãã®ã·ãªãŒãºã®æ¬¡ã®æçš¿ã§ã¯ãPython ã³ã³ããŒãã³ããä»ã®å€éšã³ã³ããŒãã³ãã«æ¥ç¶ãããŠããã³ã³ãããŒããŒã¹ã®ãã«ããµãŒãã¹ ãããžã§ã¯ããã»ããã¢ããããæ¹æ³ãšãããããã¹ãŠã®ãããžã§ã¯ã ã³ã³ããŒãã³ãã®ã©ã€ããµã€ã¯ã«ã Docker Compose ã§ç®¡çããæ¹æ³ã玹ä»ããŸãã
ãªãœãŒã¹
- ããã«ãŒãã¡ã€ã«ãäœæããããã®ãã¹ã ãã©ã¯ãã£ã¹
- Docker Desktop