44 KiB
ã³ã³ããå ã®FastAPI - Docker
FastAPIã¢ããªã±ãŒã·ã§ã³ããããã€ããå Žåãäžè¬çãªã¢ãããŒãã¯Linuxã³ã³ããã»ã€ã¡ãŒãžããã«ãããããšã§ãã
åºæ¬çã«ã¯ DockerãçšããŠè¡ãããŸããçæãããã³ã³ããã»ã€ã¡ãŒãžã¯ãããã€ãã®æ¹æ³ã®ããããã§ãããã€ã§ããŸãã
Linuxã³ã³ããã®äœ¿çšã«ã¯ãã»ãã¥ãªãã£ãå埩å¯èœæ§ïŒã¬ããªã«ããªãã£ïŒãã·ã³ããªã·ãã£ãªã©ãããã€ãã®å©ç¹ããããŸãã
!!! tip
TODO: ãªããé·ç§»ã§ããªã
ãæ¥ãã§ããã§ã«ãããã®æ
å ±ããåãã§ããïŒ ä»¥äžã®Dockerfileã®ç®æðãžãžã£ã³ãããŠãã ããã
Dockerfile ãã¬ãã¥ãŒ ð
FROM python:3.9
WORKDIR /code
COPY ./requirements.txt /code/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
COPY ./app /code/app
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
# If running behind a proxy like Nginx or Traefik add --proxy-headers
# CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80", "--proxy-headers"]
ã³ã³ãããšã¯äœã
ã³ã³ããïŒäž»ã«Linuxã³ã³ããïŒã¯ãåãã·ã¹ãã å ã®ä»ã®ã³ã³ããïŒä»ã®ã¢ããªã±ãŒã·ã§ã³ãã³ã³ããŒãã³ãïŒããéé¢ãããç¶æ ãä¿ã¡ãªããããã¹ãŠã®äŸåé¢ä¿ãå¿ èŠãªãã¡ã€ã«ãå«ãã¢ããªã±ãŒã·ã§ã³ãããã±ãŒãžåããéåžžã«è»œéãªæ¹æ³ã§ãã
Linuxã³ã³ããã¯ããã¹ãïŒãã·ã³ãä»®æ³ãã·ã³ãã¯ã©ãŠããµãŒããŒãªã©ïŒã®åãLinuxã«ãŒãã«ã䜿çšããŠå®è¡ãããŸããããã¯ãïŒOSå šäœããšãã¥ã¬ãŒãããå®å šãªä»®æ³ãã·ã³ãšæ¯ã¹ãŠïŒéåžžã«è»œéã§ããããšãæå³ããŸãã
ãã®ããã«ãã³ã³ããã¯ãªãœãŒã¹ãã»ãšãã©æ¶è²»ããŸããããããã»ã¹ãçŽæ¥å®è¡ããã®ã«å¹æµããéã§ãïŒä»®æ³ãã·ã³ã¯ãã£ãšæ¶è²»ããŸãïŒã
ã³ã³ããã¯ãŸããç¬èªã®åé¢ãããå®è¡ããã»ã¹ïŒéåžžã¯1ã€ã®ããã»ã¹ã®ã¿ïŒãããã¡ã€ã«ã·ã¹ãã ããããã¯ãŒã¯ãæã¡ãŸãã ãã®ããšã¯ãããã€ãã»ãã¥ãªãã£ãéçºãªã©ãç°¡çŽ åãããŸãã
ã³ã³ããã»ã€ã¡ãŒãžãšã¯äœã
ã³ã³ããã¯ãã³ã³ããã»ã€ã¡ãŒãžããå®è¡ãããŸãã
ã³ã³ããã»ã€ã¡ãŒãžã¯ãã³ã³ããå ã«ååšãã¹ããã¹ãŠã®ãã¡ã€ã«ãç°å¢å€æ°ããããŠããã©ã«ãã®ã³ãã³ã/ããã°ã©ã ãéçã«ããŒãžã§ã³åãããã®ã§ãã ããã§ã®éçãšã¯ãã³ã³ããã€ã¡ãŒãžã¯å®è¡ãããŠããããããã±ãŒãžåããããã¡ã€ã«ãšã¡ã¿ããŒã¿ã®ã¿ã§ããããšãæå³ããŸãã
ä¿åãããéçã³ã³ãã³ãã§ãããã³ã³ããã€ã¡ãŒãžããšã¯å¯Ÿç §çã«ããã³ã³ãããã¯éåžžãå®è¡äžã®ã€ã³ã¹ã¿ã³ã¹ãã€ãŸãå®è¡ãããŠãããã®ãæããŸãã
ã³ã³ãããèµ·åããå®è¡ããããšãïŒã³ã³ããã€ã¡ãŒãžããèµ·åããããšãïŒããã¡ã€ã«ãç°å¢å€æ°ãªã©ãäœæãããã倿Žããããããå¯èœæ§ããããŸãã
ãããã®å€æŽã¯ãã®ã³ã³ããå ã«ã®ã¿ååšããŸãããåºç€ãšãªãã³ã³ããã»ã€ã¡ãŒãžã«ã¯æ®ããŸããïŒãã£ã¹ã¯ã«ä¿åãããŸããïŒã
ã³ã³ããã€ã¡ãŒãžã¯ ããã°ã©ã ãã¡ã€ã«ããã®å
容ãäŸãã° python ãš main.py ãã¡ã€ã«ã«å¹æµããŸãã
ãããŠãã³ã³ããèªäœã¯ïŒã³ã³ããã€ã¡ãŒãžãšã¯å¯Ÿç §çã«ïŒã€ã¡ãŒãžãããšã«ããå®éã®å®è¡äžã®ã€ã³ã¹ã¿ã³ã¹ã§ãããããã»ã¹ã«å¹æµããŸãã
å®éãã³ã³ãããå®è¡ãããŠããã®ã¯ãããã»ã¹ãå®è¡ãããŠãããšãã ãã§ãïŒéåžžã¯åäžã®ããã»ã¹ã ãã§ãïŒã ã³ã³ããå ã§å®è¡äžã®ããã»ã¹ããªãå Žåãã³ã³ããã¯åæ¢ããŸãã
ã³ã³ããã»ã€ã¡ãŒãž
Dockerã¯ãã³ã³ããã»ã€ã¡ãŒãžãšã³ã³ãããäœæã»ç®¡çããããã®äž»èŠãªããŒã«ã®1ã€ã§ãã
ãããŠãDockerã«ã¯Dockerã€ã¡ãŒãžïŒã³ã³ããïŒãå ±æããDocker Hubãšãããã®ããããŸãã
Docker Hub㯠å€ãã®ããŒã«ãç°å¢ãããŒã¿ããŒã¹ãã¢ããªã±ãŒã·ã§ã³ã«å¯Ÿå¿ããŠããäºãäœæãããå ¬åŒã®ã³ã³ããã»ã€ã¡ãŒãžããããªãã¯ã«æäŸããŠããŸãã
äŸãã°ãå ¬åŒã€ã¡ãŒãžã®1ã€ã«Python ImageããããŸãã
ãã®ä»ã«ããããŒã¿ããŒã¹ãªã©ããŸããŸãªã€ã¡ãŒãžããããŸãïŒ
- PostgreSQL
- MySQL
- MongoDB
- Redis, etc.
äºãäœæãããã³ã³ããã»ã€ã¡ãŒãžã䜿çšããããšã§ãç°ãªãããŒã«ãçµã¿åãããŠäœ¿çšããããšãéåžžã«ç°¡åã«ãªããŸããäŸãã°ãæ°ããããŒã¿ããŒã¹ã詊ãå Žåã«ç¹ã«äŸ¿å©ã§ããã»ãšãã©ã®å Žåãå ¬åŒã€ã¡ãŒãžã䜿ããç°å¢å€æ°ã§èšå®ããã ãã§è¯ãã§ãã
ããããã°å€ãã®å Žåãã³ã³ãããšDockerã«ã€ããŠåŠã³ããã®ç¥èãããŸããŸãªããŒã«ãã³ã³ããŒãã³ãã«ãã£ãŠåå©çšããããšãã§ããŸãã
ã€ãŸããããŒã¿ããŒã¹ãPythonã¢ããªã±ãŒã·ã§ã³ãReactããã³ããšã³ãã»ã¢ããªã±ãŒã·ã§ã³ãåãããŠã§ãã»ãµãŒããŒãªã©ãããŸããŸãªãã®ãè€æ°ã®ã³ã³ããã§å®è¡ããããããå éšãããã¯ãŒã¯çµç±ã§æ¥ç¶ããŸãã
ãã¹ãŠã®ã³ã³ãã管çã·ã¹ãã ïŒDockerãKubernetesãªã©ïŒã«ã¯ããããããããã¯ãŒãã³ã°æ©èœãçµ±åãããŠããŸãã
ã³ã³ãããšããã»ã¹
éåžžãã³ã³ããã»ã€ã¡ãŒãžã¯ãã®ã¡ã¿ããŒã¿ã«ã³ã³ããã®èµ·åæã«å®è¡ãããããã©ã«ãã®ããã°ã©ã ãŸãã¯ã³ãã³ããšããã®ããã°ã©ã ã«æž¡ããããã©ã¡ãŒã¿ãå«ã¿ãŸããã³ãã³ãã©ã€ã³ã§ã®æäœãšãã䌌ãŠããŸãã
ã³ã³ãããèµ·åããããšããã®ã³ãã³ã/ããã°ã©ã ãå®è¡ãããŸãïŒãã ããå¥ã®ã³ãã³ã/ããã°ã©ã ããªãŒããŒã©ã€ãããŠå®è¡ãããããšãã§ããŸãïŒã
ã³ã³ããã¯ãã¡ã€ã³ã»ããã»ã¹ïŒã³ãã³ããŸãã¯ããã°ã©ã ïŒãå®è¡ãããŠããéãå®è¡ãããŸãã
ã³ã³ããã¯éåžž1ã€ã®ããã»ã¹ãæã¡ãŸãããã¡ã€ã³ã»ããã»ã¹ãããµãã»ããã»ã¹ãèµ·åããããšãå¯èœã§ãããããã°åãã³ã³ããå ã«è€æ°ã®ããã»ã¹ãæã€ããšã«ãªããŸãã
ããããå°ãªããšã1ã€ã®å®è¡äžã®ããã»ã¹ããªããã°ãå®è¡äžã®ã³ã³ãããæã€ããšã¯ã§ããªãã§ããã¡ã€ã³ã»ããã»ã¹ã忢ããã°ãã³ã³ããã忢ããŸãã
Build a Docker Image for FastAPI
ãšããããšã§ãäœãäœããŸãããïŒð
FastAPIçšã®Dockerã€ã¡ãŒãžããå ¬åŒPythonã€ã¡ãŒãžã«åºã¥ããŠãŒããããã«ãããæ¹æ³ããèŠãããŸãã
ããã¯ã»ãšãã©ã®å Žåã«ããããããšã§ããäŸãã°ïŒ
- KubernetesãŸãã¯åæ§ã®ããŒã«ã䜿çšããå Žå
- Raspberry Piã§å®è¡ããå Žå
- ã³ã³ããã»ã€ã¡ãŒãžãå®è¡ããŠãããã¯ã©ãŠãã»ãµãŒãã¹ãªã©ãå©çšããå Žå
ããã±ãŒãžèŠä»¶ïŒpackage requirementsïŒ
ã¢ããªã±ãŒã·ã§ã³ã®ããã±ãŒãžèŠä»¶ã¯éåžžãäœããã®ãã¡ã€ã«ã«èšè¿°ãããŠããã¯ãã§ãã
ããã±ãŒãžèŠä»¶ã¯äž»ã«ã€ã³ã¹ããŒã«ããããã«äœ¿çšããããŒã«ã«äŸåããã§ãããã
æãäžè¬çãªæ¹æ³ã¯ãrequirements.txt ãã¡ã€ã«ã«ããã±ãŒãžåãšãã®ããŒãžã§ã³ã 1 è¡ãã€æžãããšã§ãã
ãã¡ãããFastAPI ããŒãžã§ã³ã«ã€ããŠ{.internal-link target=_blank}ã§èªãã ã®ãšåãã¢ã€ãã¢ã䜿çšããŠãããŒãžã§ã³ã®ç¯å²ãèšå®ããŸãã
äŸãã°ãrequirements.txt ã¯æ¬¡ã®ããã«ãªããŸãïŒ
fastapi>=0.68.0,<0.69.0
pydantic>=1.8.0,<2.0.0
uvicorn>=0.15.0,<0.16.0
ãããŠéåžžãäŸãã° pip ã䜿ã£ãŠãããã®ããã±ãŒãžã®äŸåé¢ä¿ãã€ã³ã¹ããŒã«ããŸãïŒ
$ pip install -r requirements.txt
---> 100%
Successfully installed fastapi pydantic uvicorn
!!! info ããã±ãŒãžã®äŸåé¢ä¿ãå®çŸ©ãã€ã³ã¹ããŒã«ããããã®ãã©ãŒããããããŒã«ã¯ä»ã«ããããŸãã
Poetryã䜿ã£ãäŸã¯ãåŸè¿°ããã»ã¯ã·ã§ã³ã§ã玹ä»ããŸããð
FastAPIã³ãŒããäœæãã
appãã£ã¬ã¯ããªãäœæãããã®äžã«å ¥ããŸã- 空ã®ãã¡ã€ã«
__init__.pyãäœæããŸã main.pyãã¡ã€ã«ãäœæããŸãïŒ
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
Dockerfile
åããããžã§ã¯ãã»ãã£ã¬ã¯ããªã«Dockerfileãšãããã¡ã€ã«ãäœæããŸãïŒ
# (1)
FROM python:3.9
# (2)
WORKDIR /code
# (3)
COPY ./requirements.txt /code/requirements.txt
# (4)
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
# (5)
COPY ./app /code/app
# (6)
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
-
å ¬åŒã®PythonããŒã¹ã€ã¡ãŒãžããå§ããŸã
-
çŸåšã®äœæ¥ãã£ã¬ã¯ããªã
/codeã«èšå®ããŸãããã«
requirements.txtãã¡ã€ã«ãšappãã£ã¬ã¯ããªã眮ããŸãã -
èŠä»¶ãæžããããã¡ã€ã«ã
/codeãã£ã¬ã¯ããªã«ã³ããŒããŸãæ®ãã®ã³ãŒãã§ã¯ãªããæåã«å¿ èŠãªãã¡ã€ã«ã ããã³ããŒããŠãã ããã
ãã®ãã¡ã€ã«ã¯é »ç¹ã«ã¯å€æŽãããªãã®ã§ãDockerã¯ãã®ã¹ãããã§ã¯ãããæ€ç¥ããã£ãã·ã¥ã䜿çšããæ¬¡ã®ã¹ãããã§ããã£ãã·ã¥ãæå¹ã«ããŸãã
-
èŠä»¶ãã¡ã€ã«ã«ããããã±ãŒãžã®äŸåé¢ä¿ãã€ã³ã¹ããŒã«ããŸã
--no-cache-dirãªãã·ã§ã³ã¯ããŠã³ããŒãããããã±ãŒãžãããŒã«ã«ã«ä¿åããªãããã«pipã«æç€ºããŸããããã¯ãåãããã±ãŒãžãã€ã³ã¹ããŒã«ããããã«pipãå床å®è¡ããå Žåã«ã®ã¿æå¹ã§ãããã³ã³ããã§äœæ¥ããå Žåã¯ããã§ã¯ãªãã§ãã!!! note
--no-cache-dirã¯pipã«é¢é£ããŠããã ãã§ãDockerãã³ã³ãããšã¯äœã®é¢ä¿ããªãã§ãã--upgradeãªãã·ã§ã³ã¯ãããã±ãŒãžãæ¢ã«ã€ã³ã¹ããŒã«ãããŠããå Žåãpipã«ã¢ããã°ã¬ãŒãããããã«æç€ºããŸããäœæ ãªããã¡ã€ã«ãã³ããŒããåã®ã¹ãããã¯Dockerãã£ãã·ã¥ã«ãã£ãŠæ€åºãããå¯èœæ§ãããããã§ããããã®ã¹ããããå©çšå¯èœãªå Žåã¯Dockerãã£ãã·ã¥ã䜿çšããŸãã
ãã®ã¹ãããã§ãã£ãã·ã¥ã䜿çšãããšãéçºäžã«ã€ã¡ãŒãžãäœåºŠããã«ãããéã«ãæ¯åãã¹ãŠã®äŸåé¢ä¿ãããŠã³ããŒãããŠã€ã³ã¹ããŒã«ãã代ããã«å€ãã®æéãç¯çŽã§ããŸãã
-
./app
ãã£ã¬ã¯ããªã/code` ãã£ã¬ã¯ããªã®äžã«ã³ããŒãããããã«ã¯æãé »ç¹ã«å€æŽããããã¹ãŠã®ã³ãŒããå«ãŸããŠãããããDockerã®ãã£ãã·ã¥ã¯ãã以éã®ã¹ãããã«ç°¡åã«äœ¿çšãããããšã¯ãããŸããã
ãã®ãããã³ã³ããã€ã¡ãŒãžã®ãã«ãæéãæé©åããããã«ã
Dockerfileã® æåŸ ã«ããã眮ãããšãéèŠã§ãã -
uvicornãµãŒããŒãå®è¡ããããã®ã³ãã³ããèšå®ããŸãCMDã¯æååã®ãªã¹ããåããããããã®æååã¯ã¹ããŒã¹ã§åºåãããã³ãã³ãã©ã€ã³ã«å ¥åãããã®ã§ãããã®ã³ãã³ã㯠çŸåšã®äœæ¥ãã£ã¬ã¯ããªããå®è¡ãããäžèšã®
WORKDIR /codeã«ãŠèšå®ãã/codeãã£ã¬ã¯ããªãšåãã§ãããã®ããããã°ã©ã ã¯
/codeã§éå§ããã®äžã«ããªãã®ã³ãŒãããã./appãã£ã¬ã¯ããªãããã®ã§ãUvicorn ã¯app.mainããappãåç §ããã€ã³ããŒã ããããšãã§ããŸãã
!!! tip ã³ãŒãå ã®"+"ã®å¹ãåºããã¯ãªãã¯ããŠãåè¡ãäœãããã®ããã¬ãã¥ãŒããŠãã ãããð
ããã§ã次ã®ãããªãã£ã¬ã¯ããªæ§é ã«ãªãã¯ãã§ãïŒ
.
âââ app
â  âââ __init__.py
â âââ main.py
âââ Dockerfile
âââ requirements.txt
TLS Termination Proxyã®è£åŽ
Nginx ã Traefik ã®ãã㪠TLS Termination Proxy (ããŒããã©ã³ãµ) ã®åŸãã§ã³ã³ãããåãããŠããå Žåã¯ã--proxy-headersãªãã·ã§ã³ã远å ããŸãã
ãã®ãªãã·ã§ã³ã¯ãUvicornã«ãããã·çµç±ã§HTTPSã§åäœããŠããã¢ããªã±ãŒã·ã§ã³ã«å¯ŸããŠãéä¿¡ãããããããä¿¡é Œããããæç€ºããŸãã
CMD ["uvicorn", "app.main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "80"]
Dockerãã£ãã·ã¥
ãã®Dockerfileã«ã¯éèŠãªããªãã¯ãããããŸãäŸåé¢ä¿ã ãã®ãã¡ã€ã«ãã³ããŒããŸãããã®çç±ã説æããŸãã
COPY ./requirements.txt /code/requirements.txt
Dockerãä»ã®ããŒã«ã¯ããããã®ã³ã³ããã€ã¡ãŒãžã段éçã«ãã«ããã1ã€ã®ã¬ã€ã€ãŒãä»ã®ã¬ã€ã€ãŒã®äžã«è¿œå ããŸããDockerfileã®å
é ããéå§ããDockerfileã®ååœä»€ã«ãã£ãŠäœæããããã¡ã€ã«ã远å ããŠãããŸãã
Dockerãåæ§ã®ããŒã«ã¯ãã€ã¡ãŒãžããã«ãããéã«å éšãã£ãã·ã¥ã䜿çšããŸããååã³ã³ããã€ã¡ãŒãžãæ§ç¯ãããšããããã¡ã€ã«ã倿ŽãããŠããªãå Žåããã¡ã€ã«ãå床ã³ããŒããŠãŒãããæ°ããã¬ã€ã€ãŒãäœæãã代ããã«ãååäœæããåãã¬ã€ã€ãŒãåå©çšããŸãã
ãã ãã¡ã€ã«ã®ã³ããŒãé¿ããã ãã§ã¯ããŸãæ¹åãããŸãããããã®ã¹ãããã§ãã£ãã·ã¥ãå©çšãããããæ¬¡ã®ã¹ãããã§ãã£ãã·ã¥ã䜿ãããšãã§ããŸãã
äŸãã°ãäŸåé¢ä¿ãã€ã³ã¹ããŒã«ããåœä»€ã®ããã«ãã£ãã·ã¥ã䜿ãããšãã§ããŸãïŒ
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
ããã±ãŒãžèŠä»¶ã®ãã¡ã€ã«ã¯é »ç¹ã«å€æŽãããããšã¯ãããŸããããã®ããããã®ãã¡ã€ã«ã ããã³ããŒããããšã§ãDockerã¯ãã®ã¹ãããã§ã¯ãã£ãã·ã¥ã䜿çšããããšãã§ããŸãã
ãããŠãDockerã¯æ¬¡ã®ã¹ãããã®ããã«ãã£ãã·ã¥ã䜿çšãããããã®äŸåé¢ä¿ãããŠã³ããŒãããŠã€ã³ã¹ããŒã«ããããšãã§ããŸãããããŠãããã§å€ãã®æéãç¯çŽããŸããâš ...ãããŠéå±ãªåŸ ã¡æéãé¿ããããšãã§ããŸããðªð
ããã±ãŒãžã®äŸåé¢ä¿ãããŠã³ããŒãããŠã€ã³ã¹ããŒã«ããã«ã¯æ°åããããŸããããã£ãã·ã¥ã䜿ãã°ããããæ°ç§ã§ãã
å ããŠãéçºäžã«ã³ã³ããã»ã€ã¡ãŒãžãäœåºŠããã«ãããŠãã³ãŒãã®å€æŽãæ©èœããŠãããã©ããããã§ãã¯ããããšã«ãªããããå€ãã®æéãç¯çŽããããšãã§ããŸãã
ãããŠDockerfileã®æçµè¡ã®è¿ãã§ãã¹ãŠã®ã³ãŒããã³ããŒããŸãããã®çç±ã¯ãæãé »ç¹ã«å€æŽããããã®ãªã®ã§ããã®ã¹ãããã®åŸã«ãããã®ã¯ã»ãšãã©ãã£ãã·ã¥ã䜿çšããããšãã§ããªãã®ããã§ãã
COPY ./app /code/app
Dockerã€ã¡ãŒãžããã«ããã
ãã¹ãŠã®ãã¡ã€ã«ãæã£ãã®ã§ãã³ã³ããã»ã€ã¡ãŒãžããã«ãããŸãããã
- ãããžã§ã¯ããã£ã¬ã¯ããªã«ç§»åããŸãïŒ
Dockerfileãããå Žæã§ãappãã£ã¬ã¯ããªããããŸãïŒ - FastAPI ã€ã¡ãŒãžããã«ãããŸãïŒ
$ docker build -t myimage .
---> 100%
!!! tip
æ«å°Ÿã® . ã«æ³šç®ããŠã»ããã§ãããã㯠./ ãšåãæå³ã§ãã ããã¯Dockerã«ã³ã³ããã€ã¡ãŒãžã®ãã«ãã«äœ¿çšãããã£ã¬ã¯ããªãæç€ºããŸãã
ãã®å Žåãåãã«ã¬ã³ãã»ãã£ã¬ã¯ããª(`.`)ã§ãã
Dockerã³ã³ããã®èµ·åãã
- ã€ã¡ãŒãžã«åºã¥ããŠã³ã³ãããå®è¡ããŸãïŒ
$ docker run -d --name mycontainer -p 80:80 myimage
確èªãã
Dockerã³ã³ããã®http://192.168.99.100/items/5?q=somequery ã http://127.0.0.1/items/5?q=somequery (ãŸãã¯ããã«çžåœããDockerãã¹ãã䜿çšãããã®ïŒãšãã£ãURLã§ç¢ºèªã§ããã¯ãã§ãã
ã¢ã¯ã»ã¹ãããšä»¥äžã®ãããªãã®ã衚瀺ãããŸãïŒ
{"item_id": 5, "q": "somequery"}
ã€ã³ã¿ã©ã¯ãã£ããªAPIããã¥ã¡ã³ã
ãããã®URLã«ãã¢ã¯ã»ã¹ã§ããŸã: http://192.168.99.100/docs ã http://127.0.0.1/docs (ãŸãã¯ããã«çžåœããDockerãã¹ãã䜿çšãããã®ïŒ
ã¢ã¯ã»ã¹ãããšãèªå察話åAPIããã¥ã¡ã³ãïŒSwagger UIãæäŸïŒã衚瀺ãããŸãïŒ
代æ¿ã®APIããã¥ã¡ã³ã
ãŸããhttp://192.168.99.100/redoc ã http://127.0.0.1/redoc (ãŸãã¯ããã«çžåœããDockerãã¹ãã䜿çšãããã®ïŒã«ãã¢ã¯ã»ã¹ã§ããŸãã
代æ¿ã®èªåããã¥ã¡ã³ãïŒReDocã«ãã£ãŠæäŸãããïŒã衚瀺ãããŸãïŒ
åäžãã¡ã€ã«ã®FastAPIã§Dockerã€ã¡ãŒãžããã«ããã
FastAPI ãåäžã®ãã¡ã€ã«ãäŸãã° ./app ãã£ã¬ã¯ããªã®ãªã main.py ã®å Žåããã¡ã€ã«æ§é ã¯æ¬¡ã®ããã«ãªããŸãïŒ
.
âââ Dockerfile
âââ main.py
âââ requirements.txt
ããããã°ãDockerfileã®äžã«ãã¡ã€ã«ãã³ããŒããããã«ã察å¿ãããã¹ã倿Žããã ãã§ããã§ãïŒ
FROM python:3.9
WORKDIR /code
COPY ./requirements.txt /code/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
# (1)
COPY ./main.py /code/
# (2)
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]
-
main.py
ãã¡ã€ã«ã/code` ãã£ã¬ã¯ããªã«çŽæ¥ã³ããŒããŸãã -
Uvicornãå®è¡ãã
mainããappãªããžã§ã¯ããã€ã³ããŒãããããã«æç€ºããŸãïŒapp.mainããã€ã³ããŒãããã®ã§ã¯ãªãïŒã
次ã«Uvicornã³ãã³ãã調æŽããŠãapp.main ã®ä»£ããã«æ°ããã¢ãžã¥ãŒã« main ã䜿çšããFastAPIãªããžã§ã¯ãã§ãã app ãã€ã³ããŒãããŸãã
ãããã€ã¡ã³ãã®ã³ã³ã»ãã
ã³ã³ãããšãã芳ç¹ããããããã€ã®ã³ã³ã»ãã{.internal-link target=_blank}ã«å ±éããããã€ãã«ã€ããŠãããäžåºŠèª¬æããŸãããã
ã³ã³ããã¯äž»ã«ãã¢ããªã±ãŒã·ã§ã³ã®ãã«ããšãããã€ã®ããã»ã¹ãç°¡çŽ åããããã®ããŒã«ã§ããããããã®ãããã€ã®ã³ã³ã»ãããæ±ãããã®ç¹å®ã®ã¢ãããŒãã匷å¶ãããã®ã§ã¯ãªãã§ãã
è¯ããã¥ãŒã¹ã¯ãããããã®ç°ãªãæŠç¥ã«ã¯ããã¹ãŠã®ãããã€ã¡ã³ãã®ã³ã³ã»ãããã«ããŒããæ¹æ³ããããšããããšã§ããð
ãããã®ãããã€ã¡ã³ãã®ã³ã³ã»ãããã³ã³ããã®èгç¹ããèŠçŽããŠã¿ãŸãããïŒ
- ã»ãã¥ãªã㣠- HTTPS
- èµ·åæã®å®è¡
- åèµ·å
- ã¬ããªã±ãŒã·ã§ã³ïŒå®è¡äžã®ããã»ã¹æ°ïŒ
- ã¡ã¢ãª
- éå§åã®äºåã¹ããã
HTTPS
FastAPI ã¢ããªã±ãŒã·ã§ã³ã® ã³ã³ããã»ã€ã¡ãŒãžïŒããã³åŸã§å®è¡äžã® ã³ã³ããïŒã ãã«çŠç¹ãåœãŠããšãéåžžãHTTPSã¯å¥ã®ããŒã«ãçšããŠå€éšã§åŠçãããŸãã
äŸãã°Traefikã®ããã«ãHTTPSãšèšŒææžã®èªåååŸãæ±ãå¥ã®ã³ã³ããã§ããå¯èœæ§ããããŸãã
!!! tip Traefikã¯DockerãKubernetesãªã©ãšçµ±åãããŠããã®ã§ãã³ã³ããçšã®HTTPSã®èšå®ãæ§æã¯ãšãŠãç°¡åã§ãã
ãããã¯ãïŒã³ã³ããå ã§ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããªããïŒã¯ã©ãŠãã»ãããã€ããŒããµãŒãã¹ã®1ã€ãšããŠHTTPSãåŠçããããšãã§ããŸãã
èµ·åæããã³åèµ·åæã®å®è¡
éåžžãã³ã³ããã®èµ·åãšå®è¡ãæ åœããå¥ã®ããŒã«ããããŸãã
ããã¯çŽæ¥Dockerã§ãã£ãããDocker Composeã§ãã£ãããKubernetesã§ãã£ãããã¯ã©ãŠããµãŒãã¹ã§ãã£ããããŸãã
ã»ãšãã©ã®å ŽåïŒãŸãã¯ãã¹ãŠã®å ŽåïŒãèµ·åæã«ã³ã³ãããå®è¡ãã倱ææã«åèµ·åãæå¹ã«ããç°¡åãªãªãã·ã§ã³ããããŸããäŸãã°Dockerã§ã¯ãã³ãã³ãã©ã€ã³ãªãã·ã§ã³ã®--restartã該åœããŸãã
ã³ã³ããã䜿ããªããã°ãã¢ããªã±ãŒã·ã§ã³ãèµ·åæãåèµ·åæã«å®è¡ãããã®ã¯é¢åã§é£ãããããããŸãããããããã³ã³ããã§äœæ¥ããå Žåãã»ãšãã©ã®ã±ãŒã¹ã§ãã®æ©èœã¯ããã©ã«ãã§å«ãŸããŠããŸããâš
ã¬ããªã±ãŒã·ã§ã³ - ããã»ã¹æ°
Kubernetes ã Docker Swarm ã¢ãŒããNomadããããã¯è€æ°ã®ãã·ã³äžã§åæ£ã³ã³ããã管çããããã®åæ§ã®è€éãªã·ã¹ãã ã䜿ã£ãŠãã·ã³ã®ã¯ã©ã¹ã¿ãŒãæ§æããŠããå Žåã åã³ã³ããã§ïŒWorkerãæã€Gunicornã®ãããªïŒããã»ã¹ãããŒãžã£ã䜿çšãã代ããã«ãã¯ã©ã¹ã¿ãŒã»ã¬ãã«ã§ã¬ããªã±ãŒã·ã§ã³ãåŠçããããšæãã§ãããã
Kubernetesã®ãããªåæ£ã³ã³ãã管çã·ã¹ãã ã®1ã€ã¯éåžžãå ¥ã£ãŠãããªã¯ãšã¹ãã®ããŒããã©ã³ã·ã³ã°ããµããŒãããªãããã³ã³ããã®ã¬ããªã±ãŒã·ã§ã³ãåŠçããçµ±åãããæ¹æ³ãæã£ãŠããŸãããã®ããšã¯ãã¹ãŠã¯ã©ã¹ã¿ã¬ãã«ã«ãŠã§ãã
ãã®ãããªå ŽåãUvicornã¯ãŒã«ãŒã§Gunicornã®ãããªãã®ãå®è¡ããã®ã§ã¯ãªããäžèšã®èª¬æã®ããã«Dockerã€ã¡ãŒãžããŒããããã«ãããäŸåé¢ä¿ãã€ã³ã¹ããŒã«ããŠãåäžã®Uvicornããã»ã¹ãå®è¡ãããã§ãããã
ããŒããã©ã³ãµãŒ
ã³ã³ããã䜿çšããå Žåãéåžžã¯ã¡ã€ã³ã»ããŒãã§ãªã¹ãã³ã°ããŠããã³ã³ããŒãã³ããããã¯ãã§ããããã¯ãããããHTTPSãåŠçããããã®TLS Termination Proxyã§ãããå¥ã®ã³ã³ããã§ãã£ãããåæ§ã®ããŒã«ã§ãã£ããããã§ãããã
ãã®ã³ã³ããŒãã³ãã¯ãªã¯ãšã¹ãã® è² è· ãåãã (ããŸãããã°) ãã®è² è·ããã©ã³ã¹ãã ã¯ãŒã«ãŒã«åé ããã®ã§ãäžè¬ã« ããŒããã©ã³ãµ ãšãåŒã°ããŸãã
!!! tip ããHTTPSã«äœ¿ããããã®ãšåãTLS Termination Proxyã³ã³ããŒãã³ãã¯ãããããããŒããã©ã³ãµãŒã«ããªãã§ãããã
ãããŠã³ã³ããã§äœæ¥ããå Žåãã³ã³ããã®èµ·åãšç®¡çã«äœ¿çšããåãã·ã¹ãã ã«ã¯ãããŒããã©ã³ãµãŒïŒTLS Termination Proxyã®å¯èœæ§ãããïŒãããããã¯ãŒã¯éä¿¡ïŒHTTPãªã¯ãšã¹ããªã©ïŒãã¢ããªã®ããã³ã³ããïŒè€æ°å¯ïŒã«éä¿¡ããããã®å éšããŒã«ãæ¢ã«ããã¯ãã§ãã
1ã€ã®ããŒããã©ã³ãµãŒ - è€æ°ã®ã¯ãŒã«ãŒã³ã³ãããŒ
Kubernetesãåæ§ã®åæ£ã³ã³ãã管çã·ã¹ãã ã§äœæ¥ããå Žåããã®å éšã®ãããã¯ãŒãã³ã°ã®ã¡ã«ããºã ã䜿çšããããšã§ãã¡ã€ã³ã®ããŒãã§ãªãã¹ã³ããŠããåäžã®ããŒããã©ã³ãµãŒããã¢ããªãå®è¡ããŠããå¯èœæ§ã®ããè€æ°ã®ã³ã³ããã«éä¿¡ïŒãªã¯ãšã¹ãïŒãéä¿¡ã§ããããã«ãªããŸãã
ã¢ããªãå®è¡ãããããã®ã³ã³ããã«ã¯ãéåžž1ã€ã®ããã»ã¹ïŒããšãã°ãFastAPIã¢ããªã±ãŒã·ã§ã³ãå®è¡ããUvicornããã»ã¹ïŒããããŸãããããã¯ãã¹ãŠåäžã®ã³ã³ããã§ããåããã®ãå®è¡ããŸããããããããç¬èªã®ããã»ã¹ãã¡ã¢ãªãªã©ãæã¡ãŸããããããããšã§ãCPUã®ç°ãªãã³ã¢ããããã¯ç°ãªããã·ã³ã§ã®äžŠååãå©çšã§ããŸãã
ãããŠãããŒããã©ã³ãµãŒãåãã忣ã³ã³ããã·ã¹ãã ã¯ãé çªã«ããªãã®ã¢ããªãå«ãåã³ã³ããã«ãªã¯ãšã¹ããåé ããŸããã€ãŸããåãªã¯ãšã¹ãã¯ãããªãã®ã¢ããªãå®è¡ããŠããè€æ°ã®ã¬ããªã±ãŒããããã³ã³ããã®1ã€ã«ãã£ãŠåŠçãããŸãã
ãããŠéåžžããã®ããŒããã©ã³ãµãŒã¯ãã¯ã©ã¹ã¿å ã®ä»ã®ã¢ããªã±ãŒã·ã§ã³ïŒäŸãã°ãç°ãªããã¡ã€ã³ãç°ãªãURLãã¹ã®ãã¬ãã£ãã¯ã¹ã®é äžïŒãžã®ãªã¯ãšã¹ããåŠçããããšãã§ãããã®éä¿¡ãã¯ã©ã¹ã¿å ã§å®è¡ãããŠããä»ã®ã¢ããªã±ãŒã·ã§ã³ã®ããã®é©åãªã³ã³ããã«éä¿¡ããŸãã
1ã³ã³ããã«ã€ã1ããã»ã¹
ãã®çš®ã®ã·ããªãªã§ã¯ããã§ã«ã¯ã©ã¹ã¿ã»ã¬ãã«ã§ã¬ããªã±ãŒã·ã§ã³ãåŠçããŠãããããããããã³ã³ããããšã«åäžã®ïŒUvicornïŒããã»ã¹ãæã¡ããã§ãããã
ãã®å ŽåãUvicornã¯ãŒã«ãŒãæã€Gunicornã®ãããªããã»ã¹ãããŒãžã£ãŒããUvicornã¯ãŒã«ãŒã䜿ãUvicornã¯é¿ãããã§ããããã³ã³ããããšã«Uvicornã®ããã»ã¹ã¯1ã€ã ãã«ãããã§ãããïŒããããè€æ°ã®ã³ã³ãããå¿ èŠã§ãããïŒã
ïŒGunicornãUvicornãUvicornã¯ãŒã«ãŒã管çããããã«ïŒã³ã³ããå ã«å¥ã®ããã»ã¹ãããŒãžã£ãŒãæã€ããšã¯ãã¯ã©ã¹ã¿ãŒã·ã¹ãã ã§ãã§ã«å¯ŸåŠããŠããã§ãããäžèŠãªè€éãã远å ããã ãã§ãã
Containers with Multiple Processes and Special Cases
ãã¡ãããç¹æ®ãªã±ãŒã¹ãšããŠãGunicornããã»ã¹ãããŒãžã£ãæã€ã³ã³ããå ã§è€æ°ã®Uvicornã¯ãŒã«ãŒããã»ã¹ãèµ·åããããå ŽåããããŸãã
ãã®ãããªå Žåãå ¬åŒã®Dockerã€ã¡ãŒãžã䜿çšããããšãã§ããŸãããã®ã€ã¡ãŒãžã«ã¯ãè€æ°ã®Uvicornã¯ãŒã«ãŒããã»ã¹ãå®è¡ããããã»ã¹ãããŒãžã£ãšããŠGunicornãå«ãŸããŠãããçŸåšã®CPUã³ã¢ã«åºã¥ããŠã¯ãŒã«ãŒã®æ°ãèªåçã«èª¿æŽããããã®ããã©ã«ãèšå®ãããã€ãå«ãŸããŠããŸãã詳ããã¯åŸè¿°ã®Gunicornã«ããå ¬åŒDockerã€ã¡ãŒãž - Uvicornã§èª¬æããŸãã
以äžã¯ããããçã«ããªã£ãŠããå Žåã®äŸã§ãïŒ
ã·ã³ãã«ãªã¢ããªã±ãŒã·ã§ã³
ã¢ããªã±ãŒã·ã§ã³ãã·ã³ãã«ãªåœ¢ã§å®è¡ããå Žåãããã»ã¹æ°ã®çްãã調æŽãå¿ èŠãªãå Žåãèªååãããããã©ã«ãã䜿çšããã ãã§ãã³ã³ããå ã«ããã»ã¹ãããŒãžã£ãå¿ èŠãããããŸãããäŸãã°ãå ¬åŒDockerã€ã¡ãŒãžã§ã·ã³ãã«ãªèšå®ãå¯èœã§ãã
Docker Compose
Docker Composeã§ã·ã³ã°ã«ãµãŒãïŒã¯ã©ã¹ã¿ã§ã¯ãªãïŒã«ãããã€ããããšãã§ããŸãã®ã§ãå ±æãããã¯ãŒã¯ãšããŒããã©ã³ã·ã³ã°ãç¶æããªããïŒDocker Composeã§ïŒã³ã³ããã®ã¬ããªã±ãŒã·ã§ã³ã管çããç°¡åãªæ¹æ³ã¯ãªãã§ãããã
ãã®å Žåãåäžã®ã³ã³ããã§ãããã»ã¹ãããŒãžã£ãå éšã§è€æ°ã®ã¯ãŒã«ãŒããã»ã¹ãèµ·åããããã«ããŸãã
Prometheusãšãã®ä»ã®çç±
ãŸãã1ã€ã®ã³ã³ããã«1ã€ã®ããã»ã¹ãæãããã®ã§ã¯ãªãã1ã€ã®ã³ã³ããã«è€æ°ã®ããã»ã¹ãæãããæ¹ãç°¡åã ãšããä»ã®çç±ãããã§ãããã
äŸãã°ã(ã»ããã¢ããã«ããããŸãã)Prometheusãšã¯ã¹ããŒã¿ãŒã®ãããªããŒã«ãåãã³ã³ããå ã«æã€ããšãã§ããŸãã
ãã®å Žåãè€æ°ã®ã³ã³ããããããšãããã©ã«ãã§ã¯ãPrometheusãã¡ããªã¯ã¹ãèªã¿ã«æ¥ããšãããã¹ãŠã®ã¬ããªã±ãŒããããã³ã³ããã®èç©ãããã¡ããªã¯ã¹ãååŸããã®ã§ã¯ãªããæ¯ååäžã®ã³ã³ããïŒãã®ç¹å®ã®ãªã¯ãšã¹ããåŠçããã³ã³ããïŒã®ãã®ãååŸããããšã«ãªããŸãã
ãã®å Žåãè€æ°ã®ããã»ã¹ãæã€1ã€ã®ã³ã³ãããçšæããåãã³ã³ããäžã®ããŒã«ã«ããŒã«ïŒäŸãã°Prometheusãšã¯ã¹ããŒã¿ãŒïŒããã¹ãŠã®å éšããã»ã¹ã®Prometheusã¡ããªã¯ã¹ãåéãããã®1ã€ã®ã³ã³ããäžã§ãããã®ã¡ããªã¯ã¹ãå ¬éããæ¹ãã·ã³ãã«ãããããŸããã
éèŠãªã®ã¯ãç²ç®çã«åŸããªããã°ãªããªãæ®éã®ã«ãŒã«ã¯ãªããšããããšã§ãã
ãããã®ã¢ã€ãã¢ã¯ãããªãèªèº«ã®ãŠãŒã¹ã±ãŒã¹ãè©äŸ¡ããããªãã®ã·ã¹ãã ã«æé©ãªã¢ãããŒããæ±ºå®ããããã«äœ¿çšããããšãã§ããŸãïŒ
- ã»ãã¥ãªã㣠- HTTPS
- èµ·åæã®å®è¡
- åèµ·å
- ã¬ããªã±ãŒã·ã§ã³ïŒå®è¡äžã®ããã»ã¹æ°ïŒ
- ã¡ã¢ãª
- éå§åã®äºåã¹ããã
ã¡ã¢ãªãŒ
ã³ã³ããããšã«åäžã®ããã»ã¹ãå®è¡ãããšããããã®ã³ã³ããïŒã¬ããªã±ãŒããããŠããå Žåã¯1ã€ä»¥äžïŒã«ãã£ãŠæ¶è²»ãããå€ããå°ãªããæç¢ºã«å®çŸ©ããããå®å®ãå¶éãããéã®ã¡ã¢ãªãæã€ããšã«ãªããŸãã
ãããŠãã³ã³ãã管çã·ã¹ãã ïŒKubernetesãªã©ïŒã®èšå®ã§ãåãã¡ã¢ãªå¶éãšèŠä»¶ãèšå®ããããšãã§ããŸãã
ããããã°ãã³ã³ãããå¿ èŠãšããã¡ã¢ãªéãšã¯ã©ã¹ã¿å ã®ãã·ã³ã§å©çšå¯èœãªã¡ã¢ãªéãèæ ®ããŠãå©çšå¯èœãªãã·ã³ã«ã³ã³ãããã¬ããªã±ãŒãã§ããããã«ãªããŸãã
ã¢ããªã±ãŒã·ã§ã³ãã·ã³ãã«ãªãã®ã§ããã°ãããã¯ããããåé¡ã«ã¯ãªããªãã§ãããããããŒããªã¡ã¢ãªå¶éãæå®ããå¿ èŠã¯ãªããããããªãã§ãã
ããããå€ãã®ã¡ã¢ãªã䜿çšããŠããå ŽåïŒããšãã°æ©æ¢°åŠç¿ã¢ãã«ãªã©ïŒãã©ãã ãã®ã¡ã¢ãªãæ¶è²»ããŠãããã確èªããåãã·ã³ã§å®è¡ããã³ã³ããã®æ°ã調æŽããå¿ èŠããããŸãïŒãããŠããããã¯ã©ã¹ã¿ã«ãã·ã³ã远å ããŸãïŒã
ã³ã³ããããšã«è€æ°ã®ããã»ã¹ãå®è¡ããå ŽåïŒããšãã°å ¬åŒã®Dockerã€ã¡ãŒãžã§ïŒãèµ·åããããã»ã¹ã®æ°ãå©çšå¯èœãªã¡ã¢ãªä»¥äžã«æ¶è²»ããªãããã«ããå¿ èŠããããŸãã
éå§åã®äºåã¹ããããšã³ã³ãã
ã³ã³ããïŒDockerãKubernetesãªã©ïŒã䜿ã£ãŠããå Žåãäž»ã«2ã€ã®ã¢ãããŒãããããŸãã
è€æ°ã®ã³ã³ãã
è€æ°ã®ã³ã³ãããããããããããããããåäžã®ããã»ã¹ãå®è¡ããŠããå ŽåïŒKubernetesã¯ã©ã¹ã¿ãªã©ïŒãã¬ããªã±ãŒããããã¯ãŒã«ãŒã³ã³ãããå®è¡ããåã«ãåäžã®ã³ã³ããã§äºåã®ã¹ãããã®äœæ¥ãè¡ãå¥ã®ã³ã³ãããæã¡ãããšæãã§ãããã
!!! info ããKubernetesã䜿çšããŠããå Žå, ããã¯ããããInit ã³ã³ããã§ãããã
ãŠãŒã¹ã±ãŒã¹ãäºåã®ã¹ãããã䞊åã§è€æ°åå®è¡ããã®ã«åé¡ããªãå ŽåïŒäŸïŒããŒã¿ããŒã¹ã®æºåãã§ãã¯ïŒãã¡ã€ã³ããã»ã¹ãéå§ããåã«ããããã®ã¹ããããåã³ã³ããã«å ¥ããããšãå¯èœã§ãã
åäžã³ã³ãã
åçŽãªã»ããã¢ããã§ãåäžã®ã³ã³ããã§è€æ°ã®ã¯ãŒã«ãŒã»ããã»ã¹ïŒãŸãã¯1ã€ã®ããã»ã¹ã®ã¿ïŒãèµ·åããå Žåãã¢ããªã§ããã»ã¹ãéå§ããçŽåã«ãåãã³ã³ããã§äºåã®ã¹ããããå®è¡ã§ããŸããå ¬åŒDockerã€ã¡ãŒãžã¯ãå éšçã«ããããµããŒãããŠããŸãã
Gunicornã«ããå ¬åŒDockerã€ã¡ãŒãž - Uvicorn
åã®ç« ã§è©³ãã説æããããã«ãUvicornã¯ãŒã«ãŒã§åäœããGunicornãå«ãå ¬åŒã®Dockerã€ã¡ãŒãžããããŸãïŒ Server Workers - Gunicorn ãš Uvicorn{.internal-link target=_blank}ã§è©³ãã説æããŠããŸãã
ãã®ã€ã¡ãŒãžã¯ãäž»ã«äžèšã§èª¬æããç¶æ³ã§åœ¹ã«ç«ã€ã§ãããïŒ è€æ°ã®ããã»ã¹ãšç¹æ®ãªã±ãŒã¹ãæã€ã³ã³ããïŒContainers with Multiple Processes and Special CasesïŒ
!!! warning ãã®ããŒã¹ã€ã¡ãŒãžãé¡äŒŒã®ã€ã¡ãŒãžã¯å¿ èŠãªãå¯èœæ§ãé«ãã®ã§ãäžèšã®: FastAPIçšã®Dockerã€ã¡ãŒãžããã«ãããïŒBuild a Docker Image for FastAPIïŒã®ããã«ãŒãããã€ã¡ãŒãžããã«ãããæ¹ãè¯ãã§ãããã
ãã®ã€ã¡ãŒãžã«ã¯ãå©çšå¯èœãªCPUã³ã¢ã«åºã¥ããŠã¯ãŒã«ãŒã»ããã»ã¹ã®æ°ãèšå®ãããªãŒããã¥ãŒãã³ã°ã¡ã«ããºã ãå«ãŸããŠããŸãã
ããã¯è³¢æãªããã©ã«ããåããŠããŸãããç°å¢å€æ°ãèšå®ãã¡ã€ã«ã䜿ã£ãŠãã¹ãŠã®èšå®ã倿ŽãããæŽæ°ãããããããšãã§ããŸãã
ãŸããã¹ã¯ãªããã§éå§åã®äºåã¹ããããå®è¡ããããšããµããŒãããŠããã
!!! tip ãã¹ãŠã®èšå®ãšãªãã·ã§ã³ãèŠãã«ã¯ãDockerã€ã¡ãŒãžã®ããŒãžãã芧ãã ãã: tiangolo/uvicorn-gunicorn-fastapi
å ¬åŒDockerã€ã¡ãŒãžã®ããã»ã¹æ°
ãã®ã€ã¡ãŒãžã®ããã»ã¹æ°ã¯ãå©çšå¯èœãªCPUã³ã¢ããèªåçã«èšç®ãããŸãã
ã€ãŸããCPUããå¯èœãªéãããã©ãŒãã³ã¹ãåŒãåºãããšããŸãã
ãŸããç°å¢å€æ°ãªã©ã䜿ã£ãèšå®ã§èª¿æŽããããšãã§ããŸãã
ããããããã»ã¹ã®æ°ã¯ã³ã³ãããå®è¡ããŠããCPUã«äŸåãããããæ¶è²»ãããã¡ã¢ãªã®éãããã«äŸåããããšã«ãªããŸãã
ãã®ãããïŒæ©æ¢°åŠç¿ã¢ãã«ãªã©ã§ïŒå€§éã®ã¡ã¢ãªãæ¶è²»ããã¢ããªã±ãŒã·ã§ã³ã§ããµãŒããŒã®CPUã³ã¢ãå€ããã¡ã¢ãªãå°ãªãå Žåãã³ã³ããã¯å©çšå¯èœãªã¡ã¢ãªãããå€ãã®ã¡ã¢ãªã䜿ãããšããããšã«ãªããŸãã
ãã®çµæãããã©ãŒãã³ã¹ãå€§å¹ ã«äœäžããïŒãããã¯ã¯ã©ãã·ã¥ããïŒå¯èœæ§ããããŸããðš
Dockerfileãäœæãã
ãã®ç»åã«åºã¥ããŠDockerfileãäœæããæ¹æ³ã以äžã«ç€ºããŸãïŒ
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9
COPY ./requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt
COPY ./app /app
ãã倧ããªã¢ããªã±ãŒã·ã§ã³
è€æ°ã®ãã¡ã€ã«ãæã€å€§ããªã¢ããªã±ãŒã·ã§ã³{.internal-link target=_blank}ãäœæããã»ã¯ã·ã§ã³ã«åŸã£ãå ŽåãDockerfileã¯æ¬¡ã®ããã«ãªããŸãïŒ
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9
COPY ./requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt
COPY ./app /app/app
ãã€äœ¿ãã®ã
ãããããKubernetesïŒãŸãã¯ä»ã®ãã®ïŒã䜿çšããŠããŠããã§ã«ã¯ã©ã¹ã¿ã¬ãã«ã§è€æ°ã®ã³ã³ããã§ã¬ããªã±ãŒã·ã§ã³ãèšå®ããŠããå Žåã¯ããã®å ¬åŒããŒã¹ã€ã¡ãŒãžïŒãŸãã¯ä»ã®é¡äŒŒã®ãã®ïŒã¯äœ¿çšãã¹ãã§ã¯ãããŸããã
ãã®ãããªå Žåã¯ãäžèšã®ããã«ãŒãããã€ã¡ãŒãžãæ§ç¯ããæ¹ãããã§ãããïŒ FastAPIçšã®Dockerã€ã¡ãŒãžããã«ãããïŒBuild a Docker Image for FastAPIïŒ ãåç §ããŠãã ããã
ãã®ã€ã¡ãŒãžã¯ãäž»ã«äžèšã®è€æ°ã®ããã»ã¹ãšç¹æ®ãªã±ãŒã¹ãæã€ã³ã³ããïŒContainers with Multiple Processes and Special CasesïŒã§èª¬æãããããªç¹æ®ãªã±ãŒã¹ã§åœ¹ã«ç«ã¡ãŸãã
äŸãã°ãã¢ããªã±ãŒã·ã§ã³ãã·ã³ãã«ã§ãCPUã«å¿ããããã©ã«ãã®ããã»ã¹æ°ãèšå®ããã°ããŸãããå Žåããã¯ã©ã¹ã¿ã¬ãã«ã§ã¬ããªã±ãŒã·ã§ã³ãæåã§èšå®ããæéãçãããå Žåãã¢ããªã§è€æ°ã®ã³ã³ãããå®è¡ããªãå Žåãªã©ã§ãã
ãŸãã¯ãDocker Composeã§ãããã€ããåäžã®ãµãŒãã§å®è¡ããŠããå Žåãªã©ã§ãã
ã³ã³ããã»ã€ã¡ãŒãžã®ãããã€
ã³ã³ããïŒDockerïŒã€ã¡ãŒãžãæã«å ¥ããåŸãããããããã€ããã«ã¯ããã€ãã®æ¹æ³ããããŸãã
äŸãã°ä»¥äžã®ãªã¹ãã®æ¹æ³ã§ã:
- åäžãµãŒããŒã®Docker Compose
- Kubernetesã¯ã©ã¹ã¿
- Docker Swarmã¢ãŒãã®ã¯ã©ã¹ã¿ãŒ
- Nomadã®ãããªå¥ã®ããŒã«
- ã³ã³ããã»ã€ã¡ãŒãžããããã€ããã¯ã©ãŠãã»ãµãŒãã¹
Poetryãå©çšããDockerã€ã¡ãŒãž
ãããããžã§ã¯ãã®äŸåé¢ä¿ã管çããããã«Poetryãå©çšããå Žåããã«ãã¹ããŒãžãã«ãã䜿ããšè¯ãã§ãããã
# (1)
FROM python:3.9 as requirements-stage
# (2)
WORKDIR /tmp
# (3)
RUN pip install poetry
# (4)
COPY ./pyproject.toml ./poetry.lock* /tmp/
# (5)
RUN poetry export -f requirements.txt --output requirements.txt --without-hashes
# (6)
FROM python:3.9
# (7)
WORKDIR /code
# (8)
COPY --from=requirements-stage /tmp/requirements.txt /code/requirements.txt
# (9)
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
# (10)
COPY ./app /code/app
# (11)
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
-
ããã¯æåã®ã¹ããŒãžã§ã
requirements-stageãšåä»ããããŸã -
/tmpãçŸåšã®äœæ¥ãã£ã¬ã¯ããªã«èšå®ããŸã ããã§requirements.txtãšãããã¡ã€ã«ãçæããŸãã -
ãã®Dockerã¹ããŒãžã«Poetryãã€ã³ã¹ããŒã«ããŸã
-
pyproject.toml
ãšpoetry.lockãã¡ã€ã«ã/tmp` ãã£ã¬ã¯ããªã«ã³ããŒããŸã./poetry.lock*ïŒæ«å°Ÿã«*ïŒã䜿çšããããããã®ãã¡ã€ã«ããŸã å©çšã§ããªãå Žåã§ãã¯ã©ãã·ã¥ããããšã¯ãªãã§ãã -
requirements.txt`ãã¡ã€ã«ãçæããŸã
-
ããã¯æåŸã®ã¹ããŒãžã§ãããããã«ãããã®ã¯ãã¹ãŠæçµçãªã³ã³ããã»ã€ã¡ãŒãžã«ä¿åãããŸã
-
çŸåšã®äœæ¥ãã£ã¬ã¯ããªã
/codeã«èšå®ããŸã -
requirements.txtãã¡ã€ã«ã/codeãã£ã¬ã¯ããªã«ã³ããŒããŸã ãã®ãã¡ã€ã«ã¯åã®Dockerã¹ããŒãžã«ããååšããªãããã--from-requirements-stageã䜿ã£ãŠã³ããŒããŸãã -
çæããã
requirements.txtãã¡ã€ã«ã«ããããã±ãŒãžã®äŸåé¢ä¿ãã€ã³ã¹ããŒã«ããŸã -
app
ãã£ã¬ã¯ããªã/code` ãã£ã¬ã¯ããªã«ã³ããŒããŸã -
uvicorn
ã³ãã³ããå®è¡ããŠãapp.mainããã€ã³ããŒãããapp` ãªããžã§ã¯ãã䜿çšããããã«æç€ºããŸã !!! tip "+"ã®å¹ãåºããã¯ãªãã¯ãããšãããããã®è¡ãäœãããã®ããèŠãããšãã§ããŸã
Dockerã¹ããŒãžã¯Dockerfileã®äžéšã§ãäžæçãªã³ã³ããã€ã¡ãŒãžãšããŠåäœããŸãã
æåã®ã¹ããŒãžã¯ Poetryã®ã€ã³ã¹ããŒã«ãš Poetry ã® pyproject.toml ãã¡ã€ã«ãããããžã§ã¯ãã®äŸåé¢ä¿ãå«ã**requirements.txtãçæ**ããããã ãã«äœ¿çšãããŸãã
ãã® requirements.txt ãã¡ã€ã«ã¯åŸå㮠次ã®ã¹ããŒãžã§ pip ãšå
±ã«äœ¿çšãããŸãã
æçµçãªã³ã³ããã€ã¡ãŒãžã§ã¯ãæçµã¹ããŒãžã®ã¿ãä¿åãããŸããåã®ã¹ããŒãžã¯ç Žæ£ãããŸãã
Poetryã䜿çšããå ŽåãDockerãã«ãã¹ããŒãžãã«ãã䜿çšããããšã¯çã«ããªã£ãŠããŸãã
ãªããªããæçµçãªã³ã³ããã€ã¡ãŒãžã«Poetryãšãã®äŸåé¢ä¿ãã€ã³ã¹ããŒã«ãããŠããå¿
èŠã¯ãªããå¿
èŠãªã®ã¯ãããžã§ã¯ãã®äŸåé¢ä¿ãã€ã³ã¹ããŒã«ããããã«çæããã requirements.txt ãã¡ã€ã«ã ãã ããã§ãã
ãããŠæ¬¡ã®ïŒãããŠæçµçãªïŒã¹ããŒãžã§ã¯ãåè¿°ãšã»ãŒåãæ¹æ³ã§ã€ã¡ãŒãžããã«ãããŸãã
TLS Termination Proxyã®è£åŽ - Poetry
ç¹°ãè¿ãã«ãªããŸãããNginxãTraefikã®ãããªTLS Termination ProxyïŒããŒããã©ã³ãµãŒïŒã®åŸãã§ã³ã³ãããåãããŠããå Žåã¯ã--proxy-headersãªãã·ã§ã³ãã³ãã³ãã«è¿œå ããŸãïŒ
CMD ["uvicorn", "app.main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "80"]
ãŸãšã
ã³ã³ããã»ã·ã¹ãã ïŒäŸãã°DockerãKubernetesãªã©ïŒã䜿ãã°ããã¹ãŠã®ãããã€ã¡ã³ãã®ã³ã³ã»ãããæ±ãã®ãããªãç°¡åã«ãªããŸãïŒ
- ã»ãã¥ãªã㣠- HTTPS
- èµ·åæã®å®è¡
- åèµ·å
- ã¬ããªã±ãŒã·ã§ã³ïŒå®è¡äžã®ããã»ã¹æ°ïŒ
- ã¡ã¢ãª
- éå§åã®äºåã¹ããã
ã»ãšãã©ã®å ŽåãããŒã¹ãšãªãã€ã¡ãŒãžã¯äœ¿çšãããå ¬åŒã®Python Dockerã€ã¡ãŒãžãããŒã¹ã«ããã³ã³ããã€ã¡ãŒãžããŒããããã«ãããŸãã
DockerfileãšDockerãã£ãã·ã¥å
ã®åœä»€ã®é çªã«æ³šæããããšã§ããã«ãæéãæå°åããããšãã§ããçç£æ§ãæå€§åããããšãã§ããŸãïŒãããŠéå±ãé¿ããããšãã§ããŸãïŒãð
ç¹å¥ãªã±ãŒã¹ã§ã¯ãFastAPIçšã®å ¬åŒDockerã€ã¡ãŒãžã䜿ããããããããŸãããð€

