From: HyeonJeong Yeo <84669195+nearnear@users.noreply.github.com>
Date: Mon, 22 Jan 2024 19:50:44 +0000 (+0900)
Subject: 🌐 Add Korean translation for `docs/ko/docs/deployment/docker.md` (#5657)
X-Git-Tag: 0.109.1~150
X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6c3d8eb2d9318e4e2a5d3e697b18e1bcdacb290e;p=thirdparty%2Ffastapi%2Ffastapi.git
🌐 Add Korean translation for `docs/ko/docs/deployment/docker.md` (#5657)
---
diff --git a/docs/ko/docs/deployment/docker.md b/docs/ko/docs/deployment/docker.md
new file mode 100644
index 0000000000..587b445fc2
--- /dev/null
+++ b/docs/ko/docs/deployment/docker.md
@@ -0,0 +1,698 @@
+# 컨í
ì´ëì FastAPI - ë커
+
+FastAPI ì´í리ì¼ì´ì
ì ë°°í¬í ë ì¼ë°ì ì¸ ì ê·¼ ë°©ë²ì **리ë
ì¤ ì»¨í
ì´ë ì´ë¯¸ì§**를 ìì±íë ê²ì
ëë¤. ì´ ë°©ë²ì ì£¼ë¡ **ë커**를 ì¬ì©í´ ì´ë£¨ì´ì§ëë¤. ê·¸ë° ë¤ì í´ë¹ 컨í
ì´ë ì´ë¯¸ì§ë¥¼ ëªê°ì§ ë°©ë²ì¼ë¡ ë°°í¬í ì ììµëë¤.
+
+리ë
ì¤ ì»¨í
ì´ë를 ì¬ì©íë ë°ìë **ë³´ì**, **ë°ë³µ ê°ë¥ì±**, **ë¨ìí¨** ë±ì ì¥ì ì´ ììµëë¤.
+
+!!! í
+ ìê°ì ì«ê¸°ê³ ìê³ ì´ë¯¸ ì´ë°ê²ë¤ì ìê³ ìë¤ë©´ [`Dockerfile`ð](#build-a-docker-image-for-fastapi)ë¡ ì íí ì ììµëë¤.
+
+
+ë커íì¼ ë¯¸ë¦¬ë³´ê¸° ð
+
+```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"]
+```
+
+
+
+## 컨í
ì´ëë
+
+컨í
ì´ë(ì£¼ë¡ ë¦¬ë
ì¤ ì»¨í
ì´ë)ë ì´í리ì¼ì´ì
ì ìì¡´ì±ê³¼ íìí íì¼ë¤ì 모ë í¨í¤ì§íë ë§¤ì° **ê°ë²¼ì´** ë°©ë²ì
ëë¤. 컨í
ì´ëë ê°ì ìì¤í
ì ìë ë¤ë¥¸ 컨í
ì´ë(ë¤ë¥¸ ì´í리ì¼ì´ì
ì´ë ììë¤)ì ë
립ì ì¼ë¡ ì ì§ë©ëë¤.
+
+리ë
ì¤ ì»¨í
ì´ëë í¸ì¤í¸(머ì , ê°ì 머ì , í´ë¼ì°ë ìë² ë±)ì ê°ì 리ë
ì¤ ì»¤ëì ì¬ì©í´ ì¤íë©ëë¤. ì´ë§ì 리ë
ì¤ ì»¨í
ì´ëê° (ì ì²´ ì´ìì²´ì 를 모방íë ë¤ë¥¸ ê°ì 머ì ê³¼ ë¹êµíì ë) ë§¤ì° ê°ë³ë¤ë ê²ì ì미í©ëë¤.
+
+ì´ ë°©ë²ì íµí´, 컨í
ì´ëë ì§ì íë¡ì¸ì¤ë¥¼ ì¤ííë ê²ê³¼ ë¹ì·í ì ëì **ì ì ìì**ì ìë¹í©ëë¤ (ê°ì 머ì ì í¨ì¬ ë§ì ììì ìë¹í ê²ì
ëë¤).
+
+컨í
ì´ëë ëí ê·¸ë¤ë§ì **ë
립ë** ì¤í íë¡ì¸ì¤ (ì¼ë°ì ì¼ë¡ íëì íë¡ì¸ì¤ë¡ ì¶©ë¶í©ëë¤), íì¼ ìì¤í
, ê·¸ë¦¬ê³ ë¤í¸ìí¬ë¥¼ ê°ì§ë¯ë¡ ë°°í¬, ë³´ì, ê°ë° ë° ê¸°í ê³¼ì ì ë¨ìí í©ëë¤.
+
+## 컨í
ì´ë ì´ë¯¸ì§ë
+
+**컨í
ì´ë**ë **컨í
ì´ë ì´ë¯¸ì§**를 ì¤íí ê² ì
ëë¤.
+
+컨í
ì´ë ì´ë¯¸ì§ë 컨í
ì´ëì íìí 모ë íì¼, íê²½ ë³ì ê·¸ë¦¬ê³ ëí´í¸ ëª
ë ¹/íë¡ê·¸ë¨ì **ì ì ** ë²ì ì
ëë¤. ì¬ê¸°ì **ì ì **ì´ë ë§ì 컨í
ì´ë **ì´ë¯¸ì§**ê° ìëëê±°ë ì¤íëì§ ìì¼ë©°, ë¨ì§ í¨í¤ì§ íì¼ê³¼ ë©í ë°ì´í°ë¼ë ê²ì ì미í©ëë¤.
+
+ì ì¥ë ì ì 컨í
ì¸ ì¸ **컨í
ì´ë ì´ë¯¸ì§**ì ëì¡°ëê², **컨í
ì´ë**ë ë³´íµ ì¤íë ì ìë ìë ì¸ì¤í´ì¤ë¥¼ ì미í©ëë¤.
+
+**컨í
ì´ë**ê° (**컨í
ì´ë ì´ë¯¸ì§**ë¡ ë¶í°) ììëê³ ì¤íëë©´, 컨í
ì´ëë íì¼ì´ë íê²½ ë³ì를 ìì±íê±°ë ë³ê²½í ì ììµëë¤. ì´ë¬í ë³íë ì¤ì§ 컨í
ì´ëììë§ ì¡´ì¬íë©°, ê·¸ 기ë°ì´ ëë 컨í
ì´ë ì´ë¯¸ì§ìë ì§ìëì§ ììµëë¤ (ì¦ ëì¤í¬ìë ì ì¥ëì§ ììµëë¤).
+
+컨í
ì´ë ì´ë¯¸ì§ë **íë¡ê·¸ë¨** íì¼ê³¼ 컨í
ì¸ , ì¦ `python`ê³¼ ì´ë¤ íì¼ `main.py`ì ë¹êµí ì ììµëë¤.
+
+ê·¸ë¦¬ê³ (**컨í
ì´ë ì´ë¯¸ì§**ì ëë¹í´ì) **컨í
ì´ë**ë ì´ë¯¸ì§ì ì¤ì ì¤í ì¸ì¤í´ì¤ë¡ **íë¡ì¸ì¤**ì ë¹êµí ì ììµëë¤. ì¬ì¤, 컨í
ì´ëë **íë¡ì¸ì¤ ë¬ë**ì´ ìì ëë§ ì¤íë©ëë¤ (ê·¸ë¦¬ê³ ë³´íµ íëì íë¡ì¸ì¤ ì
ëë¤). 컨í
ì´ëë ë´ë¶ìì ì¤íëë íë¡ì¸ì¤ê° ìì¼ë©´ ì¢
ë£ë©ëë¤.
+
+## 컨í
ì´ë ì´ë¯¸ì§
+
+ë커ë **컨í
ì´ë ì´ë¯¸ì§**ì **컨í
ì´ë**를 ìì±íê³ ê´ë¦¬íëë° ì£¼ì ë구 ì¤ íëê° ëì´ììµëë¤.
+
+ê·¸ë¦¬ê³ ë커 íë¸ì ë¤ìí ë구, íê²½, ë°ì´í°ë² ì´ì¤, ê·¸ë¦¬ê³ ì´í리ì¼ì´ì
ì ëí´ ë¯¸ë¦¬ ë§ë¤ì´ì§ **ê³µì 컨í
ì´ë ì´ë¯¸ì§**ê° ê³µê°ëì´ ììµëë¤.
+
+ì를 ë¤ì´, ê³µì íì´ì¬ ì´ë¯¸ì§ê° ììµëë¤.
+
+ëí ë¤ë¥¸ ëì, ì를 ë¤ë©´ ë°ì´í°ë² ì´ì¤ë¥¼ ìí ì´ë¯¸ì§ë¤ë ììµëë¤:
+
+* PostgreSQL
+* MySQL
+* MongoDB
+* Redis ë±
+
+미리 ë§ë¤ì´ì§ 컨í
ì´ë ì´ë¯¸ì§ë¥¼ ì¬ì©íë©´ ìë¡ ë¤ë¥¸ ë구ë¤ì **ê²°í©**í기 ì½ìµëë¤. ëë¶ë¶ì ê²½ì°ì, **ê³µì ì´ë¯¸ì§ë¤**ì ì¬ì©íê³ íê²½ ë³ì를 íµí´ ì¤ì í ì ììµëë¤.
+
+ì´ë° ë°©ë²ì¼ë¡ ëë¶ë¶ì ê²½ì°ì 컨í
ì´ëì ë커ì ëí´ ë°°ì¸ ì ìì¼ë©° ë¤ìí ë구ì ììë¤ì ëí ì§ìì ì¬ì¬ì©í ì ììµëë¤.
+
+ë°ë¼ì, ìë¡ ë¤ë¥¸ **ë¤ì¤ 컨í
ì´ë**를 ìì±í ë¤ì ì´ë¤ì ì°ê²°í ì ììµëë¤. ì를 ë¤ì´ ë°ì´í°ë² ì´ì¤, íì´ì¬ ì´í리ì¼ì´ì
, 리ì¡í¸ íë¡ í¸ìë ì´í리ì¼ì´ì
ì ì¬ì©íë ì¹ ìë²ì ëí 컨í
ì´ë를 ë§ë¤ì´ ì´ë¤ì ë´ë¶ ë¤í¸ìí¬ë¡ ê° ì»¨í
ì´ë를 ì°ê²°í ì ììµëë¤.
+
+모ë 컨í
ì´ë ê´ë¦¬ ìì¤í
(ë커ë ì¿ ë²ë¤í°ì¤)ì ì´ë¬í ë¤í¸ìí¹ í¹ì±ì í¬í¨íê³ ììµëë¤.
+
+## 컨í
ì´ëì íë¡ì¸ì¤
+
+**컨í
ì´ë ì´ë¯¸ì§**ë ë³´íµ **컨í
ì´ë**를 ììí기 ìí´ íìí ë©íë°ì´í°ì ëí´í¸ 커맨ë/íë¡ê·¸ë¨ê³¼ ê·¸ íë¡ê·¸ë¨ì ì ë¬í기 ìí íë¼ë¯¸í°ë¤ì í¬í¨í©ëë¤. ì´ë 커맨ë ë¼ì¸ìì íë¡ê·¸ë¨ì ì¤íí ë íìí ê°ë¤ê³¼ ì ì¬í©ëë¤.
+
+**컨í
ì´ë**ê° ììëë©´, í´ë¹ 커맨ë/íë¡ê·¸ë¨ì´ ì¤íë©ëë¤ (ê·¸ë¬ë ë¤ë¥¸ 커맨ë/íë¡ê·¸ë¨ì ì¤ííëë¡ ì¤ë²ë¼ì´ë í ì ììµëë¤).
+
+컨í
ì´ëë **ë©ì¸ íë¡ì¸ì¤**(커맨ë ëë íë¡ê·¸ë¨)ì´ ì¤íëë ëì ì¤íë©ëë¤.
+
+컨í
ì´ëë ì¼ë°ì ì¼ë¡ **ë¨ì¼ íë¡ì¸ì¤**를 ê°ì§ê³ ìì§ë§, ë©ì¸ íë¡ì¸ì¤ì ìë¸ íë¡ì¸ì¤ë¥¼ ììíë ê²ë ê°ë¥íë©°, ì´ ë°©ë²ì¼ë¡ íëì 컨í
ì´ëì **ë¤ì¤ íë¡ì¸ì¤**를 ê°ì§ ì ììµëë¤.
+
+ê·¸ë¬ë **ìµìí íëì ì¤íì¤ì¸ íë¡ì¸ì¤**를 ê°ì§ì§ ìê³ ìë ì¤íì¤ì¸ 컨í
ì´ë를 ê°ì§ ì ììµëë¤. ë§ì½ ë©ì¸ íë¡ì¸ì¤ê° ì¤ë¨ëë©´, 컨í
ì´ëë ì¤ë¨ë©ëë¤.
+
+## FastAPI를 ìí ë커 ì´ë¯¸ì§ ë¹ëí기
+
+ì´ì 무ì¸ê°ë¥¼ ë§ë¤ì´ ë´
ìë¤! ð
+
+**ê³µì íì´ì¬** ì´ë¯¸ì§ì 기ë°íì¬, FastAPI를 ìí **ë커 ì´ë¯¸ì§**를 **맨 ì²ìë¶í°** ìì±íë ë°©ë²ì ë³´ì´ê² ìµëë¤.
+
+**ëë¶ë¶ì ê²½ì°**ì ë¤ìê³¼ ê°ì ê²ë¤ì íê² ë©ëë¤. ì를 ë¤ë©´:
+
+* **ì¿ ë²ë¤í°ì¤** ëë ì ì¬í ë구 ì¬ì©í기
+* **ë¼ì¦ë² 리 íì´**ë¡ ì¤íí기
+* 컨í
ì´ë ì´ë¯¸ì§ë¥¼ ì¤íí í´ë¼ì°ë ìë¹ì¤ ì¬ì©í기 ë±
+
+### ì구 í¨í¤ì§
+
+ì¼ë°ì ì¼ë¡ë ì´í리ì¼ì´ì
ì í¹ì íì¼ì ìí **í¨í¤ì§ ì구 ì¡°ê±´**ì´ ìì ê²ì
ëë¤.
+
+ê·¸ ì구 ì¡°ê±´ì **ì¤ì¹**íë ë°©ë²ì ì¬ë¬ë¶ì´ ì¬ì©íë ë구ì ë°ë¼ ë¤ë¥¼ ê²ì
ëë¤.
+
+ê°ì¥ ì¼ë°ì ì¸ ë°©ë²ì í¨í¤ì§ ì´ë¦ê³¼ ë²ì ì´ ì¤ ë³ë¡ 기ë¡ë `requirements.txt` íì¼ì ë§ëë ê²ì
ëë¤.
+
+ë²ì ì ë²ì를 ì¤ì í기 ìí´ìë [FastAPI ë²ì ë¤ì ëíì¬](./versions.md){.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`ë¡ ì¤ì¹í©ëë¤. ì를 ë¤ì´:
+
+
+
+```console
+$ pip install -r requirements.txt
+---> 100%
+Successfully installed fastapi pydantic uvicorn
+```
+
+
+
+!!! ì ë³´
+ í¨í¤ì§ ì¢
ìì±ì ì ìíê³ ì¤ì¹í기 ìí ë°©ë²ê³¼ ë구ë ë¤ìí©ëë¤.
+
+ ëì¤ì ìë ì¸ì
ìì Poetry를 ì¬ì©í ìì를 ë³´ì´ê² ìµëë¤. ð
+
+### **FastAPI** ì½ë ìì±í기
+
+* `app` ëë í°ë¦¬ë¥¼ ìì±íê³ ì´ëí©ëë¤.
+* ë¹ íì¼ `__init__.py`ì ìì±í©ëë¤.
+* ë¤ìê³¼ ê°ì `main.py`ì ìì±í©ëë¤:
+
+```Python
+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 .annotate }
+# (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"]
+```
+
+1. ê³µì íì´ì¬ ë² ì´ì¤ ì´ë¯¸ì§ìì ììí©ëë¤.
+
+2. íì¬ ìí¹ ëë í°ë¦¬ë¥¼ `/code`ë¡ ì¤ì í©ëë¤.
+
+ ì¬ê¸°ì `requirements.txt` íì¼ê³¼ `app` ëë í°ë¦¬ë¥¼ ìì¹ìí¬ ê²ì
ëë¤.
+
+3. ì구 ì¡°ê±´ê³¼ íì¼ì `/code` ëë í°ë¦¬ë¡ ë³µì¬í©ëë¤.
+
+ ì²ììë **ì¤ì§** ì구 ì¡°ê±´ì´ íìí íì¼ë§ ë³µì¬íê³ , ì´ì¸ì ì½ëë ê·¸ëë¡ ë¡ëë¤.
+
+ ì´ íì¼ì´ **ì주 ë°ëì§ ì기 ë문ì**, ë커ë íì¼ì íì§íì¬ ì´ ë¨ê³ì **ìºì**를 ì¬ì©íì¬ ë¤ì ë¨ê³ììë ìºì를 ì¬ì©í ì ìëë¡ í©ëë¤.
+
+4. ì구 ì¡°ê±´ íì¼ì ìë í¨í¤ì§ ì¢
ìì±ì ì¤ì¹í©ëë¤.
+
+ `--no-cache-dir` ìµì
ì `pip`ìê² ë¤ì´ë¡ëí í¨í¤ì§ë¤ì ë¡ì»¬ íê²½ì ì ì¥íì§ ìëë¡ ì ë¬í©ëë¤. ì´ë ë§ì¹ ê°ì í¨í¤ì§ë¥¼ ì¤ì¹í기 ìí´ ì¤ì§ `pip`ë§ ë¤ì ì¤ííë©´ ë ê² ê°ì§ë§, 컨í
ì´ëë¡ ìì
íë ê²½ì° ê·¸ë ì§ë ììµëë¤.
+
+ !!! ë
¸í¸
+ `--no-cache-dir` ë ì¤ì§ `pip`ì ê´ë ¨ëì´ ìì¼ë©°, ë커ë 컨í
ì´ëìë 무ê´í©ëë¤.
+
+ `--upgrade` ìµì
ì `pip`ìê² ì¤ì¹ë í¨í¤ì§ë¤ì ì
ë°ì´í¸íëë¡ í©ëë¤.
+
+ ì´ì ë¨ê³ìì íì¼ì ë³µì¬í ê²ì´ **ë커 ìºì**ì ìí´ íì§ë기 ë문ì, ì´ ë¨ê³ììë ê°ë¥í í **ë커 ìºì**를 ì¬ì©íê² ë©ëë¤.
+
+ ì´ ë¨ê³ìì ìºì를 ì¬ì©íë©´ **매ë²** 모ë ì¢
ìì±ì ë¤ì´ë¡ë ë°ê³ ì¤ì¹í íìê° ìì´, ê°ë° ê³¼ì ìì ì´ë¯¸ì§ë¥¼ ì§ìì ì¼ë¡ ìì±íë ë°ì ëë **ìê°**ì ë§ì´ **ì ì½**í ì ììµëë¤.
+
+5. `/code` ëë í°ë¦¬ì `./app` ëë í°ë¦¬ë¥¼ ë³µì¬í©ëë¤.
+
+ **ì주 ë³ê²½ëë** 모ë ì½ë를 í¬í¨íê³ ì기 ë문ì, ë커 **ìºì**ë ì´ ë¨ê³ë **ì´íì ë¨ê³ìì** ì ì¬ì©ëì§ ììµëë¤.
+
+ ê·¸ë¬ë¯ë¡ 컨í
ì´ë ì´ë¯¸ì§ ë¹ë ìê°ì ìµì íí기 ìí´ `Dockerfile`ì **ê±°ì ë ë¶ë¶**ì ì
ë ¥íë ê²ì´ ì¤ìí©ëë¤.
+
+6. `uvicorn` ìë²ë¥¼ ì¤íí기 ìí´ **커맨ë**를 ì¤ì í©ëë¤.
+
+ `CMD`ë 문ìì´ ë¦¬ì¤í¸ë¥¼ ì
ë ¥ë°ê³ , ê° ë¬¸ìì´ì 커맨ë ë¼ì¸ì ê° ì¤ì ì
ë ¥í 문ìì´ì
ëë¤.
+
+ ì´ ì»¤ë§¨ëë **íì¬ ìí¹ ëë í°ë¦¬**ìì ì¤íëë©°, ì´ë ììì `WORKDIR /code`ë¡ ì¤ì í `/code` ëë í°ë¦¬ì ê°ìµëë¤.
+
+ íë¡ê·¸ë¨ì´ `/code`ìì ììíê³ ê·¸ ìì `./app` ëë í°ë¦¬ê° ì¬ë¬ë¶ì ì½ëì í¨ê» ë¤ì´ì기 ë문ì, **Uvicorn**ì ì´ë¥¼ ë³´ê³ `app`ì `app.main`ì¼ë¡ë¶í° **ë¶ë¬ ì¬** ê²ì
ëë¤.
+
+!!! í
+ ê° ì½ë ë¼ì¸ì ì½ëì ì«ì ë²ë¸ì í´ë¦íì¬ ë¦¬ë·°í ì ììµëë¤. ð
+
+ì´ì ì¬ë¬ë¶ì ë¤ìê³¼ ê°ì ëë í°ë¦¬ 구조를 ê°ì§ê³ ìì ê²ì
ëë¤:
+
+```
+.
+âââ app
+â  âââ __init__.py
+â âââ main.py
+âââ Dockerfile
+âââ requirements.txt
+```
+
+#### TLS ì¢
ë£ íë¡ìì ë°°í
+
+ë§ì½ ì¬ë¬ë¶ì´ 컨í
ì´ë를 Nginx ëë Traefikê³¼ ê°ì TLS ì¢
ë£ íë¡ì (ë¡ë ë°¸ë°ì) ë¤ìì ì¤ííê³ ìë¤ë©´, `--proxy-headers` ìµì
ì ëíë ê²ì´ ì¢ìµëë¤. ì´ ìµì
ì Uvicornìê² ì´í리ì¼ì´ì
ì´ HTTPS ë±ì ë¤ìì ì¤íëê³ ìì¼ë¯ë¡ íë¡ììì ì ì¡ë í¤ë를 ì 뢰í ì ìë¤ê³ ì립ëë¤.
+
+```Dockerfile
+CMD ["uvicorn", "app.main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "80"]
+```
+
+#### ë커 ìºì
+
+ì´ `Dockerfile`ìë ì¤ìí í¸ë¦ì´ ìëë°, ì²ììë **ìì¡´ì±ì´ ìë íì¼ë§** ë³µì¬íê³ , ëë¨¸ì§ ì½ëë ê·¸ëë¡ ë¡ëë¤. ì ì´ë° ë°©ë²ì ì¨ì¼íëì§ ì¤ëª
íê² ìµëë¤.
+
+```Dockerfile
+COPY ./requirements.txt /code/requirements.txt
+```
+
+ë커ì ë¤ë¥¸ ë구ë¤ì 컨í
ì´ë ì´ë¯¸ì§ë¥¼ **ì¦ê°íë ë°©ìì¼ë¡ ë¹ë**í©ëë¤. `Dockerfile`ì 맨 ì ë¶ë¶ë¶í° ììí´, ë ì´ì´ ìì ìë¡ì´ ë ì´ì´ë¥¼ ëíë ë°©ìì¼ë¡, `Dockerfile`ì ê° ì§ì ì¬íì¼ë¡ ë¶í° ìì±ë ì´ë¤ íì¼ì´ë ëí´ê°ëë¤.
+
+ë커 ê·¸ë¦¬ê³ ì´ì ì ì¬í ë구ë¤ì ì´ë¯¸ì§ ìì± ìì **ë´ë¶ ìºì**를 ì¬ì©í©ëë¤. ë§ì½ ì´ë¤ íì¼ì´ ë§ì§ë§ì¼ë¡ 컨í
ì´ë ì´ë¯¸ì§ë¥¼ ë¹ëí ëë¡ë¶í° ë°ëì§ ììë¤ë©´, íì¼ì ë¤ì ë³µì¬íì¬ ìë¡ì´ ë ì´ì´ë¥¼ ì²ìë¶í° ìì±íë ê²ì´ ìëë¼, ë§ì§ë§ì ìì±íë **ê°ì ë ì´ì´ë¥¼ ì¬ì¬ì©**í©ëë¤.
+
+ë¨ì§ íì¼ ë³µì¬ë¥¼ ì§ìíë ê²ì¼ë¡ í¨ì¨ì´ ë§ì´ í¥ìëë ê²ì ìëì§ë§, ê·¸ ë¨ê³ìì ìºì를 ì¬ì©í기 ë문ì, **ë¤ì ë¨ê³ììë ë§ì°¬ê°ì§ë¡ ìºì를 ì¬ì©**í ì ììµëë¤. ì를 ë¤ì´, ë¤ìê³¼ ê°ì ìì¡´ì±ì ì¤ì¹íë ì§ì ì¬íì ìí ìºì를 ì¬ì©í ì ììµëë¤:
+
+```Dockerfile
+RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
+```
+
+í¨í¤ì§ë¥¼ í¬í¨íë íì¼ì **ì주 ë³ê²½ëì§ ììµëë¤**. ë°ë¼ì í´ë¹ íì¼ë§ ë³µì¬íë¯ë¡ì, ë커ë ê·¸ ë¨ê³ì **ìºì를 ì¬ì©**í ì ììµëë¤.
+
+ê·¸ ë¤ìì¼ë¡, ë커ë **ë¤ì ë¨ê³ìì** ìì¡´ì±ì ë¤ì´ë¡ëíê³ ì¤ì¹íë **ìºì를 ì¬ì©**í ì ìê² ë©ëë¤. ë°ë¡ ì´ ê³¼ì ìì ì°ë¦¬ë **ë§ì ìê°ì ì ì½**íê² ë©ëë¤. ⨠...ê·¸ë¦¬ê³ ê¸°ë¤ë¦¬ë ì§ë£¨í¨ë í¼í ì ììµëë¤. ðªð
+
+í¨í¤ì§ ìì¡´ì±ì ë¤ì´ë¡ë ë°ê³ ì¤ì¹íë ë°ì´ë **ì ë¶ì´ 걸릴 ì ìì§ë§**, **ìºì**를 ì¬ì©íë©´ ìµë **ì ì´ë§ì** ëë¼ ì ììµëë¤.
+
+ëí ì¬ë¬ë¶ì´ ê°ë° ê³¼ì ìì ì½ëì ë³ê²½ ì¬íì´ ë°ìëìëì§ íì¸í기 ìí´ ì»¨í
ì´ë ì´ë¯¸ì§ë¥¼ ê³ìí´ì ë¹ëíë©´, ì ì½ë ìê°ì ì¶ì ëì´ ëì± ì»¤ì§ ê²ì
ëë¤.
+
+ê·¸ë¦¬ê³ ëì `Dockerfile`ì ê±°ì ë ë¶ë¶ìì, 모ë ì½ë를 ë³µì¬í©ëë¤. ì´ê²ì´ **ê°ì¥ ë¹ë²íê² ë³ê²½**ëë ë¶ë¶ì´ë©°, ëë¶ë¶ì ê²½ì°ì ì´ ë¤ì ë¨ê³ììë ìºì를 ì¬ì©í ì ì기 ë문ì ê°ì¥ ë§ì§ë§ì ë¡ëë¤.
+
+```Dockerfile
+COPY ./app /code/app
+```
+
+### ë커 ì´ë¯¸ì§ ìì±í기
+
+ì´ì 모ë íì¼ì´ ì ì리ì ìì¼ë, 컨í
ì´ë ì´ë¯¸ì§ë¥¼ ë¹ëí©ëë¤.
+
+* (ì¬ë¬ë¶ì `Dockerfile`ê³¼ `app` ëë í°ë¦¬ê° ìì¹í) íë¡ì í¸ ëë í°ë¦¬ë¡ ì´ëí©ëë¤.
+* FastAPI ì´ë¯¸ì§ë¥¼ ë¹ëí©ëë¤:
+
+
+
+```console
+$ docker build -t myimage .
+
+---> 100%
+```
+
+
+
+!!! í
+ 맨 ëì ìë `.` ì 주목í©ìë¤. ì´ë `./`ì ëë±íë©°, ë커ìê² ì»¨í
ì´ë ì´ë¯¸ì§ë¥¼ ë¹ëí기 ìí ëë í°ë¦¬ë¥¼ ìë ¤ì¤ëë¤.
+
+ ì´ ê²½ì°ìë íì¬ ëë í°ë¦¬(`.`)ì ê°ìµëë¤.
+
+### ë커 컨í
ì´ë ììí기
+
+* ì¬ë¬ë¶ì ì´ë¯¸ì§ì 기ë°íì¬ ì»¨í
ì´ë를 ì¤íí©ëë¤:
+
+
+
+```console
+$ docker run -d --name mycontainer -p 80:80 myimage
+```
+
+
+
+## ì²´í¬í기
+
+ì¬ë¬ë¶ì ë커 컨í
ì´ë URLìì ì¤í ì¬íì ì²´í¬í ì ììµëë¤. ì를 ë¤ì´: http://192.168.99.100/items/5?q=somequery ëë http://127.0.0.1/items/5?q=somequery (ëë ëì¼íê², ì¬ë¬ë¶ì ë커 í¸ì¤í¸ë¥¼ ì´ì©í´ì ì²´í¬í ìë ììµëë¤).
+
+ìëì ë¹ì·í ê²ì ë³´ê² ë ê²ì
ëë¤:
+
+```JSON
+{"item_id": 5, "q": "somequery"}
+```
+
+## ì¸í°ëí°ë¸ API 문ì
+
+ì´ì ì¬ë¬ë¶ì http://192.168.99.100/docs ëë http://127.0.0.1/docsë¡ ì´ëí ì ììµëë¤(ëë, ì¬ë¬ë¶ì ë커 í¸ì¤í¸ë¥¼ ì´ì©í ì ììµëë¤).
+
+ì¬ë¬ë¶ì ìëì¼ë¡ ìì±ë ì¸í°ëí°ë¸ API(Swagger UIìì ì ê³µë)를 ë³¼ ì ììµëë¤:
+
+
+
+## ëì API 문ì
+
+ëí ì¬ë¬ë¶ì http://192.168.99.100/redoc ëë http://127.0.0.1/redocì¼ë¡ ì´ëí ì ììµëë¤(ëë, ì¬ë¬ë¶ì ë커 í¸ì¤í¸ë¥¼ ì´ì©í ì ììµëë¤).
+
+ì¬ë¬ë¶ì ìëì¼ë¡ ìì±ë ëì 문ì(ReDocìì ì ê³µë)를 ë³¼ ì ììµëë¤:
+
+
+
+## ë¨ì¼ íì¼ FastAPIë¡ ë커 ì´ë¯¸ì§ ìì±í기
+
+ë§ì½ ì¬ë¬ë¶ì FastAPIê° íëì íì¼ì´ë¼ë©´, ì를 ë¤ì´ `./app` ëë í°ë¦¬ ìì´ `main.py` íì¼ë§ì¼ë¡ ì´ë£¨ì´ì ¸ ìë¤ë©´, íì¼ êµ¬ì¡°ë ë¤ìê³¼ ì ì¬í ê²ì
ëë¤:
+
+```
+.
+âââ Dockerfile
+âââ main.py
+âââ requirements.txt
+```
+
+ê·¸ë¬ë©´ ì¬ë¬ë¶ë¤ì `Dockerfile` ë´ì ìë íì¼ì ë³µì¬í기 ìí´ ê·¸ì ììíë ê²½ë¡ë¥¼ ë°ê¾¸ê¸°ë§ íë©´ ë©ëë¤:
+
+```{ .dockerfile .annotate hl_lines="10 13" }
+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"]
+```
+
+1. `main.py` íì¼ì `/code` ëë í°ë¦¬ë¡ ê³§ë°ë¡ ë³µì¬í©ëë¤(`./app` ëë í°ë¦¬ë ê³ ë ¤íì§ ììµëë¤).
+
+2. Uvicornì ì¤íí´ `app` ê°ì²´ë¥¼ (`app.main` ëì ) `main`ì¼ë¡ ë¶í° ë¶ë¬ì¤ëë¡ í©ëë¤.
+
+ê·¸ ë¤ì Uvicorn 커맨ë를 ì¡°ì í´ì FastAPI ê°ì²´ë¥¼ ë¶ë¬ì¤ëë° `app.main` ëì ì ìë¡ì´ 모ë `main`ì ì¬ì©íëë¡ í©ëë¤.
+
+## ë°°í¬ ê°ë
+
+ì´ì 컨í
ì´ëì 측면ìì [ë°°í¬ ê°ë
](./concepts.md){.internal-link target=_blank}ìì ë¤ë£¨ìë ê²ê³¼ ê°ì ë°°í¬ ê°ë
ì ëí´ ì´ì¼ê¸°í´ ë³´ê² ìµëë¤.
+
+컨í
ì´ëë ì£¼ë¡ ì´í리ì¼ì´ì
ì ë¹ëíê³ ë°°í¬í기 ìí ê³¼ì ì ë¨ìííë ë구ì´ì§ë§, **ë°°í¬ ê°ë
**ì ëí í¹ì í ì ê·¼ë²ì ê°ìíì§ ì기 ë문ì ê°ë¥í ë°°í¬ ì ëµìë ì¬ë¬ê°ì§ê° ììµëë¤.
+
+**ì¢ì ìì**ì ìë¡ ë¤ë¥¸ ì ëµë¤ì í¬ê´íë ë°°í¬ ê°ë
ì´ ìë¤ë ì ì
ëë¤. ð
+
+컨í
ì´ë 측면ìì **ë°°í¬ ê°ë
**ì ë¦¬ë·°í´ ë³´ê² ìµëë¤:
+
+* HTTPS
+* 구ëí기
+* ì¬ìì
+* ë³µì (ì¤í ì¤ì¸ íë¡ì¸ì¤ ê°ì)
+* ë©ëª¨ë¦¬
+* ììí기 ì ë¨ê³ë¤
+
+## HTTPS
+
+ë§ì½ ì°ë¦¬ê° FastAPI ì´í리ì¼ì´ì
ì ìí **컨í
ì´ë ì´ë¯¸ì§**ìë§ ì§ì¤íë¤ë©´ (ê·¸ë¦¬ê³ ëì¤ì ì¤íë **컨í
ì´ë**ì), HTTPSë ì¼ë°ì ì¼ë¡ ë¤ë¥¸ ë구ì ìí´ **ì¸ë¶ì ì¼ë¡** ë¤ë£¨ì´ì§ ê² ì
ëë¤.
+
+**HTTPS**ì **ì¸ì¦ì**ì **ìë** ì·¨ëì ë¤ë£¨ë ê²ì ë¤ë¥¸ 컨í
ì´ëê° ë ì ìëë°, ì를 ë¤ì´ Traefikì ì¬ì©íë ê²ì
ëë¤.
+
+!!! í
+ Traefikì ë커, ì¿ ë²ë¤í°ì¤, ê·¸ë¦¬ê³ ë¤ë¥¸ ë구ì íµí©ëì´ ìì´ ì¬ë¬ë¶ì 컨í
ì´ë를 í¬í¨íë HTTPS를 ì
ì
íê³ ì¤ì íë ê²ì´ ë§¤ì° ì½ìµëë¤.
+
+ëìì ì¼ë¡, HTTPSë í´ë¼ì°ë ì ê³µìì ìí´ ìë¹ì¤ì ì¼íì¼ë¡ ë¤ë£¨ì´ì§ ìë ììµëë¤ (ì´ëë ì´í리ì¼ì´ì
ì ì¬ì í 컨í
ì´ëìì ì¤íë ê²ì
ëë¤).
+
+## 구ëê³¼ ì¬ìì
+
+ì¬ë¬ë¶ì 컨í
ì´ë를 **ììíê³ ì¤ííë** ë°ì ì¼ë°ì ì¼ë¡ ì¬ì©ëë ë구ë ë°ë¡ ììµëë¤.
+
+ì´ë **ë커** ìì²´ì¼ ìë ìê³ , **ë커 ì»´í¬ì¦**, **ì¿ ë²ë¤í°ì¤**, **í´ë¼ì°ë ìë¹ì¤** ë±ì´ ë ì ììµëë¤.
+
+ëë¶ë¶ (ëë ì ì²´) ê²½ì°ì, 컨í
ì´ë를 구ëíê±°ë ê³ ì¥ìì ì¬ììíëë¡ íë ê°ë¨í ìµì
ì´ ììµëë¤. ì를 ë¤ì´, ë커ììë, 커맨ë ë¼ì¸ ìµì
`--restart` ì
ëë¤.
+
+컨í
ì´ë를 ì¬ì©íì§ ìê³ ìë, ì´í리ì¼ì´ì
ì 구ëíê³ ì¬ììíë ê²ì´ ë§¤ì° ë²ê±°ë¡ê³ ì´ë ¤ì¸ ì ììµëë¤. íì§ë§ **컨í
ì´ë를 ì¬ì©íë¤ë©´** ëë¶ë¶ì ê²½ì°ì ì´ë° 기ë¥ì 기본ì ì¼ë¡ í¬í¨ëì´ ììµëë¤. â¨
+
+## ë³µì - íë¡ì¸ì¤ ê°ì
+
+ë§ì½ ì¬ë¬ë¶ì´ **ì¿ ë²ë¤í°ì¤**ì 머ì í´ë¬ì¤í°, ë커 ì¤ì 모ë, ë
¸ë§ë, ëë ë¤ë¥¸ ì¬ë¬ 머ì ìì ë¶ì° 컨í
ì´ë를 ê´ë¦¬íë ë³µì¡í ìì¤í
ì ë¤ë£¨ê³ ìë¤ë©´, ì¬ë¬ë¶ì ê° ì»¨í
ì´ëìì (ì커ì í¨ê» ì¬ì©íë Gunicorn ê°ì) **íë¡ì¸ì¤ 매ëì ** ëì **í´ë¬ì¤í° ë 벨**ìì **ë³µì 를 ë¤ë£¨**ê³ ì¶ì ê²ì
ëë¤.
+
+ì¿ ë²ë¤í°ì¤ì ê°ì ë¶ì° 컨í
ì´ë ê´ë¦¬ ìì¤í
ì¤ ì¼ë¶ë ì¼ë°ì ì¼ë¡ ë¤ì´ì¤ë ìì²ì ëí **ë¡ë ë°¸ë°ì±**ì ì§ìíë©´ì **컨í
ì´ë ë³µì **를 ë¤ë£¨ë íµí©ë ë°©ë²ì ê°ì§ê³ ììµëë¤. 모ë **í´ë¬ì¤í° ë 벨**ìì ë§ì´ì£ .
+
+ì´ë° ê²½ì°ì, ì¬ë¬ë¶ì [ììì ë¬ì¬ë ê²](#dockerfile)ì²ë¼ **ì²ìë¶í° ë커 ì´ë¯¸ì§ë¥¼** ë¹ëí´ì, ìì¡´ì±ì ì¤ì¹íê³ , Uvicorn ì커를 ê´ë¦¬íë Gunicorn ëì **ë¨ì¼ Uvicorn íë¡ì¸ì¤**를 ì¤ííê³ ì¶ì ê²ì
ëë¤.
+
+### ë¡ë ë°¸ë°ì
+
+컨í
ì´ëë¡ ìì
í ë, ì¬ë¬ë¶ì ì¼ë°ì ì¼ë¡ **ë©ì¸ í¬í¸ì ìí©ì ê°ì§íë** ìì를 ê°ì§ê³ ìì ê²ì
ëë¤. ì´ë **HTTPS**를 ë¤ë£¨ë **TLS ì¢
ë£ íë¡ì**ì ê°ì ë¤ë¥¸ 컨í
ì´ëì¼ ìë ìê³ , ì ì¬í ë¤ë¥¸ ëêµ¬ì¼ ìë ììµëë¤.
+
+ì´ ììê° ìì²ë¤ì **ë¡ë**를 ì½ì´ë¤ì´ê³ ê° ì커ìê² (ë°ë¼ê±´ë) **ê· íì ì¼ë¡** ë¶ë°°íë¤ë©´, ì´ ììë ì¼ë°ì ì¼ë¡ **ë¡ë ë°¸ë°ì**ë¼ê³ ë¶ë¦½ëë¤.
+
+!!! í
+ HTTPS를 ìí´ ì¬ì©ë **TLS ì¢
ë£ íë¡ì** ìì ëí **ë¡ë ë°¸ë°ì**ê° ë ì ììµëë¤.
+
+ëí 컨í
ì´ëë¡ ìì
í ë, 컨í
ì´ë를 ììíê³ ê´ë¦¬í기 ìí´ ì¬ì©í ê²ê³¼ ëì¼í ìì¤í
ì ì´ë¯¸ í´ë¹ **ë¡ë ë°¸ë°ì**ë¡ ë¶í° ì¬ë¬ë¶ì ì±ì í´ë¹íë 컨í
ì´ëë¡ **ë¤í¸ìí¬ íµì **(ì를 ë¤ì´, HTTP ìì²)ì ì ì¡íë ë´ë¶ì ì¸ ë구를 ê°ì§ê³ ìì ê²ì
ëë¤ (ì¬ê¸°ìë ë¡ë ë°¸ë°ìë **TLS ì¢
ë£ íë¡ì**ì¼ ì ììµëë¤).
+
+### íëì ë¡ë ë°¸ë°ì - ë¤ì¤ ì커 컨í
ì´ë
+
+**ì¿ ë²ë¤í°ì¤**ë ëë ë¤ë¥¸ ë¶ì° 컨í
ì´ë ê´ë¦¬ ìì¤í
ì¼ë¡ ìì
í ë, ìì¤í
ë´ë¶ì ë¤í¸ìí¹ ë©ì»¤ëì¦ì ì´ì©í¨ì¼ë¡ì¨ ë©ì¸ **í¬í¸**를 ê°ì§íê³ ìë ë¨ì¼ **ë¡ë ë°¸ë°ì**ë ì¬ë¬ë¶ì ì±ìì ì¤íëê³ ìë **ì¬ë¬ê°ì 컨í
ì´ë**ì íµì (ìì²ë¤)ì ì ì¡í ì ìê² ë©ëë¤.
+
+ì¬ë¬ë¶ì ì±ìì ì¤íëê³ ìë ê°ê°ì 컨í
ì´ëë ì¼ë°ì ì¼ë¡ **íëì íë¡ì¸ì¤**ë§ ê°ì§ ê²ì
ëë¤ (ì를 ë¤ì´, FastAPI ì´í리ì¼ì´ì
ìì ì¤íëë íëì Uvicorn íë¡ì¸ì¤ì²ë¼). ì´ ì»¨í
ì´ëë¤ì 모ë ê°ì ê²ì ì¤ííë ì ìì **ëì¼í 컨í
ì´ë**ì´ì§ë§, íë¡ì¸ì¤, ë©ëª¨ë¦¬ ë±ì ê³µì íì§ ììµëë¤. ì´ ë°©ìì¼ë¡ ì¬ë¬ë¶ì CPUì **ìë¡ ë¤ë¥¸ ì½ì´ë¤** ëë **ìë¡ ë¤ë¥¸ 머ì ë¤**ì **ë³ë ¬í**íë ì´ì ì ì»ì ì ììµëë¤.
+
+ëí **ë¡ë ë°¸ë°ì**ê° ìë ë¶ì° 컨í
ì´ë ìì¤í
ì ì¬ë¬ë¶ì ì±ì ìë 컨í
ì´ë ê°ê°ì **ì°¨ë¡ëë¡ ìì²ì ë¶ì°**ìí¬ ê² ì
ëë¤. ë°ë¼ì ê° ìì²ì ì¬ë¬ë¶ì ì±ìì ì¤íëë ì¬ë¬ê°ì **ë³µì ë 컨í
ì´ëë¤** ì¤ íëì ìí´ ë¤ë£¨ì´ì§ ê² ì
ëë¤.
+
+ê·¸ë¦¬ê³ ì¼ë°ì ì¼ë¡ **ë¡ë ë°¸ë°ì**ë ì¬ë¬ë¶ì í´ë¬ì¤í°ì ìë *ë¤ë¥¸* ì±ì¼ë¡ ê°ë ìì²ë¤ë ë¤ë£° ì ìì¼ë©° (ì를 ë¤ì´, ë¤ë¥¸ ëë©ì¸ì¼ë¡ ê°ê±°ë ë¤ë¥¸ URL ê²½ë¡ ì ëì¬ë¥¼ ê°ì§ë ê²½ì°), ì´ íµì ë¤ì í´ë¬ì¤í°ì ìë *ë°ë¡ ê·¸ ë¤ë¥¸* ì´í리ì¼ì´ì
ì¼ë¡ ì ëë¡ ì ì¡í ì ììµëë¤.
+
+### ë¨ì¼ íë¡ì¸ì¤ë¥¼ ê°ì§ë 컨í
ì´ë
+
+ì´ ìë리ì¤ì ê²½ì°, ì¬ë¬ë¶ì ì´ë¯¸ í´ë¬ì¤í° ë 벨ìì ë³µì 를 ë¤ë£¨ê³ ìì ê²ì´ë¯ë¡ **컨í
ì´ë ë¹ ë¨ì¼ (Uvicorn) íë¡ì¸ì¤**를 ê°ì§ê³ ì í ê²ì
ëë¤.
+
+ë°ë¼ì, ì¬ë¬ë¶ì Gunicorn ì´ë Uvicorn ì커, ëë Uvicorn ì커를 ì¬ì©íë Uvicorn 매ëì ì ê°ì íë¡ì¸ì¤ 매ëì 를 ê°ì§ê³ ì¶ì´íì§ **ìì** ê²ì
ëë¤. ì¬ë¬ë¶ì 컨í
ì´ë ë¹ **ë¨ì¼ Uvicorn íë¡ì¸ì¤**를 ê°ì§ê³ ì¶ì´í ê²ì
ëë¤ (ê·¸ë¬ë ìë§ë ë¤ì¤ 컨í
ì´ë를 ê°ì§ ê²ì
ëë¤).
+
+ì´ë¯¸ ì¬ë¬ë¶ì´ í´ë¬ì¤í° ìì¤í
ì ê´ë¦¬íê³ ìì¼ë¯ë¡, (Uvicorn ì커를 ê´ë¦¬íë Gunicorn ì´ë Uvicorn ì²ë¼) 컨í
ì´ë ë´ì ë¤ë¥¸ íë¡ì¸ì¤ 매ëì 를 ê°ì§ë ê²ì **ë¶íìí ë³µì¡ì±**ë§ ëíê² ë ê²ì
ëë¤.
+
+### ë¤ì¤ íë¡ì¸ì¤ë¥¼ ê°ì§ë 컨í
ì´ëì í¹ìí ê²½ì°ë¤
+
+ë¹ì°í ë§ì´ì§ë§, ì¬ë¬ë¶ì´ ë´ë¶ì ì¼ë¡ **Uvicorn ì커 íë¡ì¸ì¤ë¤**를 ììíë **Gunicorn íë¡ì¸ì¤ 매ëì **를 ê°ì§ë ë¨ì¼ 컨í
ì´ë를 ìíë **í¹ìí ê²½ì°**ë ìì ê²ì
ëë¤.
+
+ê·¸ë° ê²½ì°ì, ì¬ë¬ë¶ë¤ì **Gunicorn**ì íë¡ì¸ì¤ 매ëì ë¡ í¬í¨íë **ê³µì ë커 ì´ë¯¸ì§**를 ì¬ì©í ì ììµëë¤. ì´ íë¡ì¸ì¤ 매ëì ë ë¤ì¤ **Uvicorn ì커 íë¡ì¸ì¤ë¤**ì ì¤ííë©°, ëí´í¸ ì¸í
ì¼ë¡ íì¬ CPU ì½ì´ì 기ë°íì¬ ìëì¼ë¡ ì커 ê°ì를 ì¡°ì í©ëë¤. ì´ ì¬íì ëí´ìë ìëì [Gunicornê³¼ í¨ê»íë ê³µì ë커 ì´ë¯¸ì§ - Uvicorn](#official-docker-image-with-gunicorn-uvicorn)ìì ë ë¤ë£¨ê² ìµëë¤.
+
+ì´ë° ê²½ì°ì í´ë¹íë ëªê°ì§ ììê° ììµëë¤:
+
+#### ë¨ìí ì±
+
+ë§ì½ ì¬ë¬ë¶ì ì´í리ì¼ì´ì
ì´ **ì¶©ë¶í ë¨ì**í´ì (ì ì´ë ìì§ì) íë¡ì¸ì¤ ê°ì를 íì¸-í í íìê° ìê±°ë í´ë¬ì¤í°ê° ìë **ë¨ì¼ ìë²**ìì ì¤ííê³ ìë¤ë©´, ì¬ë¬ë¶ì 컨í
ì´ë ë´ì íë¡ì¸ì¤ 매ëì 를 ì¬ì©íê±°ë (ê³µì ë커 ì´ë¯¸ì§ìì) ìëì¼ë¡ ì¤ì ëë ëí´í¸ ê°ì ì¬ì©í ì ììµëë¤.
+
+#### ë커 구ì±
+
+ì¬ë¬ë¶ì **ë커 ì»´í¬ì¦**ë¡ (í´ë¬ì¤í°ê° ìë) **ë¨ì¼ ìë²ë¡** ë°°í¬í ì ìì¼ë©°, ì´ ê²½ì°ì ê³µì ë ë¤í¸ìí¬ì **ë¡ë ë°¸ë°ì±**ì í¬í¨íë (ë커 ì»´í¬ì¦ë¡) 컨í
ì´ëì ë³µì 를 ê´ë¦¬íë ë¨ìí ë°©ë²ì´ ìì ìë ììµëë¤.
+
+ê·¸ë ë¤ë©´ ì¬ë¬ë¶ì **íë¡ì¸ì¤ 매ëì **ì í¨ê» ë´ë¶ì **ëªê°ì ì커 íë¡ì¸ì¤ë¤**ì ììíë **ë¨ì¼ 컨í
ì´ë**를 íìë¡ í ì ììµëë¤.
+
+#### Prometheusì ë¤ë¥¸ ì´ì ë¤
+
+ì¬ë¬ë¶ì **ë¨ì¼ íë¡ì¸ì¤**를 ê°ì§ë **ë¤ì¤ 컨í
ì´ë** ëì **ë¤ì¤ íë¡ì¸ì¤**를 ê°ì§ë **ë¨ì¼ 컨í
ì´ë**를 ì±ííë **ë¤ë¥¸ ì´ì **ê° ìì ì ììµëë¤.
+
+ì를 ë¤ì´ (ì¬ë¬ë¶ì ì¥ì¹ ì¤ì ì ë°ë¼) Prometheus ìµì¤í¬í°ì ê°ì´ ê°ì 컨í
ì´ëì ë¤ì´ì¤ë **ê° ìì²ì ëí´** ì ê·¼ê¶íì ê°ì§ë ë구를 ì¬ì©í ì ììµëë¤.
+
+ì´ ê²½ì°ì ì¬ë¬ë¶ì´ **ì¬ë¬ê°ì 컨í
ì´ëë¤**ì ê°ì§ê³ ìë¤ë©´, Prometheusê° **ë©í¸ë¦ì ì½ì´ ë¤ì¼ ë**, ëí´í¸ë¡ **ë§¤ë² íëì 컨í
ì´ë**(í¹ì 리íì¤í¸ë¥¼ ê´ë¦¬íë ë°ë¡ ê·¸ 컨í
ì´ë)ë¡ ë¶í° ì½ì´ë¤ì¼ ê²ì
ëë¤. ì´ë 모ë ë³µì ë 컨í
ì´ëì ëí´ **ì¶ì ë ë©í¸ë¦ë¤**ì ì½ì´ë¤ì´ë ê²ê³¼ ëë¹ë©ëë¤.
+
+ê·¸ë ë¤ë©´ ì´ ê²½ì°ìë **ë¤ì¤ íë¡ì¸ì¤**를 ê°ì§ë **íëì 컨í
ì´ë**를 ëì´ì ê°ì 컨í
ì´ëìì 모ë ë´ë¶ íë¡ì¸ì¤ì ëí Prometheus ë©í¸ë¦ì ìì§íë ë¡ì»¬ ë구(ì를 ë¤ì´ Prometheus ìµì¤í¬í° ê°ì)를 ëì´ì ì´ ë©ê·¸ë¦ë¤ì íëì 컨í
ì´ëì ë´ìì ê³µì íë ë°©ë²ì´ ë ë¨ìí ê²ì
ëë¤.
+
+---
+
+ìì ì, ì´ ì¤ì **ì´ëê²ë** ì¬ë¬ë¶ë¤ì´ ë°ëì ë°ë¼ì¼íë **íì ë ì¬ì¤**ì´ ìëë¼ë ê²ì
ëë¤. ì¬ë¬ë¶ì ì´ ìì´ëì´ë¤ì **ì¬ë¬ë¶ì ê³ ì í ì´ì© ì¬ë¡ë¥¼ íê°**íëë° ì¬ì©íê³ , ì¬ë¬ë¶ì ìì¤í
ì ê°ì¥ ì í©í ì ê·¼ë²ì´ ì´ë¤ ê²ì¸ì§ ê²°ì íë©°, ë¤ìì ê°ë
ë¤ì ê´ë¦¬íë ë°©ë²ì íì¸í ì ììµëë¤:
+
+* ë³´ì - HTTPS
+* 구ëí기
+* ì¬ìì
+* ë³µì (ì¤í ì¤ì¸ íë¡ì¸ì¤ ê°ì)
+* ë©ëª¨ë¦¬
+* ììí기 ì ë¨ê³ë¤
+
+## ë©ëª¨ë¦¬
+
+ë§ì½ ì¬ë¬ë¶ì´ **컨í
ì´ë ë¹ ë¨ì¼ íë¡ì¸ì¤**를 ì¤ííë¤ë©´, ì¬ë¬ë¶ì ê° ì»¨í
ì´ë(ë³µì ë ê²½ì°ìë ì¬ë¬ê°ì 컨í
ì´ëë¤)ì ëí´ ì ì ìëê³ , ìì ì ì´ë©°, ì íë ì©ëì ë©ëª¨ë¦¬ ìë¹ëì ê°ì§ê³ ìì ê²ì
ëë¤.
+
+ê·¸ë¬ë©´ ì¬ë¬ë¶ì 컨í
ì´ë ê´ë¦¬ ìì¤í
(ì를 ë¤ì´ **ì¿ ë²ë¤í°ì¤**) ì¤ì ìì ìì ì ìë ê²ê³¼ ê°ì ë©ëª¨ë¦¬ ì íê³¼ ì구ì¬íì ì¤ì í ì ììµëë¤. ì´ë° ë°©ë²ì¼ë¡ **ê°ì© 머ì **ì´ íìë¡íë ë©ëª¨ë¦¬ì í´ë¬ì¤í°ì ìë ê°ì© 머ì ë¤ì ì¼ëì ëê³ **컨í
ì´ë를 ë³µì **í ì ììµëë¤.
+
+ë§ì½ ì¬ë¬ë¶ì ì´í리ì¼ì´ì
ì´ **ë¨ì**íë¤ë©´, ì´ê²ì **문ì ê° ëì§ ìì** ê²ì´ê³ , ê³ ì ë ë©ëª¨ë¦¬ ì íì 구체íí íìë ìì ê²ì
ëë¤. íì§ë§ ì¬ë¬ë¶ì ì´í리ì¼ì´ì
ì´ (ì를 ë¤ì´ **머ì ë¬ë** 모ë¸ê°ì´) **ë§ì ë©ëª¨ë¦¬ë¥¼ ììíë¤ë©´**, ì´í리ì¼ì´ì
ì´ ì¼ë§ë ë§ì ìì ë©ëª¨ë¦¬ë¥¼ ì¬ì©íëì§ íì¸íê³ **ê° ë¨¸ì ìì** ì¬ì©íë **컨í
ì´ëì ì**를 ì¡°ì í íìê° ììµëë¤ (ê·¸ë¦¬ê³ íìì ë°ë¼ ì¬ë¬ë¶ì í´ë¬ì¤í°ì 머ì ì ì¶ê°í ì ììµëë¤).
+
+ë§ì½ ì¬ë¬ë¶ì´ **컨í
ì´ë ë¹ ì¬ë¬ê°ì íë¡ì¸ì¤**를 ì¤ííë¤ë©´ (ì를 ë¤ì´ ê³µì ë커 ì´ë¯¸ì§ ì²ë¼), ì¬ë¬ë¶ì ììë íë¡ì¸ì¤ ê°ìê° ê°ì©í ê² ë³´ë¤ **ë ë§ì ë©ëª¨ë¦¬ë¥¼ ìë¹**íì§ ìëì§ íì¸í´ì¼ í©ëë¤.
+
+## ììí기 ì ë¨ê³ë¤ê³¼ 컨í
ì´ë
+
+ë§ì½ ì¬ë¬ë¶ì´ 컨í
ì´ë(ì를 ë¤ì´ ë커, ì¿ ë²ë¤í°ì¤)를 ì¬ì©íë¤ë©´, ì¬ë¬ë¶ì´ ì ê·¼í ì ìë 주ì ë°©ë²ì í¬ê² ëê°ì§ê° ììµëë¤.
+
+### ë¤ì¤ 컨í
ì´ë
+
+ë§ì½ ì¬ë¬ë¶ì´ **ì¬ë¬ê°ì 컨í
ì´ë**를 ê°ì§ê³ ìë¤ë©´, ìë§ë ê°ê°ì 컨í
ì´ëë **íëì íë¡ì¸ì¤**를 ê°ì§ê³ ìì ê²ì
ëë¤(ì를 ë¤ì´, **ì¿ ë²ë¤í°ì¤** í´ë¬ì¤í°ìì). ê·¸ë¬ë©´ ì¬ë¬ë¶ì ë³µì ë ì커 컨í
ì´ë를 ì¤íí기 **ì´ì ì**, íëì 컨í
ì´ëì ìë **ì´ì ì ë¨ê³ë¤ì** ìííë ë¨ì¼ íë¡ì¸ì¤ë¥¼ ê°ì§ë **ë³ëì 컨í
ì´ëë¤**ì ê°ì§ê³ ì¶ì ê²ì
ëë¤.
+
+!!! ì ë³´
+ ë§ì½ ì¬ë¬ë¶ì´ ì¿ ë²ë¤í°ì¤ë¥¼ ì¬ì©íê³ ìë¤ë©´, ìë§ë ì´ë Init Containerì¼ ê²ì
ëë¤.
+
+ë§ì½ ì¬ë¬ë¶ì ì´ì© ì¬ë¡ìì ì´ì ë¨ê³ë¤ì **ë³ë ¬ì ì¼ë¡ ì¬ë¬ë²** ìííëë°ì 문ì ê° ìë¤ë©´ (ì를 ë¤ì´ ë°ì´í°ë² ì´ì¤ ì´ì ì ì¤ííì§ ìê³ ë°ì´í°ë² ì´ì¤ê° ì¤ë¹ëìëì§ íì¸ë§ íë ê²½ì°), ë©ì¸ íë¡ì¸ì¤ë¥¼ ììí기 ì ì ì´ ë¨ê³ë¤ì ê° ì»¨í
ì´ëì ë£ì ì ììµëë¤.
+
+### ë¨ì¼ 컨í
ì´ë
+
+ë§ì½ ì¬ë¬ë¶ì ì
ì
ì´ **ë¤ì¤ íë¡ì¸ì¤**(ëë íëì íë¡ì¸ì¤)를 ììíë **íëì 컨í
ì´ë**를 ê°ì§ë ë¨ìí ì
ì
ì´ë¼ë©´, ì¬ì ë¨ê³ë¤ì ì±ì í¬í¨íë íë¡ì¸ì¤ë¥¼ ììí기 ì§ì ì ê°ì 컨í
ì´ëìì ì¤íí ì ììµëë¤. ê³µì ë커 ì´ë¯¸ì§ë ì´ë¥¼ ë´ë¶ì ì¼ë¡ ì§ìí©ëë¤.
+
+## Gunicornê³¼ í¨ê»íë ê³µì ë커 ì´ë¯¸ì§ - Uvicorn
+
+ì ì±í°ìì ìì¸íê² ì¤ëª
ë ê² ì²ë¼, Uvicorn ì커ì ê°ì´ ì¤íëë Gunicornì í¬í¨íë ê³µì ë커 ì´ë¯¸ì§ê° ììµëë¤: [ìë² ì커 - Uvicornê³¼ í¨ê»íë Gunicorn](./server-workers.md){.internal-link target=_blank}.
+
+ì´ ì´ë¯¸ì§ë ì£¼ë¡ ììì ì¤ëª
ë ìí©ìì ì ì©í ê²ì
ëë¤: [ë¤ì¤ íë¡ì¸ì¤ë¥¼ ê°ì§ë 컨í
ì´ëì í¹ìí ê²½ì°ë¤](#containers-with-multiple-processes-and-special-cases).
+
+* tiangolo/uvicorn-gunicorn-fastapi.
+
+!!! ê²½ê³
+ ì¬ë¬ë¶ì´ ì´ ë² ì´ì¤ ì´ë¯¸ì§ ëë ë¤ë¥¸ ì ì¬í ì´ë¯¸ì§ë¥¼ íìë¡ íì§ **ìì** ëì ê°ë¥ì±ì´ ìì¼ë©°, [ììì ì¤ëª
ë ê²ì²ë¼: FastAPI를 ìí ë커 ì´ë¯¸ì§ ë¹ëí기](#build-a-docker-image-for-fastapi) ì²ìë¶í° ì´ë¯¸ì§ë¥¼ ë¹ëíë ê²ì´ ë ëì ì ììµëë¤.
+
+ì´ ì´ë¯¸ì§ë ê°ë¥í CPU ì½ì´ì 기ë°í **ëªê°ì ì커 íë¡ì¸ì¤**를 ì¤ì íë **ìë-íë** ë©ì»¤ëì¦ì í¬í¨íê³ ììµëë¤.
+
+ì´ ì´ë¯¸ì§ë **민ê°í ëí´í¸** ê°ì ê°ì§ê³ ìì§ë§, ì¬ë¬ë¶ë¤ì ì¬ì í **íê²½ ë³ì** ëë ì¤ì íì¼ì íµí´ ì¤ì ê°ì ìì íê³ ì
ë°ì´í¸ í ì ììµëë¤.
+
+ëí ì¤í¬ë¦½í¸ë¥¼ íµí´ **ììí기 ì ì¬ì ë¨ê³**를 ì¤ííë ê²ì ì§ìí©ëë¤.
+
+!!! í
+ 모ë ì¤ì ê³¼ ìµì
ì ë³´ë ¤ë©´, ë커 ì´ë¯¸ì§ íì´ì§ë¡ ì´ëí©ëë¤: tiangolo/uvicorn-gunicorn-fastapi.
+
+### ê³µì ë커 ì´ë¯¸ì§ì ìë íë¡ì¸ì¤ ê°ì
+
+ì´ ì´ë¯¸ì§ì ìë **íë¡ì¸ì¤ ê°ì**ë ê°ì©í CPU **ì½ì´ë¤**ë¡ ë¶í° **ìëì¼ë¡ ê³ì°**ë©ëë¤.
+
+ì´ê²ì´ ì미íë ë°ë ì´ë¯¸ì§ê° CPUë¡ë¶í° **ìµëíì ì±ë¥**ì **ì¥ì´ì§ë¸ë¤**ë ê²ì
ëë¤.
+
+ì¬ë¬ë¶ì ì´ ì¤ì ê°ì **íê²½ ë³ì**ë 기í ë°©ë²ë¤ë¡ ì¡°ì í ì ììµëë¤.
+
+ê·¸ë¬ë íë¡ì¸ì¤ì ê°ìê° ì»¨í
ì´ëê° ì¤íëê³ ìë CPUì ìì¡´íë¤ë ê²ì ëí **ììëë ë©ëª¨ë¦¬ì í¬ê¸°** ëí ì´ì ìì¡´íë¤ë ê²ì ì미í©ëë¤.
+
+ê·¸ë 기 ë문ì, ë§ì½ ì¬ë¬ë¶ì ì´í리ì¼ì´ì
ì´ ë§ì ë©ëª¨ë¦¬ë¥¼ ì구íê³ (ì를 ë¤ì´ 머ì ë¬ë 모ë¸ì²ë¼), ì¬ë¬ë¶ì ìë²ê° CPU ì½ì´ ìë ë§ì§ë§ **ì ì ë©ëª¨ë¦¬**를 ê°ì§ê³ ìë¤ë©´, ì¬ë¬ë¶ì 컨í
ì´ëë ê°ì©í ë©ëª¨ë¦¬ë³´ë¤ ë§ì ë©ëª¨ë¦¬ë¥¼ ì¬ì©íë ¤ê³ ìëí ì ìì¼ë©°, ê²°êµ í¼í¬ë¨¼ì¤ë¥¼ í¬ê² ë¨ì´ë¨ë¦´ ì ììµëë¤(ì¬ì§ì´ ê³ ì¥ì´ ë ìë ììµëë¤). ð¨
+
+### `Dockerfile` ìì±í기
+
+ì´ ì´ë¯¸ì§ì 기ë°í´ `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
+```
+
+### ë í° ì´í리ì¼ì´ì
+
+ë§ì½ ì¬ë¬ë¶ì´ [ë¤ì¤ íì¼ì ê°ì§ë ë í° ì´í리ì¼ì´ì
](../tutorial/bigger-applications.md){.internal-link target=_blank}ì ìì±íë ì¹ì
ì ë°ëë¤ë©´, ì¬ë¬ë¶ì `Dockerfile`ì ëì ì´ë ê² ìê²¼ì ê²ì
ëë¤:
+
+```Dockerfile hl_lines="7"
+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
+```
+
+### ì¸ì ì¬ì©í ê¹
+
+ì¬ë¬ë¶ë¤ì´ **ì¿ ë²ë¤í°ì¤**(ëë ì ì¬í ë¤ë¥¸ ë구) ì¬ì©íê±°ë í´ë¬ì¤í° ë 벨ìì ë¤ì¤ 컨í
ì´ë를 ì´ì©í´ ì´ë¯¸ **ì¬ë³¸**ì ì¤ì íê³ ìë¤ë©´, ê³µì ë² ì´ì¤ ì´ë¯¸ì§(ëë ì ì¬í ë¤ë¥¸ ì´ë¯¸ì§)를 ì¬ì©íì§ **ìë** ê² ì¢ìµëë¤. ê·¸ë° ê²½ì°ì ì¬ë¬ë¶ì ë¤ìì ì¤ëª
ë ê² ì²ë¼ **ì²ìë¶í° ì´ë¯¸ì§ë¥¼ ë¹ëíë ê²**ì´ ë ë«ìµëë¤: [FastAPI를 ìí ë커 ì´ë¯¸ì§ ë¹ëí기](#build-a-docker-image-for-fastapi).
+
+ì´ ì´ë¯¸ì§ë ìì [ë¤ì¤ íë¡ì¸ì¤ë¥¼ ê°ì§ë 컨í
ì´ëì í¹ìí ê²½ì°ë¤](#containers-with-multiple-processes-and-special-cases)ìì ì¤ëª
ë í¹ìí ê²½ì°ì ëí´ìë§ ì£¼ë¡ ì ì©í ê²ì
ëë¤. ì를 ë¤ì´, ë§ì½ ì¬ë¬ë¶ì ì´í리ì¼ì´ì
ì´ **ì¶©ë¶í ë¨ì**í´ì CPUì 기ë°í ëí´í¸ íë¡ì¸ì¤ ê°ì를 ì¤ì íë ê²ì´ ì ìëíë¤ë©´, í´ë¬ì¤í° ë 벨ìì ìëì¼ë¡ ì¬ë³¸ì ì¤ì í íìê° ìì ê²ì´ê³ , ì¬ë¬ë¶ì ì±ìì íë ì´ìì 컨í
ì´ë를 ì¤ííì§ë ìì ê²ì
ëë¤. ëë ë§ì½ì ì¬ë¬ë¶ì´ **ë커 ì»´í¬ì¦**ë¡ ë°°í¬íê±°ë, ë¨ì¼ ìë²ìì ì¤ííê±°ë íë ê²½ì°ìë ë§ì°¬ê°ì§ì
ëë¤.
+
+## 컨í
ì´ë ì´ë¯¸ì§ ë°°í¬í기
+
+컨í
ì´ë (ë커) ì´ë¯¸ì§ë¥¼ ìì±í ë¤ì ì´ë¥¼ ë°°í¬íë ë°©ë²ìë ì¬ë¬ê°ì§ ë°©ë²ì´ ììµëë¤.
+
+ì를 ë¤ì´:
+
+* ë¨ì¼ ìë²ìì **ë커 ì»´í¬ì¦**ë¡ ë°°í¬í기
+* **ì¿ ë²ë¤í°ì¤** í´ë¬ì¤í°ë¡ ë°°í¬í기
+* ë커 ì¤ì 모ë í´ë¬ì¤í°ë¡ ë°°í¬í기
+* ë
¸ë§ë ê°ì ë¤ë¥¸ ëêµ¬ë¡ ë°°í¬í기
+* ì¬ë¬ë¶ì 컨í
ì´ë ì´ë¯¸ì§ë¥¼ ë°°í¬í´ì£¼ë í´ë¼ì°ë ìë¹ì¤ë¡ ë°°í¬í기
+
+## Poetryì ë커 ì´ë¯¸ì§
+
+ë§ì½ ì¬ë¬ë¶ë¤ì´ íë¡ì í¸ ìì¡´ì±ì ê´ë¦¬í기 ìí´ Poetry를 ì¬ì©íë¤ë©´, ë커ì ë©í°-ì¤í
ì´ì§ ë¹ë©ì ì¬ì©í ì ììµëë¤:
+
+```{ .dockerfile .annotate }
+# (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"]
+```
+
+1. 첫 ì¤í
ì´ì§ë¡, `requirements-stage`ë¼ê³ ì´ë¦ ë¶ììµëë¤.
+
+2. `/tmp`를 íì¬ì ìí¹ ëë í°ë¦¬ë¡ ì¤ì í©ëë¤.
+
+ ì´ ìì¹ì ì°ë¦¬ë `requirements.txt` íì¼ì ìì±í ê²ì
ëë¤.
+
+3. ì´ ë커 ì¤í
ì´ì§ìì Poetry를 ì¤ì¹í©ëë¤.
+
+4. íì¼ `pyproject.toml`ì `poetry.lock`를 `/tmp` ëë í°ë¦¬ë¡ ë³µì¬í©ëë¤.
+
+ `./poetry.lock*` (`*`ë¡ ëëë) íì¼ì ì¬ì©í기 ë문ì, íì¼ì´ ìì§ ì¬ì©ê°ë¥íì§ ìëë¼ë ê³ ì¥ëì§ ìì ê²ì
ëë¤.
+
+5. `requirements.txt` íì¼ì ìì±í©ëë¤.
+
+6. ì´ê²ì´ ë§ì§ë§ ì¤í
ì´ì§ë¡, ì¬ê¸°ì ìì¹í 모ë ê²ì´ ë§ì§ë§ 컨í
ì´ë ì´ë¯¸ì§ì í¬í¨ë ê²ì
ëë¤.
+
+7. íì¬ì ìí¹ ëë í°ë¦¬ë¥¼ `/code`ë¡ ì¤ì í©ëë¤.
+
+8. íì¼ `requirements.txt`를 `/code` ëë í°ë¦¬ë¡ ë³µì¬í©ëë¤.
+
+ ì´ íì¼ì ì¤ì§ ì´ì ì ë커 ì¤í
ì´ì§ìë§ ì¡´ì¬íë©°, ë문ì ë³µì¬í기 ìí´ì `--from-requirements-stage` ìµì
ì´ íìí©ëë¤.
+
+9. ìì±ë `requirements.txt` íì¼ì í¨í¤ì§ ìì¡´ì±ì ì¤ì¹í©ëë¤.
+
+10. `app` ëë í°ë¦¬ë¥¼ `/code` ëë í°ë¦¬ë¡ ë³µì¬í©ëë¤.
+
+11. `uvicorn` 커맨ë를 ì¤ííì¬, `app.main`ìì ë¶ë¬ì¨ `app` ê°ì²´ë¥¼ ì¬ì©íëë¡ í©ëë¤.
+
+!!! í
+ ë²ë¸ ì«ì를 í´ë¦í´ ê° ì¤ì´ íë ì¼ì ììë³¼ ì ììµëë¤.
+
+**ë커 ì¤í
ì´ì§**ë `Dockefile`ì ì¼ë¶ë¡ì ëì¤ì ì¬ì©í기 ìí íì¼ë¤ì ìì±í기 ìí **ì¼ìì ì¸ ì»¨í
ì´ë ì´ë¯¸ì§**ë¡ ìëí©ëë¤.
+
+첫 ì¤í
ì´ì§ë ì¤ì§ **Poetry를 ì¤ì¹**íê³ Poetryì `pyproject.toml` íì¼ë¡ë¶í° íë¡ì í¸ ìì¡´ì±ì ìí **`requirements.txt`를 ìì±**í기 ìí´ ì¬ì©ë©ëë¤.
+
+ì´ `requirements.txt` íì¼ì **ë¤ì ì¤í
ì´ì§**ìì `pip`ë¡ ì¬ì©ë ê²ì
ëë¤.
+
+ë§ì§ë§ 컨í
ì´ë ì´ë¯¸ì§ìë **ì¤ì§ ë§ì§ë§ ì¤í
ì´ì§ë§** ë³´ì¡´ë©ëë¤. ì´ì ì¤í
ì´ì§(ë¤)ì ë²ë ¤ì§ëë¤.
+
+Poetry를 ì¬ì©í ë **ë커 ë©í°-ì¤í
ì´ì§ ë¹ë**를 ì¬ì©íë ê²ì´ ì¢ìë°, ì¬ë¬ë¶ë¤ì íë¡ì í¸ ìì¡´ì±ì ì¤ì¹í기 ìí´ ë§ì§ë§ 컨í
ì´ë ì´ë¯¸ì§ì **ì¤ì§** `requirements.txt` íì¼ë§ íìíì§, Poetryì ê·¸ ìì¡´ì±ì ìì íìê° ì기 ë문ì
ëë¤.
+
+ì´ ë¤ì (ëí ë§ì§ë§) ì¤í
ì´ì§ìì ì¬ë¬ë¶ë¤ì ì´ì ì ì¤ëª
ë ê²ê³¼ ë¹ì·í ë°©ìì¼ë¡ ë°©ìì¼ë¡ ì´ë¯¸ì§ë¥¼ ë¹ëí ì ììµëë¤.
+
+### TLS ì¢
ë£ íë¡ìì ë°°í - Poetry
+
+ì´ì ì ì¸ê¸í ê²ê³¼ ê°ì´, ë§ì½ ì¬ë¬ë¶ì´ 컨í
ì´ë를 Nginx ëë Traefikê³¼ ê°ì TLS ì¢
ë£ íë¡ì (ë¡ë ë°¸ë°ì) ë¤ìì ì¤ííê³ ìë¤ë©´, 커맨ëì `--proxy-headers` ìµì
ì ì¶ê°í©ëë¤:
+
+```Dockerfile
+CMD ["uvicorn", "app.main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "80"]
+```
+
+## ìì½
+
+컨í
ì´ë ìì¤í
(ì를 ë¤ì´ **ë커**ë **ì¿ ë²ë¤í°ì¤**)ì ì¬ì©íì¬ ëª¨ë **ë°°í¬ ê°ë
**ì ë¤ë£¨ë ê²ì 꽤 ê°ë¨í©ëë¤:
+
+* HTTPS
+* 구ëí기
+* ì¬ìì
+* ë³µì (ì¤í ì¤ì¸ íë¡ì¸ì¤ ê°ì)
+* ë©ëª¨ë¦¬
+* ììí기 ì ë¨ê³ë¤
+
+ëë¶ë¶ì ê²½ì°ìì ì¬ë¬ë¶ì ì´ë¤ ë² ì´ì¤ ì´ë¯¸ì§ë ì¬ì©íì§ ìê³ ê³µì íì´ì¬ ë커 ì´ë¯¸ì§ì 기ë°í´ **ì²ìë¶í° 컨í
ì´ë ì´ë¯¸ì§ë¥¼ ë¹ë**í ê²ì
ëë¤.
+
+`Dockerfile`ì ìë ì§ì ì¬íì **ììëë¡** ë¤ë£¨ê³ **ë커 ìºì**를 ì¬ì©íë ê²ì¼ë¡ ì¬ë¬ë¶ì **ë¹ë ìê°ì ìµìí**í ì ìì¼ë©°, ì´ë¡ì¨ ìì°ì±ì ìµëíí ì ììµëë¤ (ê·¸ë¦¬ê³ ì§ë£¨í¨ì í¼í ì ìì£ ) ð
+
+í¹ë³í ê²½ì°ìë, FastAPI를 ìí ê³µì ë커 ì´ë¯¸ì§ë¥¼ ì¬ì©í ìë ììµëë¤. ð¤