38 KiB
ã³ã³ããå ã®FastAPI - Docker
FastAPIã¢ããªã±ãŒã·ã§ã³ããããã€ããå Žåãäžè¬çãªã¢ãããŒãã¯Linuxã³ã³ããã»ã€ã¡ãŒãžããã«ãããããšã§ããåºæ¬çã«ã¯ DockerãçšããŠè¡ãããŸããçæãããã³ã³ããã»ã€ã¡ãŒãžã¯ãããã€ãã®æ¹æ³ã®ããããã§ãããã€ã§ããŸãã
Linuxã³ã³ããã®äœ¿çšã«ã¯ãã»ãã¥ãªãã£ãå埩å¯èœæ§ïŒã¬ããªã«ããªãã£ïŒãã·ã³ããªã·ãã£ãªã©ãããã€ãã®å©ç¹ããããŸãã
/// tip | è±ç¥è
ãæ¥ãã§ããã§ã«ãããã®æ
å ±ããåãã§ããïŒ ä»¥äžã®Dockerfileã®ç®æðãžãžã£ã³ãããŠãã ããã
///
Dockerfile Preview ð
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 ["fastapi", "run", "app/main.py", "--port", "80"]
# If running behind a proxy like Nginx or Traefik add --proxy-headers
# CMD ["fastapi", "run", "app/main.py", "--port", "80", "--proxy-headers"]
ã³ã³ãããšã¯äœã
ã³ã³ããïŒäž»ã«Linuxã³ã³ããïŒã¯ãåãã·ã¹ãã å ã®ä»ã®ã³ã³ããïŒä»ã®ã¢ããªã±ãŒã·ã§ã³ãã³ã³ããŒãã³ãïŒããéé¢ãããç¶æ ãä¿ã¡ãªããããã¹ãŠã®äŸåé¢ä¿ãå¿ èŠãªãã¡ã€ã«ãå«ãã¢ããªã±ãŒã·ã§ã³ãããã±ãŒãžåããéåžžã«è»œéãªæ¹æ³ã§ãã
Linuxã³ã³ããã¯ããã¹ãïŒãã·ã³ãä»®æ³ãã·ã³ãã¯ã©ãŠããµãŒããŒãªã©ïŒã®åãLinuxã«ãŒãã«ã䜿çšããŠå®è¡ãããŸããããã¯ãïŒOSå šäœããšãã¥ã¬ãŒãããå®å šãªä»®æ³ãã·ã³ãšæ¯ã¹ãŠïŒéåžžã«è»œéã§ããããšãæå³ããŸãã
ãã®ããã«ãã³ã³ããã¯ãªãœãŒã¹ãã»ãšãã©æ¶è²»ããŸããããããã»ã¹ãçŽæ¥å®è¡ããã®ã«å¹æµããéã§ãïŒä»®æ³ãã·ã³ã¯ãã£ãšæ¶è²»ããŸãïŒã
ã³ã³ããã¯ãŸããç¬èªã®åé¢ãããå®è¡ããã»ã¹ïŒéåžžã¯1ã€ã®ããã»ã¹ã®ã¿ïŒãããã¡ã€ã«ã·ã¹ãã ããããã¯ãŒã¯ãæã¡ãŸãã ãã®ããšã¯ãããã€ãã»ãã¥ãªãã£ãéçºãªã©ãç°¡çŽ åãããŸãã
ã³ã³ããã»ã€ã¡ãŒãžãšã¯äœã
ã³ã³ããã¯ãã³ã³ããã»ã€ã¡ãŒãžããå®è¡ãããŸãã
ã³ã³ããã»ã€ã¡ãŒãžã¯ãã³ã³ããå ã«ååšãã¹ããã¹ãŠã®ãã¡ã€ã«ãç°å¢å€æ°ããããŠããã©ã«ãã®ã³ãã³ã/ããã°ã©ã ãéçã«ããŒãžã§ã³åãããã®ã§ãã ããã§ã®éçãšã¯ãã³ã³ããã€ã¡ãŒãžã¯å®è¡ãããŠããããããã±ãŒãžåããããã¡ã€ã«ãšã¡ã¿ããŒã¿ã®ã¿ã§ããããšãæå³ããŸãã
ä¿åãããéçã³ã³ãã³ãã§ãããã³ã³ããã€ã¡ãŒãžããšã¯å¯Ÿç §çã«ããã³ã³ãããã¯éåžžãå®è¡äžã®ã€ã³ã¹ã¿ã³ã¹ãã€ãŸãå®è¡ãããŠãããã®ãæããŸãã
ã³ã³ãããèµ·åããå®è¡ããããšãïŒã³ã³ããã€ã¡ãŒãžããèµ·åããããšãïŒããã¡ã€ã«ãç°å¢å€æ°ãªã©ãäœæãããã倿Žããããããå¯èœæ§ããããŸãããããã®å€æŽã¯ãã®ã³ã³ããå ã«ã®ã¿ååšããŸãããåºç€ãšãªãã³ã³ããã»ã€ã¡ãŒãžã«ã¯æ®ããŸããïŒãã£ã¹ã¯ã«ä¿åãããŸããïŒã
ã³ã³ããã€ã¡ãŒãžã¯ ããã°ã©ã ãã¡ã€ã«ããã®å
容ãäŸãã° python ãš main.py ãã¡ã€ã«ã«å¹æµããŸãã
ãããŠãã³ã³ããèªäœã¯ïŒã³ã³ããã€ã¡ãŒãžãšã¯å¯Ÿç §çã«ïŒã€ã¡ãŒãžãããšã«ããå®éã®å®è¡äžã®ã€ã³ã¹ã¿ã³ã¹ã§ãããããã»ã¹ã«å¹æµããŸããå®éãã³ã³ãããå®è¡ãããŠããã®ã¯ãããã»ã¹ãå®è¡ãããŠãããšãã ãã§ãïŒéåžžã¯åäžã®ããã»ã¹ã ãã§ãïŒã ã³ã³ããå ã§å®è¡äžã®ããã»ã¹ããªãå Žåãã³ã³ããã¯åæ¢ããŸãã
ã³ã³ããã»ã€ã¡ãŒãž
Dockerã¯ãã³ã³ããã»ã€ã¡ãŒãžãšã³ã³ãããäœæã»ç®¡çããããã®äž»èŠãªããŒã«ã®1ã€ã§ãã
ãããŠãå€ãã®ããŒã«ãç°å¢ãããŒã¿ããŒã¹ãã¢ããªã±ãŒã·ã§ã³ã«å¯Ÿå¿ããŠããäºãäœæãããå ¬åŒã®ã³ã³ããã»ã€ã¡ãŒãžããããªãã¯ã«æäŸããŠããDocker Hubãšãããã®ããããŸãã
äŸãã°ãå ¬åŒã€ã¡ãŒãžã®1ã€ã«Python ImageããããŸãã
ãã®ä»ã«ããããŒã¿ããŒã¹ãªã©ããŸããŸãªã€ã¡ãŒãžããããŸãïŒ
- PostgreSQL
- MySQL
- MongoDB
- Redis, etc.
äºãäœæãããã³ã³ããã»ã€ã¡ãŒãžã䜿çšããããšã§ãç°ãªãããŒã«ãçµã¿åãããŠäœ¿çšããããšãéåžžã«ç°¡åã«ãªããŸããäŸãã°ãæ°ããããŒã¿ããŒã¹ã詊ãå Žåã«ç¹ã«äŸ¿å©ã§ããã»ãšãã©ã®å Žåãå ¬åŒã€ã¡ãŒãžã䜿ããç°å¢å€æ°ã§èšå®ããã ãã§è¯ãã§ãã
ããããã°å€ãã®å Žåãã³ã³ãããšDockerã«ã€ããŠåŠã³ããã®ç¥èãããŸããŸãªããŒã«ãã³ã³ããŒãã³ãã«ãã£ãŠåå©çšããããšãã§ããŸãã
ã€ãŸããããŒã¿ããŒã¹ãPythonã¢ããªã±ãŒã·ã§ã³ãReactããã³ããšã³ãã»ã¢ããªã±ãŒã·ã§ã³ãåãããŠã§ãã»ãµãŒããŒãªã©ãããŸããŸãªãã®ãè€æ°ã®ã³ã³ããã§å®è¡ããããããå éšãããã¯ãŒã¯çµç±ã§æ¥ç¶ããŸãã
ãã¹ãŠã®ã³ã³ãã管çã·ã¹ãã ïŒDockerãKubernetesãªã©ïŒã«ã¯ããããããããã¯ãŒãã³ã°æ©èœãçµ±åãããŠããŸãã
ã³ã³ãããšããã»ã¹
éåžžãã³ã³ããã»ã€ã¡ãŒãžã¯ãã®ã¡ã¿ããŒã¿ã«ã³ã³ããã®èµ·åæã«å®è¡ãããããã©ã«ãã®ããã°ã©ã ãŸãã¯ã³ãã³ããšããã®ããã°ã©ã ã«æž¡ããããã©ã¡ãŒã¿ãå«ã¿ãŸããã³ãã³ãã©ã€ã³ã§ã®æäœãšãã䌌ãŠããŸãã
ã³ã³ãããèµ·åããããšããã®ã³ãã³ã/ããã°ã©ã ãå®è¡ãããŸãïŒãã ããå¥ã®ã³ãã³ã/ããã°ã©ã ããªãŒããŒã©ã€ãããŠå®è¡ãããããšãã§ããŸãïŒã
ã³ã³ããã¯ãã¡ã€ã³ã»ããã»ã¹ïŒã³ãã³ããŸãã¯ããã°ã©ã ïŒãå®è¡ãããŠããéãå®è¡ãããŸãã
ã³ã³ããã¯éåžž1ã€ã®ããã»ã¹ãæã¡ãŸãããã¡ã€ã³ã»ããã»ã¹ãããµãã»ããã»ã¹ãèµ·åããããšãå¯èœã§ãããããã°åãã³ã³ããå ã«è€æ°ã®ããã»ã¹ãæã€ããšã«ãªããŸãã
ããããå°ãªããšã1ã€ã®å®è¡äžã®ããã»ã¹ããªããã°ãå®è¡äžã®ã³ã³ãããæã€ããšã¯ã§ããªãã§ããã¡ã€ã³ã»ããã»ã¹ã忢ããã°ãã³ã³ããã忢ããŸãã
FastAPIçšã®Dockerã€ã¡ãŒãžããã«ããã
ãšããããšã§ãäœãäœããŸãããïŒð
FastAPIçšã®Dockerã€ã¡ãŒãžããå ¬åŒPythonã€ã¡ãŒãžã«åºã¥ããŠãŒããããã«ãããæ¹æ³ããèŠãããŸãã
ããã¯ã»ãšãã©ã®å Žåã«ããããããšã§ããäŸãã°ïŒ
- KubernetesãŸãã¯åæ§ã®ããŒã«ã䜿çšããå Žå
- Raspberry Piã§å®è¡ããå Žå
- ã³ã³ããã»ã€ã¡ãŒãžãå®è¡ããŠãããã¯ã©ãŠãã»ãµãŒãã¹ãªã©ãå©çšããå Žå
ããã±ãŒãžèŠä»¶
ã¢ããªã±ãŒã·ã§ã³ã®ããã±ãŒãžèŠä»¶ã¯éåžžãäœããã®ãã¡ã€ã«ã«èšè¿°ãããŠããã¯ãã§ãã
ããã±ãŒãžèŠä»¶ã¯äž»ã«ã€ã³ã¹ããŒã«ããããã«äœ¿çšããããŒã«ã«äŸåããã§ãããã
æãäžè¬çãªæ¹æ³ã¯ãrequirements.txt ãã¡ã€ã«ã«ããã±ãŒãžåãšãã®ããŒãžã§ã³ã 1 è¡ãã€æžãããšã§ãã
ãã¡ãããFastAPI ããŒãžã§ã³ã«ã€ããŠ{.internal-link target=_blank}ã§èªãã ã®ãšåãã¢ã€ãã¢ã䜿çšããŠãããŒãžã§ã³ã®ç¯å²ãèšå®ããŸãã
äŸãã°ãrequirements.txt ã¯æ¬¡ã®ããã«ãªããŸãïŒ
fastapi[standard]>=0.113.0,<0.114.0
pydantic>=2.7.0,<3.0.0
ãããŠéåžžãäŸãã° pip ã䜿ã£ãŠãããã®ããã±ãŒãžã®äŸåé¢ä¿ãã€ã³ã¹ããŒã«ããŸãïŒ
$ pip install -r requirements.txt
---> 100%
Successfully installed fastapi pydantic
/// info | æ å ±
ããã±ãŒãžã®äŸåé¢ä¿ãå®çŸ©ãã€ã³ã¹ããŒã«ããããã®ãã©ãŒããããããŒã«ã¯ä»ã«ããããŸãã
///
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 ["fastapi", "run", "app/main.py", "--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ã䜿çšãã
fastapi runã䜿ãããã®ã³ãã³ããèšå®ããŸãCMDã¯æååã®ãªã¹ããåããããããã®æååã¯ã¹ããŒã¹ã§åºåãããã³ãã³ãã©ã€ã³ã«å ¥åãããã®ã§ãããã®ã³ãã³ã㯠çŸåšã®äœæ¥ãã£ã¬ã¯ããªããå®è¡ãããäžèšã®
WORKDIR /codeã«ãŠèšå®ãã/codeãã£ã¬ã¯ããªãšåãã§ãã
/// tip | è±ç¥è
ã³ãŒãå ã®åçªå·ããã«ãã¯ãªãã¯ããŠãåè¡ãäœãããã®ããã¬ãã¥ãŒããŠãã ãããð
///
/// warning | 泚æ
以äžã§èª¬æããéããCMD åœä»€ã¯åžžã« exec圢åŒã䜿çšããŠãã ããã
///
CMD ã䜿ã - Exec圢åŒ
Dockeråœä»€ CMD ã¯2ã€ã®åœ¢åŒã§æžããŸãïŒ
â Exec 圢åŒïŒ
# â
Do this
CMD ["fastapi", "run", "app/main.py", "--port", "80"]
âïž Shell 圢åŒïŒ
# âïž Don't do this
CMD fastapi run app/main.py --port 80
FastAPIãæ£åžžã«ã·ã£ããããŠã³ã§ããlifespan events{.internal-link target=_blank}ãããªã¬ãŒãããããã«ãåžžã« exec 圢åŒã䜿çšããŠãã ããã
詳ããã¯ãshell圢åŒãšexec圢åŒã«é¢ããDockerããã¥ã¡ã³ããã芧ãã ããã
ãã㯠docker compose ã䜿çšããå Žåã«ããªãç®ç«ã€ããšããããŸããããæè¡çãªè©³çްã¯ããã®Docker Composeã®FAQã»ã¯ã·ã§ã³ãã芧ãã ããïŒWhy do my services take 10 seconds to recreate or stop?ã
ãã£ã¬ã¯ããªæ§é
ããã§ã次ã®ãããªãã£ã¬ã¯ããªæ§é ã«ãªãã¯ãã§ãïŒ
.
âââ app
â  âââ __init__.py
â âââ main.py
âââ Dockerfile
âââ requirements.txt
TLS Termination Proxyã®è£åŽ
Nginx ã Traefik ã®ãã㪠TLS Termination Proxy (ããŒããã©ã³ãµ) ã®åŸãã§ã³ã³ãããåãããŠããå Žåã¯ã--proxy-headersãªãã·ã§ã³ã远å ããŸããããã«ãããïŒFastAPI CLIçµç±ã§ïŒUvicornã«å¯ŸããŠããã®ãããã·ããéä¿¡ãããããããä¿¡é Œããã¢ããªã±ãŒã·ã§ã³ãHTTPSã®è£ã§å®è¡ãããŠããããšãªã©ã瀺ãããæç€ºããŸãã
CMD ["fastapi", "run", "app/main.py", "--proxy-headers", "--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 ["fastapi", "run", "main.py", "--port", "80"]
-
main.pyãã¡ã€ã«ã/codeãã£ã¬ã¯ããªã«çŽæ¥ã³ããŒããŸãïŒ./appãã£ã¬ã¯ããªãªãïŒã -
åäžãã¡ã€ã«
main.pyå ã®ã¢ããªã±ãŒã·ã§ã³ãé ä¿¡ããããã«fastapi runã䜿çšããŸãã
fastapi run ã«ãã¡ã€ã«ãæž¡ããšããããããã±ãŒãžã®äžéšã§ã¯ãªãåäžãã¡ã€ã«ã§ããããšãèªåçã«æ€åºããã€ã³ããŒãããŠFastAPIã¢ããªãé
ä¿¡ããæ¹æ³ã倿ããŸããð
ãããã€ã¡ã³ãã®ã³ã³ã»ãã
ã³ã³ãããšãã芳ç¹ããããããã€ã®ã³ã³ã»ãã{.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ããããã¯è€æ°ã®ãã·ã³äžã§åæ£ã³ã³ããã管çããããã®åæ§ã®è€éãªã·ã¹ãã ã䜿ã£ãŠãã·ã³ã®clusterãæ§æããŠããå Žåã åã³ã³ããã§ïŒWorkerãæã€Uvicornã®ãããªïŒããã»ã¹ãããŒãžã£ã䜿çšãã代ããã«ãã¯ã©ã¹ã¿ãŒã»ã¬ãã«ã§ã¬ããªã±ãŒã·ã§ã³ãåŠçããããšæãã§ãããã
Kubernetesã®ãããªåæ£ã³ã³ãã管çã·ã¹ãã ã®1ã€ã¯éåžžãå ¥ã£ãŠãããªã¯ãšã¹ãã®ããŒããã©ã³ã·ã³ã°ããµããŒãããªãããã³ã³ããã®ã¬ããªã±ãŒã·ã§ã³ãåŠçããçµ±åãããæ¹æ³ãæã£ãŠããŸãããã®ããšã¯ãã¹ãŠã¯ã©ã¹ã¿ã¬ãã«ã«ãŠã§ãã
ãã®ãããªå Žåãäžèšã®èª¬æã®ããã«Dockerã€ã¡ãŒãžããŒããããã«ãããäŸåé¢ä¿ãã€ã³ã¹ããŒã«ããŠãåäžã®Uvicornããã»ã¹ãå®è¡ãããã§ããããè€æ°ã®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ïŒããã»ã¹ãæã¡ããã§ãããã
ãã®å ŽåãäŸãã°ã³ãã³ãã©ã€ã³ãªãã·ã§ã³ã® --workers ã§ãã³ã³ããå
ã«è€æ°ã®ã¯ãŒã«ãŒãæã€ããšã¯é¿ãããã§ããããã³ã³ããããšã«Uvicornã®ããã»ã¹ã¯1ã€ã ãã«ãããã§ãããïŒããããè€æ°ã®ã³ã³ãããå¿
èŠã§ãããïŒã
ïŒè€æ°ã®ã¯ãŒã«ãŒã®å Žåã®ããã«ïŒã³ã³ããå ã«å¥ã®ããã»ã¹ãããŒãžã£ãŒãæã€ããšã¯ãã¯ã©ã¹ã¿ãŒã·ã¹ãã ã§ãã§ã«å¯ŸåŠããŠããã§ãããäžèŠãªè€éãã远å ããã ãã§ãã
è€æ°ããã»ã¹ã®ã³ã³ãããšç¹æ®ãªã±ãŒã¹
ãã¡ãããç¹æ®ãªã±ãŒã¹ãšããŠãã³ã³ããå ã§è€æ°ã®Uvicornã¯ãŒã«ãŒããã»ã¹ãèµ·åããããå ŽåããããŸãã
ãã®ãããªå Žåã--workers ã³ãã³ãã©ã€ã³ãªãã·ã§ã³ã䜿ã£ãŠãå®è¡ãããã¯ãŒã«ãŒæ°ãèšå®ã§ããŸãïŒ
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
# (1)!
CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"]
- ããã§ã¯
--workersã³ãã³ãã©ã€ã³ãªãã·ã§ã³ã䜿ã£ãŠãã¯ãŒã«ãŒæ°ã4ã«èšå®ããŠããŸãã
以äžã¯ããããçã«ããªã£ãŠããå Žåã®äŸã§ãïŒ
ã·ã³ãã«ãªã¢ããª
ã¢ããªã±ãŒã·ã§ã³ããã¯ã©ã¹ã¿ã§ã¯ãªãåäžãµãŒãã§å®è¡ã§ããã»ã©ã·ã³ãã«ã§ããå Žåãã³ã³ããå ã«ããã»ã¹ãããŒãžã£ã欲ãããªãããšããããŸãã
Docker Compose
Docker Composeã§åäžãµãŒãïŒã¯ã©ã¹ã¿ã§ã¯ãªãïŒã«ãããã€ããããšãã§ããŸãã®ã§ãå ±æãããã¯ãŒã¯ãšããŒããã©ã³ã·ã³ã°ãç¶æããªããïŒDocker Composeã§ïŒã³ã³ããã®ã¬ããªã±ãŒã·ã§ã³ã管çããç°¡åãªæ¹æ³ã¯ãªãã§ãããã
ãã®å Žåãåäžã®ã³ã³ããã§ãããã»ã¹ãããŒãžã£ãå éšã§è€æ°ã®ã¯ãŒã«ãŒããã»ã¹ãèµ·åããããã«ããŸãã
éèŠãªã®ã¯ããããã®ã©ãããç²ç®çã«åŸããªããã°ãªããªãã絶察çãªã«ãŒã«ãã§ã¯ãªããšããããšã§ãããããã®ã¢ã€ãã¢ã¯ãããªãèªèº«ã®ãŠãŒã¹ã±ãŒã¹ãè©äŸ¡ããããªãã®ã·ã¹ãã ã«æé©ãªã¢ãããŒããæ±ºå®ããããã«äœ¿çšã§ããŸããæ¬¡ã®æŠå¿µãã©ã管çãããã確èªããŠãã ããïŒ
- ã»ãã¥ãªã㣠- HTTPS
- èµ·åæã®å®è¡
- åèµ·å
- ã¬ããªã±ãŒã·ã§ã³ïŒå®è¡äžã®ããã»ã¹æ°ïŒ
- ã¡ã¢ãª
- éå§åã®äºåã¹ããã
ã¡ã¢ãª
ã³ã³ããããšã«åäžã®ããã»ã¹ãå®è¡ãããšããããã®ã³ã³ããïŒã¬ããªã±ãŒããããŠããå Žåã¯1ã€ä»¥äžïŒã«ãã£ãŠæ¶è²»ãããå€ããå°ãªããæç¢ºã«å®çŸ©ããããå®å®ãå¶éãããéã®ã¡ã¢ãªãæã€ããšã«ãªããŸãã
ãããŠãã³ã³ãã管çã·ã¹ãã ïŒKubernetesãªã©ïŒã®èšå®ã§ãåãã¡ã¢ãªå¶éãšèŠä»¶ãèšå®ããããšãã§ããŸãã
ããããã°ãã³ã³ãããå¿ èŠãšããã¡ã¢ãªéãšã¯ã©ã¹ã¿å ã®ãã·ã³ã§å©çšå¯èœãªã¡ã¢ãªéãèæ ®ããŠãå©çšå¯èœãªãã·ã³ã«ã³ã³ãããã¬ããªã±ãŒãã§ããããã«ãªããŸãã
ã¢ããªã±ãŒã·ã§ã³ãã·ã³ãã«ãªãã®ã§ããã°ãããã¯ããããåé¡ã«ã¯ãªããªãã§ãããããããŒããªã¡ã¢ãªå¶éãæå®ããå¿ èŠã¯ãªããããããªãã§ãã
ããããå€ãã®ã¡ã¢ãªã䜿çšããŠããå ŽåïŒããšãã°æ©æ¢°åŠç¿ã¢ãã«ãªã©ïŒãã©ãã ãã®ã¡ã¢ãªãæ¶è²»ããŠãããã確èªããåãã·ã³ã§å®è¡ããã³ã³ããã®æ°ã調æŽããå¿ èŠããããŸãïŒãããŠããããã¯ã©ã¹ã¿ã«ãã·ã³ã远å ããŸãïŒã
ã³ã³ããããšã«è€æ°ã®ããã»ã¹ãå®è¡ããå Žåãèµ·åããããã»ã¹ã®æ°ãå©çšå¯èœãªã¡ã¢ãªä»¥äžã«æ¶è²»ããªãããã«ããå¿ èŠããããŸãã
éå§åã®äºåã¹ããããšã³ã³ãã
ã³ã³ããïŒDockerãKubernetesãªã©ïŒã䜿ã£ãŠããå Žåãäž»ã«2ã€ã®ã¢ãããŒãããããŸãã
è€æ°ã®ã³ã³ãã
è€æ°ã®ã³ã³ãããããããããããããããåäžã®ããã»ã¹ãå®è¡ããŠããå ŽåïŒäŸãã°ãKubernetesã¯ã©ã¹ã¿ãªã©ïŒãã¬ããªã±ãŒããããã¯ãŒã«ãŒã³ã³ãããå®è¡ããåã«ãåäžã®ã³ã³ããã§äºåã®ã¹ãããã®äœæ¥ãè¡ãå¥ã®ã³ã³ãããæã¡ãããšæãã§ãããã
/// info | æ å ±
ããKubernetesã䜿çšããŠããå Žå, ããã¯ããããInit Containerã§ãããã
///
ãŠãŒã¹ã±ãŒã¹ãäºåã®ã¹ãããã䞊åã§è€æ°åå®è¡ããã®ã«åé¡ããªãå ŽåïŒäŸïŒããŒã¿ããŒã¹ãã€ã°ã¬ãŒã·ã§ã³ãå®è¡ããã®ã§ã¯ãªããããŒã¿ããŒã¹ã®æºåãã§ãããããã§ãã¯ããã ãã®å ŽåïŒãã¡ã€ã³ããã»ã¹ãéå§ããçŽåã«ããããã®ã¹ããããåã³ã³ããã«å ¥ããããšãå¯èœã§ãã
åäžã³ã³ãã
åçŽãªã»ããã¢ããã§ãåäžã®ã³ã³ããã§è€æ°ã®ã¯ãŒã«ãŒããã»ã¹ïŒãŸãã¯1ã€ã®ããã»ã¹ã®ã¿ïŒãèµ·åããå Žåãã¢ããªã§ããã»ã¹ãéå§ããçŽåã«ãåãã³ã³ããã§äºåã®ã¹ããããå®è¡ã§ããŸãã
ããŒã¹Dockerã€ã¡ãŒãž
以åã¯ãå ¬åŒã®FastAPI Dockerã€ã¡ãŒãžããããŸããïŒtiangolo/uvicorn-gunicorn-fastapiãããããçŸåšã¯éæšå¥šã§ããâïž
ããããããã®ããŒã¹Dockerã€ã¡ãŒãžïŒãŸãã¯ãã®ä»ã®é¡äŒŒã®ãã®ïŒã¯äœ¿çšããªãæ¹ãããã§ãããã
ãã§ã«KubernetesïŒãŸãã¯ä»ã®ãã®ïŒã䜿çšããŠããŠãè€æ°ã®ã³ã³ããã§ãã¯ã©ã¹ã¿ã¬ãã«ã§ã¬ããªã±ãŒã·ã§ã³ãèšå®ããŠããå Žåããã®ãããªå Žåã¯ãäžèšã§èª¬æããããã«ãŒãããã€ã¡ãŒãžãæ§ç¯ããæ¹ãããã§ãããïŒFastAPIçšã®Dockerã€ã¡ãŒãžããã«ãããã
ãŸããè€æ°ã®ã¯ãŒã«ãŒãå¿
èŠãªå Žåã¯ãåçŽã« --workers ã³ãã³ãã©ã€ã³ãªãã·ã§ã³ã䜿çšã§ããŸãã
/// note | æè¡è©³çް
ãã®Dockerã€ã¡ãŒãžã¯ãUvicornã忢ããã¯ãŒã«ãŒã®ç®¡çãšåèµ·åããµããŒãããŠããªãã£ãé ã«äœæããããããUvicornãšäžç·ã«Gunicornã䜿ãå¿ èŠããããŸãããããã¯ãGunicornã«Uvicornã¯ãŒã«ãŒããã»ã¹ã®ç®¡çãšåèµ·åããããã ãã®ããã«ãããªãã®è€éãã远å ããŠããŸããã
ãããçŸåšã¯ãUvicornïŒããã³ fastapi ã³ãã³ãïŒã --workers ããµããŒãããŠãããããèªåã§ãã«ããã代ããã«ããŒã¹Dockerã€ã¡ãŒãžã䜿ãçç±ã¯ãããŸããïŒã³ãŒãéãã ãããåãã§ã ð
ïŒã
///
ã³ã³ããã»ã€ã¡ãŒãžã®ãããã€
ã³ã³ããïŒDockerïŒã€ã¡ãŒãžãæã«å ¥ããåŸãããããããã€ããã«ã¯ããã€ãã®æ¹æ³ããããŸãã
äŸãã°ä»¥äžã®ãªã¹ãã®æ¹æ³ã§ã:
- åäžãµãŒããŒã®Docker Compose
- Kubernetesã¯ã©ã¹ã¿
- Docker Swarmã¢ãŒãã®ã¯ã©ã¹ã¿ãŒ
- Nomadã®ãããªå¥ã®ããŒã«
- ã³ã³ããã»ã€ã¡ãŒãžããããã€ããã¯ã©ãŠãã»ãµãŒãã¹
uv ã䜿ã£ãDockerã€ã¡ãŒãž
uv ã䜿ã£ãŠãããžã§ã¯ãã®ã€ã³ã¹ããŒã«ãšç®¡çãããŠããå Žåã¯ãuv Docker guideã«åŸã£ãŠãã ããã
ãŸãšã
ã³ã³ããã»ã·ã¹ãã ïŒäŸãã°DockerãKubernetesãªã©ïŒã䜿ãã°ããã¹ãŠã®ãããã€ã¡ã³ãã®ã³ã³ã»ãããæ±ãã®ãããªãç°¡åã«ãªããŸãïŒ
- HTTPS
- èµ·åæã®å®è¡
- åèµ·å
- ã¬ããªã±ãŒã·ã§ã³ïŒå®è¡äžã®ããã»ã¹æ°ïŒ
- ã¡ã¢ãª
- éå§åã®äºåã¹ããã
ã»ãšãã©ã®å ŽåãããŒã¹ãšãªãã€ã¡ãŒãžã¯äœ¿çšãããå ¬åŒã®Python Dockerã€ã¡ãŒãžãããŒã¹ã«ããã³ã³ããã€ã¡ãŒãžããŒããããã«ãããŸãã
DockerfileãšDockerãã£ãã·ã¥å
ã®åœä»€ã®é çªã«æ³šæããããšã§ããã«ãæéãæå°åããçç£æ§ãæå€§åã§ããŸãïŒãããŠéå±ãé¿ããããšãã§ããŸãïŒãð

