committed by
GitHub
1 changed files with 698 additions and 0 deletions
@ -0,0 +1,698 @@ |
|||
# ์ปจํ
์ด๋์ FastAPI - ๋์ปค |
|||
|
|||
FastAPI ์ดํ๋ฆฌ์ผ์ด์
์ ๋ฐฐํฌํ ๋ ์ผ๋ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ๋ฒ์ **๋ฆฌ๋
์ค ์ปจํ
์ด๋ ์ด๋ฏธ์ง**๋ฅผ ์์ฑํ๋ ๊ฒ์
๋๋ค. ์ด ๋ฐฉ๋ฒ์ ์ฃผ๋ก <a href="https://www.docker.com/" class="external-link" target="_blank">**๋์ปค**</a>๋ฅผ ์ฌ์ฉํด ์ด๋ฃจ์ด์ง๋๋ค. ๊ทธ๋ฐ ๋ค์ ํด๋น ์ปจํ
์ด๋ ์ด๋ฏธ์ง๋ฅผ ๋ช๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ๋ฐฐํฌํ ์ ์์ต๋๋ค. |
|||
|
|||
๋ฆฌ๋
์ค ์ปจํ
์ด๋๋ฅผ ์ฌ์ฉํ๋ ๋ฐ์๋ **๋ณด์**, **๋ฐ๋ณต ๊ฐ๋ฅ์ฑ**, **๋จ์ํจ** ๋ฑ์ ์ฅ์ ์ด ์์ต๋๋ค. |
|||
|
|||
!!! ํ |
|||
์๊ฐ์ ์ซ๊ธฐ๊ณ ์๊ณ ์ด๋ฏธ ์ด๋ฐ๊ฒ๋ค์ ์๊ณ ์๋ค๋ฉด [`Dockerfile`๐](#build-a-docker-image-for-fastapi)๋ก ์ ํํ ์ ์์ต๋๋ค. |
|||
|
|||
<details> |
|||
<summary>๋์ปคํ์ผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๐</summary> |
|||
|
|||
```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"] |
|||
``` |
|||
|
|||
</details> |
|||
|
|||
## ์ปจํ
์ด๋๋ |
|||
|
|||
์ปจํ
์ด๋(์ฃผ๋ก ๋ฆฌ๋
์ค ์ปจํ
์ด๋)๋ ์ดํ๋ฆฌ์ผ์ด์
์ ์์กด์ฑ๊ณผ ํ์ํ ํ์ผ๋ค์ ๋ชจ๋ ํจํค์งํ๋ ๋งค์ฐ **๊ฐ๋ฒผ์ด** ๋ฐฉ๋ฒ์
๋๋ค. ์ปจํ
์ด๋๋ ๊ฐ์ ์์คํ
์ ์๋ ๋ค๋ฅธ ์ปจํ
์ด๋(๋ค๋ฅธ ์ดํ๋ฆฌ์ผ์ด์
์ด๋ ์์๋ค)์ ๋
๋ฆฝ์ ์ผ๋ก ์ ์ง๋ฉ๋๋ค. |
|||
|
|||
๋ฆฌ๋
์ค ์ปจํ
์ด๋๋ ํธ์คํธ(๋จธ์ , ๊ฐ์ ๋จธ์ , ํด๋ผ์ฐ๋ ์๋ฒ ๋ฑ)์ ๊ฐ์ ๋ฆฌ๋
์ค ์ปค๋์ ์ฌ์ฉํด ์คํ๋ฉ๋๋ค. ์ด๋ง์ ๋ฆฌ๋
์ค ์ปจํ
์ด๋๊ฐ (์ ์ฒด ์ด์์ฒด์ ๋ฅผ ๋ชจ๋ฐฉํ๋ ๋ค๋ฅธ ๊ฐ์ ๋จธ์ ๊ณผ ๋น๊ตํ์ ๋) ๋งค์ฐ ๊ฐ๋ณ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. |
|||
|
|||
์ด ๋ฐฉ๋ฒ์ ํตํด, ์ปจํ
์ด๋๋ ์ง์ ํ๋ก์ธ์ค๋ฅผ ์คํํ๋ ๊ฒ๊ณผ ๋น์ทํ ์ ๋์ **์ ์ ์์**์ ์๋นํฉ๋๋ค (๊ฐ์ ๋จธ์ ์ ํจ์ฌ ๋ง์ ์์์ ์๋นํ ๊ฒ์
๋๋ค). |
|||
|
|||
์ปจํ
์ด๋๋ ๋ํ ๊ทธ๋ค๋ง์ **๋
๋ฆฝ๋** ์คํ ํ๋ก์ธ์ค (์ผ๋ฐ์ ์ผ๋ก ํ๋์ ํ๋ก์ธ์ค๋ก ์ถฉ๋ถํฉ๋๋ค), ํ์ผ ์์คํ
, ๊ทธ๋ฆฌ๊ณ ๋คํธ์ํฌ๋ฅผ ๊ฐ์ง๋ฏ๋ก ๋ฐฐํฌ, ๋ณด์, ๊ฐ๋ฐ ๋ฐ ๊ธฐํ ๊ณผ์ ์ ๋จ์ํ ํฉ๋๋ค. |
|||
|
|||
## ์ปจํ
์ด๋ ์ด๋ฏธ์ง๋ |
|||
|
|||
**์ปจํ
์ด๋**๋ **์ปจํ
์ด๋ ์ด๋ฏธ์ง**๋ฅผ ์คํํ ๊ฒ ์
๋๋ค. |
|||
|
|||
์ปจํ
์ด๋ ์ด๋ฏธ์ง๋ ์ปจํ
์ด๋์ ํ์ํ ๋ชจ๋ ํ์ผ, ํ๊ฒฝ ๋ณ์ ๊ทธ๋ฆฌ๊ณ ๋ํดํธ ๋ช
๋ น/ํ๋ก๊ทธ๋จ์ **์ ์ ** ๋ฒ์ ์
๋๋ค. ์ฌ๊ธฐ์ **์ ์ **์ด๋ ๋ง์ ์ปจํ
์ด๋ **์ด๋ฏธ์ง**๊ฐ ์๋๋๊ฑฐ๋ ์คํ๋์ง ์์ผ๋ฉฐ, ๋จ์ง ํจํค์ง ํ์ผ๊ณผ ๋ฉํ ๋ฐ์ดํฐ๋ผ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. |
|||
|
|||
์ ์ฅ๋ ์ ์ ์ปจํ
์ธ ์ธ **์ปจํ
์ด๋ ์ด๋ฏธ์ง**์ ๋์กฐ๋๊ฒ, **์ปจํ
์ด๋**๋ ๋ณดํต ์คํ๋ ์ ์๋ ์๋ ์ธ์คํด์ค๋ฅผ ์๋ฏธํฉ๋๋ค. |
|||
|
|||
**์ปจํ
์ด๋**๊ฐ (**์ปจํ
์ด๋ ์ด๋ฏธ์ง**๋ก ๋ถํฐ) ์์๋๊ณ ์คํ๋๋ฉด, ์ปจํ
์ด๋๋ ํ์ผ์ด๋ ํ๊ฒฝ ๋ณ์๋ฅผ ์์ฑํ๊ฑฐ๋ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ณํ๋ ์ค์ง ์ปจํ
์ด๋์์๋ง ์กด์ฌํ๋ฉฐ, ๊ทธ ๊ธฐ๋ฐ์ด ๋๋ ์ปจํ
์ด๋ ์ด๋ฏธ์ง์๋ ์ง์๋์ง ์์ต๋๋ค (์ฆ ๋์คํฌ์๋ ์ ์ฅ๋์ง ์์ต๋๋ค). |
|||
|
|||
์ปจํ
์ด๋ ์ด๋ฏธ์ง๋ **ํ๋ก๊ทธ๋จ** ํ์ผ๊ณผ ์ปจํ
์ธ , ์ฆ `python`๊ณผ ์ด๋ค ํ์ผ `main.py`์ ๋น๊ตํ ์ ์์ต๋๋ค. |
|||
|
|||
๊ทธ๋ฆฌ๊ณ (**์ปจํ
์ด๋ ์ด๋ฏธ์ง**์ ๋๋นํด์) **์ปจํ
์ด๋**๋ ์ด๋ฏธ์ง์ ์ค์ ์คํ ์ธ์คํด์ค๋ก **ํ๋ก์ธ์ค**์ ๋น๊ตํ ์ ์์ต๋๋ค. ์ฌ์ค, ์ปจํ
์ด๋๋ **ํ๋ก์ธ์ค ๋ฌ๋**์ด ์์ ๋๋ง ์คํ๋ฉ๋๋ค (๊ทธ๋ฆฌ๊ณ ๋ณดํต ํ๋์ ํ๋ก์ธ์ค ์
๋๋ค). ์ปจํ
์ด๋๋ ๋ด๋ถ์์ ์คํ๋๋ ํ๋ก์ธ์ค๊ฐ ์์ผ๋ฉด ์ข
๋ฃ๋ฉ๋๋ค. |
|||
|
|||
## ์ปจํ
์ด๋ ์ด๋ฏธ์ง |
|||
|
|||
๋์ปค๋ **์ปจํ
์ด๋ ์ด๋ฏธ์ง**์ **์ปจํ
์ด๋**๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋๋ฐ ์ฃผ์ ๋๊ตฌ ์ค ํ๋๊ฐ ๋์ด์์ต๋๋ค. |
|||
|
|||
๊ทธ๋ฆฌ๊ณ <a href="https://hub.docker.com/" class="external-link" target="_blank">๋์ปค ํ๋ธ</a>์ ๋ค์ํ ๋๊ตฌ, ํ๊ฒฝ, ๋ฐ์ดํฐ๋ฒ ์ด์ค, ๊ทธ๋ฆฌ๊ณ ์ดํ๋ฆฌ์ผ์ด์
์ ๋ํด ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ง **๊ณต์ ์ปจํ
์ด๋ ์ด๋ฏธ์ง**๊ฐ ๊ณต๊ฐ๋์ด ์์ต๋๋ค. |
|||
|
|||
์๋ฅผ ๋ค์ด, ๊ณต์ <a href="https://hub.docker.com/_/python" class="external-link" target="_blank">ํ์ด์ฌ ์ด๋ฏธ์ง</a>๊ฐ ์์ต๋๋ค. |
|||
|
|||
๋ํ ๋ค๋ฅธ ๋์, ์๋ฅผ ๋ค๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ํ ์ด๋ฏธ์ง๋ค๋ ์์ต๋๋ค: |
|||
|
|||
* <a href="https://hub.docker.com/_/postgres" class="external-link" target="_blank">PostgreSQL</a> |
|||
* <a href="https://hub.docker.com/_/mysql" class="external-link" target="_blank">MySQL</a> |
|||
* <a href="https://hub.docker.com/_/mongo" class="external-link" target="_blank">MongoDB</a> |
|||
* <a href="https://hub.docker.com/_/redis" class="external-link" target="_blank">Redis</a> ๋ฑ |
|||
|
|||
๋ฏธ๋ฆฌ ๋ง๋ค์ด์ง ์ปจํ
์ด๋ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ก ๋ค๋ฅธ ๋๊ตฌ๋ค์ **๊ฒฐํฉ**ํ๊ธฐ ์ฝ์ต๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์, **๊ณต์ ์ด๋ฏธ์ง๋ค**์ ์ฌ์ฉํ๊ณ ํ๊ฒฝ ๋ณ์๋ฅผ ํตํด ์ค์ ํ ์ ์์ต๋๋ค. |
|||
|
|||
์ด๋ฐ ๋ฐฉ๋ฒ์ผ๋ก ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์ ์ปจํ
์ด๋์ ๋์ปค์ ๋ํด ๋ฐฐ์ธ ์ ์์ผ๋ฉฐ ๋ค์ํ ๋๊ตฌ์ ์์๋ค์ ๋ํ ์ง์์ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค. |
|||
|
|||
๋ฐ๋ผ์, ์๋ก ๋ค๋ฅธ **๋ค์ค ์ปจํ
์ด๋**๋ฅผ ์์ฑํ ๋ค์ ์ด๋ค์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค, ํ์ด์ฌ ์ดํ๋ฆฌ์ผ์ด์
, ๋ฆฌ์กํธ ํ๋ก ํธ์๋ ์ดํ๋ฆฌ์ผ์ด์
์ ์ฌ์ฉํ๋ ์น ์๋ฒ์ ๋ํ ์ปจํ
์ด๋๋ฅผ ๋ง๋ค์ด ์ด๋ค์ ๋ด๋ถ ๋คํธ์ํฌ๋ก ๊ฐ ์ปจํ
์ด๋๋ฅผ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. |
|||
|
|||
๋ชจ๋ ์ปจํ
์ด๋ ๊ด๋ฆฌ ์์คํ
(๋์ปค๋ ์ฟ ๋ฒ๋คํฐ์ค)์ ์ด๋ฌํ ๋คํธ์ํน ํน์ฑ์ ํฌํจํ๊ณ ์์ต๋๋ค. |
|||
|
|||
## ์ปจํ
์ด๋์ ํ๋ก์ธ์ค |
|||
|
|||
**์ปจํ
์ด๋ ์ด๋ฏธ์ง**๋ ๋ณดํต **์ปจํ
์ด๋**๋ฅผ ์์ํ๊ธฐ ์ํด ํ์ํ ๋ฉํ๋ฐ์ดํฐ์ ๋ํดํธ ์ปค๋งจ๋/ํ๋ก๊ทธ๋จ๊ณผ ๊ทธ ํ๋ก๊ทธ๋จ์ ์ ๋ฌํ๊ธฐ ์ํ ํ๋ผ๋ฏธํฐ๋ค์ ํฌํจํฉ๋๋ค. ์ด๋ ์ปค๋งจ๋ ๋ผ์ธ์์ ํ๋ก๊ทธ๋จ์ ์คํํ ๋ ํ์ํ ๊ฐ๋ค๊ณผ ์ ์ฌํฉ๋๋ค. |
|||
|
|||
**์ปจํ
์ด๋**๊ฐ ์์๋๋ฉด, ํด๋น ์ปค๋งจ๋/ํ๋ก๊ทธ๋จ์ด ์คํ๋ฉ๋๋ค (๊ทธ๋ฌ๋ ๋ค๋ฅธ ์ปค๋งจ๋/ํ๋ก๊ทธ๋จ์ ์คํํ๋๋ก ์ค๋ฒ๋ผ์ด๋ ํ ์ ์์ต๋๋ค). |
|||
|
|||
์ปจํ
์ด๋๋ **๋ฉ์ธ ํ๋ก์ธ์ค**(์ปค๋งจ๋ ๋๋ ํ๋ก๊ทธ๋จ)์ด ์คํ๋๋ ๋์ ์คํ๋ฉ๋๋ค. |
|||
|
|||
์ปจํ
์ด๋๋ ์ผ๋ฐ์ ์ผ๋ก **๋จ์ผ ํ๋ก์ธ์ค**๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง, ๋ฉ์ธ ํ๋ก์ธ์ค์ ์๋ธ ํ๋ก์ธ์ค๋ฅผ ์์ํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ฉฐ, ์ด ๋ฐฉ๋ฒ์ผ๋ก ํ๋์ ์ปจํ
์ด๋์ **๋ค์ค ํ๋ก์ธ์ค**๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. |
|||
|
|||
๊ทธ๋ฌ๋ **์ต์ํ ํ๋์ ์คํ์ค์ธ ํ๋ก์ธ์ค**๋ฅผ ๊ฐ์ง์ง ์๊ณ ์๋ ์คํ์ค์ธ ์ปจํ
์ด๋๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ๋ง์ฝ ๋ฉ์ธ ํ๋ก์ธ์ค๊ฐ ์ค๋จ๋๋ฉด, ์ปจํ
์ด๋๋ ์ค๋จ๋ฉ๋๋ค. |
|||
|
|||
## 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`๋ก ์ค์นํฉ๋๋ค. ์๋ฅผ ๋ค์ด: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ pip install -r requirements.txt |
|||
---> 100% |
|||
Successfully installed fastapi pydantic uvicorn |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
!!! ์ ๋ณด |
|||
ํจํค์ง ์ข
์์ฑ์ ์ ์ํ๊ณ ์ค์นํ๊ธฐ ์ํ ๋ฐฉ๋ฒ๊ณผ ๋๊ตฌ๋ ๋ค์ํฉ๋๋ค. |
|||
|
|||
๋์ค์ ์๋ ์ธ์
์์ 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 ์ด๋ฏธ์ง๋ฅผ ๋น๋ํฉ๋๋ค: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ docker build -t myimage . |
|||
|
|||
---> 100% |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
!!! ํ |
|||
๋งจ ๋์ ์๋ `.` ์ ์ฃผ๋ชฉํฉ์๋ค. ์ด๋ `./`์ ๋๋ฑํ๋ฉฐ, ๋์ปค์๊ฒ ์ปจํ
์ด๋ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๊ธฐ ์ํ ๋๋ ํฐ๋ฆฌ๋ฅผ ์๋ ค์ค๋๋ค. |
|||
|
|||
์ด ๊ฒฝ์ฐ์๋ ํ์ฌ ๋๋ ํฐ๋ฆฌ(`.`)์ ๊ฐ์ต๋๋ค. |
|||
|
|||
### ๋์ปค ์ปจํ
์ด๋ ์์ํ๊ธฐ |
|||
|
|||
* ์ฌ๋ฌ๋ถ์ ์ด๋ฏธ์ง์ ๊ธฐ๋ฐํ์ฌ ์ปจํ
์ด๋๋ฅผ ์คํํฉ๋๋ค: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ docker run -d --name mycontainer -p 80:80 myimage |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
## ์ฒดํฌํ๊ธฐ |
|||
|
|||
์ฌ๋ฌ๋ถ์ ๋์ปค ์ปจํ
์ด๋ URL์์ ์คํ ์ฌํญ์ ์ฒดํฌํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด: <a href="http://192.168.99.100/items/5?q=somequery" class="external-link" target="_blank">http://192.168.99.100/items/5?q=somequery</a> ๋๋ <a href="http://127.0.0.1/items/5?q=somequery" class="external-link" target="_blank">http://127.0.0.1/items/5?q=somequery</a> (๋๋ ๋์ผํ๊ฒ, ์ฌ๋ฌ๋ถ์ ๋์ปค ํธ์คํธ๋ฅผ ์ด์ฉํด์ ์ฒดํฌํ ์๋ ์์ต๋๋ค). |
|||
|
|||
์๋์ ๋น์ทํ ๊ฒ์ ๋ณด๊ฒ ๋ ๊ฒ์
๋๋ค: |
|||
|
|||
```JSON |
|||
{"item_id": 5, "q": "somequery"} |
|||
``` |
|||
|
|||
## ์ธํฐ๋ํฐ๋ธ API ๋ฌธ์ |
|||
|
|||
์ด์ ์ฌ๋ฌ๋ถ์ <a href="http://192.168.99.100/docs" class="external-link" target="_blank">http://192.168.99.100/docs</a> ๋๋ <a href="http://127.0.0.1/docs" class="external-link" target="_blank">http://127.0.0.1/docs</a>๋ก ์ด๋ํ ์ ์์ต๋๋ค(๋๋, ์ฌ๋ฌ๋ถ์ ๋์ปค ํธ์คํธ๋ฅผ ์ด์ฉํ ์ ์์ต๋๋ค). |
|||
|
|||
์ฌ๋ฌ๋ถ์ ์๋์ผ๋ก ์์ฑ๋ ์ธํฐ๋ํฐ๋ธ API(<a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank">Swagger UI</a>์์ ์ ๊ณต๋)๋ฅผ ๋ณผ ์ ์์ต๋๋ค: |
|||
|
|||
 |
|||
|
|||
## ๋์ API ๋ฌธ์ |
|||
|
|||
๋ํ ์ฌ๋ฌ๋ถ์ <a href="http://192.168.99.100/redoc" class="external-link" target="_blank">http://192.168.99.100/redoc</a> ๋๋ <a href="http://127.0.0.1/redoc" class="external-link" target="_blank">http://127.0.0.1/redoc</a>์ผ๋ก ์ด๋ํ ์ ์์ต๋๋ค(๋๋, ์ฌ๋ฌ๋ถ์ ๋์ปค ํธ์คํธ๋ฅผ ์ด์ฉํ ์ ์์ต๋๋ค). |
|||
|
|||
์ฌ๋ฌ๋ถ์ ์๋์ผ๋ก ์์ฑ๋ ๋์ ๋ฌธ์(<a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank">ReDoc</a>์์ ์ ๊ณต๋)๋ฅผ ๋ณผ ์ ์์ต๋๋ค: |
|||
|
|||
 |
|||
|
|||
## ๋จ์ผ ํ์ผ 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**์ **์ธ์ฆ์**์ **์๋** ์ทจ๋์ ๋ค๋ฃจ๋ ๊ฒ์ ๋ค๋ฅธ ์ปจํ
์ด๋๊ฐ ๋ ์ ์๋๋ฐ, ์๋ฅผ ๋ค์ด <a href="https://traefik.io/" class="external-link" target="_blank">Traefik</a>์ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. |
|||
|
|||
!!! ํ |
|||
Traefik์ ๋์ปค, ์ฟ ๋ฒ๋คํฐ์ค, ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ๋๊ตฌ์ ํตํฉ๋์ด ์์ด ์ฌ๋ฌ๋ถ์ ์ปจํ
์ด๋๋ฅผ ํฌํจํ๋ HTTPS๋ฅผ ์
์
ํ๊ณ ์ค์ ํ๋ ๊ฒ์ด ๋งค์ฐ ์ฝ์ต๋๋ค. |
|||
|
|||
๋์์ ์ผ๋ก, HTTPS๋ ํด๋ผ์ฐ๋ ์ ๊ณต์์ ์ํด ์๋น์ค์ ์ผํ์ผ๋ก ๋ค๋ฃจ์ด์ง ์๋ ์์ต๋๋ค (์ด๋๋ ์ดํ๋ฆฌ์ผ์ด์
์ ์ฌ์ ํ ์ปจํ
์ด๋์์ ์คํ๋ ๊ฒ์
๋๋ค). |
|||
|
|||
## ๊ตฌ๋๊ณผ ์ฌ์์ |
|||
|
|||
์ฌ๋ฌ๋ถ์ ์ปจํ
์ด๋๋ฅผ **์์ํ๊ณ ์คํํ๋** ๋ฐ์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋๊ตฌ๋ ๋ฐ๋ก ์์ต๋๋ค. |
|||
|
|||
์ด๋ **๋์ปค** ์์ฒด์ผ ์๋ ์๊ณ , **๋์ปค ์ปดํฌ์ฆ**, **์ฟ ๋ฒ๋คํฐ์ค**, **ํด๋ผ์ฐ๋ ์๋น์ค** ๋ฑ์ด ๋ ์ ์์ต๋๋ค. |
|||
|
|||
๋๋ถ๋ถ (๋๋ ์ ์ฒด) ๊ฒฝ์ฐ์, ์ปจํ
์ด๋๋ฅผ ๊ตฌ๋ํ๊ฑฐ๋ ๊ณ ์ฅ์์ ์ฌ์์ํ๋๋ก ํ๋ ๊ฐ๋จํ ์ต์
์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋์ปค์์๋, ์ปค๋งจ๋ ๋ผ์ธ ์ต์
`--restart` ์
๋๋ค. |
|||
|
|||
์ปจํ
์ด๋๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์๋, ์ดํ๋ฆฌ์ผ์ด์
์ ๊ตฌ๋ํ๊ณ ์ฌ์์ํ๋ ๊ฒ์ด ๋งค์ฐ ๋ฒ๊ฑฐ๋กญ๊ณ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ํ์ง๋ง **์ปจํ
์ด๋๋ฅผ ์ฌ์ฉํ๋ค๋ฉด** ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์ ์ด๋ฐ ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ์ ์ผ๋ก ํฌํจ๋์ด ์์ต๋๋ค. โจ |
|||
|
|||
## ๋ณต์ - ํ๋ก์ธ์ค ๊ฐ์ |
|||
|
|||
๋ง์ฝ ์ฌ๋ฌ๋ถ์ด **์ฟ ๋ฒ๋คํฐ์ค**์ ๋จธ์ <abbr title="A group of machines that are configured to be connected and work together in some way.">ํด๋ฌ์คํฐ</abbr>, ๋์ปค ์ค์ ๋ชจ๋, ๋
ธ๋ง๋, ๋๋ ๋ค๋ฅธ ์ฌ๋ฌ ๋จธ์ ์์ ๋ถ์ฐ ์ปจํ
์ด๋๋ฅผ ๊ด๋ฆฌํ๋ ๋ณต์กํ ์์คํ
์ ๋ค๋ฃจ๊ณ ์๋ค๋ฉด, ์ฌ๋ฌ๋ถ์ ๊ฐ ์ปจํ
์ด๋์์ (์์ปค์ ํจ๊ป ์ฌ์ฉํ๋ 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 |
|||
* ๊ตฌ๋ํ๊ธฐ |
|||
* ์ฌ์์ |
|||
* ๋ณต์ (์คํ ์ค์ธ ํ๋ก์ธ์ค ๊ฐ์) |
|||
* ๋ฉ๋ชจ๋ฆฌ |
|||
* ์์ํ๊ธฐ ์ ๋จ๊ณ๋ค |
|||
|
|||
## ๋ฉ๋ชจ๋ฆฌ |
|||
|
|||
๋ง์ฝ ์ฌ๋ฌ๋ถ์ด **์ปจํ
์ด๋ ๋น ๋จ์ผ ํ๋ก์ธ์ค**๋ฅผ ์คํํ๋ค๋ฉด, ์ฌ๋ฌ๋ถ์ ๊ฐ ์ปจํ
์ด๋(๋ณต์ ๋ ๊ฒฝ์ฐ์๋ ์ฌ๋ฌ๊ฐ์ ์ปจํ
์ด๋๋ค)์ ๋ํด ์ ์ ์๋๊ณ , ์์ ์ ์ด๋ฉฐ, ์ ํ๋ ์ฉ๋์ ๋ฉ๋ชจ๋ฆฌ ์๋น๋์ ๊ฐ์ง๊ณ ์์ ๊ฒ์
๋๋ค. |
|||
|
|||
๊ทธ๋ฌ๋ฉด ์ฌ๋ฌ๋ถ์ ์ปจํ
์ด๋ ๊ด๋ฆฌ ์์คํ
(์๋ฅผ ๋ค์ด **์ฟ ๋ฒ๋คํฐ์ค**) ์ค์ ์์ ์์ ์ ์๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ ํ๊ณผ ์๊ตฌ์ฌํญ์ ์ค์ ํ ์ ์์ต๋๋ค. ์ด๋ฐ ๋ฐฉ๋ฒ์ผ๋ก **๊ฐ์ฉ ๋จธ์ **์ด ํ์๋กํ๋ ๋ฉ๋ชจ๋ฆฌ์ ํด๋ฌ์คํฐ์ ์๋ ๊ฐ์ฉ ๋จธ์ ๋ค์ ์ผ๋์ ๋๊ณ **์ปจํ
์ด๋๋ฅผ ๋ณต์ **ํ ์ ์์ต๋๋ค. |
|||
|
|||
๋ง์ฝ ์ฌ๋ฌ๋ถ์ ์ดํ๋ฆฌ์ผ์ด์
์ด **๋จ์**ํ๋ค๋ฉด, ์ด๊ฒ์ **๋ฌธ์ ๊ฐ ๋์ง ์์** ๊ฒ์ด๊ณ , ๊ณ ์ ๋ ๋ฉ๋ชจ๋ฆฌ ์ ํ์ ๊ตฌ์ฒดํํ ํ์๋ ์์ ๊ฒ์
๋๋ค. ํ์ง๋ง ์ฌ๋ฌ๋ถ์ ์ดํ๋ฆฌ์ผ์ด์
์ด (์๋ฅผ ๋ค์ด **๋จธ์ ๋ฌ๋** ๋ชจ๋ธ๊ฐ์ด) **๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ํ๋ค๋ฉด**, ์ดํ๋ฆฌ์ผ์ด์
์ด ์ผ๋ง๋ ๋ง์ ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋์ง ํ์ธํ๊ณ **๊ฐ ๋จธ์ ์์** ์ฌ์ฉํ๋ **์ปจํ
์ด๋์ ์**๋ฅผ ์กฐ์ ํ ํ์๊ฐ ์์ต๋๋ค (๊ทธ๋ฆฌ๊ณ ํ์์ ๋ฐ๋ผ ์ฌ๋ฌ๋ถ์ ํด๋ฌ์คํฐ์ ๋จธ์ ์ ์ถ๊ฐํ ์ ์์ต๋๋ค). |
|||
|
|||
๋ง์ฝ ์ฌ๋ฌ๋ถ์ด **์ปจํ
์ด๋ ๋น ์ฌ๋ฌ๊ฐ์ ํ๋ก์ธ์ค**๋ฅผ ์คํํ๋ค๋ฉด (์๋ฅผ ๋ค์ด ๊ณต์ ๋์ปค ์ด๋ฏธ์ง ์ฒ๋ผ), ์ฌ๋ฌ๋ถ์ ์์๋ ํ๋ก์ธ์ค ๊ฐ์๊ฐ ๊ฐ์ฉํ ๊ฒ ๋ณด๋ค **๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋น**ํ์ง ์๋์ง ํ์ธํด์ผ ํฉ๋๋ค. |
|||
|
|||
## ์์ํ๊ธฐ ์ ๋จ๊ณ๋ค๊ณผ ์ปจํ
์ด๋ |
|||
|
|||
๋ง์ฝ ์ฌ๋ฌ๋ถ์ด ์ปจํ
์ด๋(์๋ฅผ ๋ค์ด ๋์ปค, ์ฟ ๋ฒ๋คํฐ์ค)๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ์ฌ๋ฌ๋ถ์ด ์ ๊ทผํ ์ ์๋ ์ฃผ์ ๋ฐฉ๋ฒ์ ํฌ๊ฒ ๋๊ฐ์ง๊ฐ ์์ต๋๋ค. |
|||
|
|||
### ๋ค์ค ์ปจํ
์ด๋ |
|||
|
|||
๋ง์ฝ ์ฌ๋ฌ๋ถ์ด **์ฌ๋ฌ๊ฐ์ ์ปจํ
์ด๋**๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด, ์๋ง๋ ๊ฐ๊ฐ์ ์ปจํ
์ด๋๋ **ํ๋์ ํ๋ก์ธ์ค**๋ฅผ ๊ฐ์ง๊ณ ์์ ๊ฒ์
๋๋ค(์๋ฅผ ๋ค์ด, **์ฟ ๋ฒ๋คํฐ์ค** ํด๋ฌ์คํฐ์์). ๊ทธ๋ฌ๋ฉด ์ฌ๋ฌ๋ถ์ ๋ณต์ ๋ ์์ปค ์ปจํ
์ด๋๋ฅผ ์คํํ๊ธฐ **์ด์ ์**, ํ๋์ ์ปจํ
์ด๋์ ์๋ **์ด์ ์ ๋จ๊ณ๋ค์** ์ํํ๋ ๋จ์ผ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ง๋ **๋ณ๋์ ์ปจํ
์ด๋๋ค**์ ๊ฐ์ง๊ณ ์ถ์ ๊ฒ์
๋๋ค. |
|||
|
|||
!!! ์ ๋ณด |
|||
๋ง์ฝ ์ฌ๋ฌ๋ถ์ด ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด, ์๋ง๋ ์ด๋ <a href="https://kubernetes.io/docs/concepts/workloads/pods/init-containers/" class="external-link" target="_blank">Init Container</a>์ผ ๊ฒ์
๋๋ค. |
|||
|
|||
๋ง์ฝ ์ฌ๋ฌ๋ถ์ ์ด์ฉ ์ฌ๋ก์์ ์ด์ ๋จ๊ณ๋ค์ **๋ณ๋ ฌ์ ์ผ๋ก ์ฌ๋ฌ๋ฒ** ์ํํ๋๋ฐ์ ๋ฌธ์ ๊ฐ ์๋ค๋ฉด (์๋ฅผ ๋ค์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด์ ์ ์คํํ์ง ์๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ค๋น๋์๋์ง ํ์ธ๋ง ํ๋ ๊ฒฝ์ฐ), ๋ฉ์ธ ํ๋ก์ธ์ค๋ฅผ ์์ํ๊ธฐ ์ ์ ์ด ๋จ๊ณ๋ค์ ๊ฐ ์ปจํ
์ด๋์ ๋ฃ์ ์ ์์ต๋๋ค. |
|||
|
|||
### ๋จ์ผ ์ปจํ
์ด๋ |
|||
|
|||
๋ง์ฝ ์ฌ๋ฌ๋ถ์ ์
์
์ด **๋ค์ค ํ๋ก์ธ์ค**(๋๋ ํ๋์ ํ๋ก์ธ์ค)๋ฅผ ์์ํ๋ **ํ๋์ ์ปจํ
์ด๋**๋ฅผ ๊ฐ์ง๋ ๋จ์ํ ์
์
์ด๋ผ๋ฉด, ์ฌ์ ๋จ๊ณ๋ค์ ์ฑ์ ํฌํจํ๋ ํ๋ก์ธ์ค๋ฅผ ์์ํ๊ธฐ ์ง์ ์ ๊ฐ์ ์ปจํ
์ด๋์์ ์คํํ ์ ์์ต๋๋ค. ๊ณต์ ๋์ปค ์ด๋ฏธ์ง๋ ์ด๋ฅผ ๋ด๋ถ์ ์ผ๋ก ์ง์ํฉ๋๋ค. |
|||
|
|||
## Gunicorn๊ณผ ํจ๊ปํ๋ ๊ณต์ ๋์ปค ์ด๋ฏธ์ง - Uvicorn |
|||
|
|||
์ ์ฑํฐ์์ ์์ธํ๊ฒ ์ค๋ช
๋ ๊ฒ ์ฒ๋ผ, Uvicorn ์์ปค์ ๊ฐ์ด ์คํ๋๋ Gunicorn์ ํฌํจํ๋ ๊ณต์ ๋์ปค ์ด๋ฏธ์ง๊ฐ ์์ต๋๋ค: [์๋ฒ ์์ปค - Uvicorn๊ณผ ํจ๊ปํ๋ Gunicorn](./server-workers.md){.internal-link target=_blank}. |
|||
|
|||
์ด ์ด๋ฏธ์ง๋ ์ฃผ๋ก ์์์ ์ค๋ช
๋ ์ํฉ์์ ์ ์ฉํ ๊ฒ์
๋๋ค: [๋ค์ค ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ง๋ ์ปจํ
์ด๋์ ํน์ํ ๊ฒฝ์ฐ๋ค](#containers-with-multiple-processes-and-special-cases). |
|||
|
|||
* <a href="https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker" class="external-link" target="_blank">tiangolo/uvicorn-gunicorn-fastapi</a>. |
|||
|
|||
!!! ๊ฒฝ๊ณ |
|||
์ฌ๋ฌ๋ถ์ด ์ด ๋ฒ ์ด์ค ์ด๋ฏธ์ง ๋๋ ๋ค๋ฅธ ์ ์ฌํ ์ด๋ฏธ์ง๋ฅผ ํ์๋ก ํ์ง **์์** ๋์ ๊ฐ๋ฅ์ฑ์ด ์์ผ๋ฉฐ, [์์์ ์ค๋ช
๋ ๊ฒ์ฒ๋ผ: FastAPI๋ฅผ ์ํ ๋์ปค ์ด๋ฏธ์ง ๋น๋ํ๊ธฐ](#build-a-docker-image-for-fastapi) ์ฒ์๋ถํฐ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๋ ๊ฒ์ด ๋ ๋์ ์ ์์ต๋๋ค. |
|||
|
|||
์ด ์ด๋ฏธ์ง๋ ๊ฐ๋ฅํ CPU ์ฝ์ด์ ๊ธฐ๋ฐํ **๋ช๊ฐ์ ์์ปค ํ๋ก์ธ์ค**๋ฅผ ์ค์ ํ๋ **์๋-ํ๋** ๋ฉ์ปค๋์ฆ์ ํฌํจํ๊ณ ์์ต๋๋ค. |
|||
|
|||
์ด ์ด๋ฏธ์ง๋ **๋ฏผ๊ฐํ ๋ํดํธ** ๊ฐ์ ๊ฐ์ง๊ณ ์์ง๋ง, ์ฌ๋ฌ๋ถ๋ค์ ์ฌ์ ํ **ํ๊ฒฝ ๋ณ์** ๋๋ ์ค์ ํ์ผ์ ํตํด ์ค์ ๊ฐ์ ์์ ํ๊ณ ์
๋ฐ์ดํธ ํ ์ ์์ต๋๋ค. |
|||
|
|||
๋ํ ์คํฌ๋ฆฝํธ๋ฅผ ํตํด <a href="https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker#pre_start_path" class="external-link" target="_blank">**์์ํ๊ธฐ ์ ์ฌ์ ๋จ๊ณ**</a>๋ฅผ ์คํํ๋ ๊ฒ์ ์ง์ํฉ๋๋ค. |
|||
|
|||
!!! ํ |
|||
๋ชจ๋ ์ค์ ๊ณผ ์ต์
์ ๋ณด๋ ค๋ฉด, ๋์ปค ์ด๋ฏธ์ง ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค: <a href="https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker" class="external-link" target="_blank">tiangolo/uvicorn-gunicorn-fastapi</a>. |
|||
|
|||
### ๊ณต์ ๋์ปค ์ด๋ฏธ์ง์ ์๋ ํ๋ก์ธ์ค ๊ฐ์ |
|||
|
|||
์ด ์ด๋ฏธ์ง์ ์๋ **ํ๋ก์ธ์ค ๊ฐ์**๋ ๊ฐ์ฉํ 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์ ๋์ปค ์ด๋ฏธ์ง |
|||
|
|||
๋ง์ฝ ์ฌ๋ฌ๋ถ๋ค์ด ํ๋ก์ ํธ ์์กด์ฑ์ ๊ด๋ฆฌํ๊ธฐ ์ํด <a href="https://python-poetry.org/" class="external-link" target="_blank">Poetry</a>๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ๋์ปค์ ๋ฉํฐ-์คํ
์ด์ง ๋น๋ฉ์ ์ฌ์ฉํ ์ ์์ต๋๋ค: |
|||
|
|||
```{ .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๋ฅผ ์ํ ๊ณต์ ๋์ปค ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ๐ค |
Loadingโฆ
Reference in new issue