리λ
μ€ μ»¨ν
μ΄λλ₯Ό μ¬μ©νλ λ°μλ **보μ**, **λ°λ³΅ κ°λ₯μ±**, **λ¨μν¨** λ±μ μ₯μ μ΄ μμ΅λλ€.
-!!! ν
+!!! tip "ν"
μκ°μ μ«κΈ°κ³ μκ³ μ΄λ―Έ μ΄λ°κ²λ€μ μκ³ μλ€λ©΄ [`Dockerfile`π](#build-a-docker-image-for-fastapi)λ‘ μ νν μ μμ΅λλ€.
<details>
</div>
-!!! μ 보
+!!! info "μ 보"
ν¨ν€μ§ μ’
μμ±μ μ μνκ³ μ€μΉνκΈ° μν λ°©λ²κ³Ό λꡬλ λ€μν©λλ€.
λμ€μ μλ μΈμ
μμ Poetryλ₯Ό μ¬μ©ν μμλ₯Ό 보μ΄κ² μ΅λλ€. π
νλ‘κ·Έλ¨μ΄ `/code`μμ μμνκ³ κ·Έ μμ `./app` λλ ν°λ¦¬κ° μ¬λ¬λΆμ μ½λμ ν¨κ» λ€μ΄μκΈ° λλ¬Έμ, **Uvicorn**μ μ΄λ₯Ό λ³΄κ³ `app`μ `app.main`μΌλ‘λΆν° **λΆλ¬ μ¬** κ²μ
λλ€.
-!!! ν
+!!! tip "ν"
κ° μ½λ λΌμΈμ μ½λμ μ«μ λ²λΈμ ν΄λ¦νμ¬ λ¦¬λ·°ν μ μμ΅λλ€. π
μ΄μ μ¬λ¬λΆμ λ€μκ³Ό κ°μ λλ ν°λ¦¬ ꡬ쑰λ₯Ό κ°μ§κ³ μμ κ²μ
λλ€:
</div>
-!!! ν
+!!! tip "ν"
맨 λμ μλ `.` μ μ£Όλͺ©ν©μλ€. μ΄λ `./`μ λλ±νλ©°, λ컀μκ² μ»¨ν
μ΄λ μ΄λ―Έμ§λ₯Ό λΉλνκΈ° μν λλ ν°λ¦¬λ₯Ό μλ €μ€λλ€.
μ΄ κ²½μ°μλ νμ¬ λλ ν°λ¦¬(`.`)μ κ°μ΅λλ€.
**HTTPS**μ **μΈμ¦μ**μ **μλ** μ·¨λμ λ€λ£¨λ κ²μ λ€λ₯Έ 컨ν
μ΄λκ° λ μ μλλ°, μλ₯Ό λ€μ΄ <a href="https://traefik.io/" class="external-link" target="_blank">Traefik</a>μ μ¬μ©νλ κ²μ
λλ€.
-!!! ν
+!!! tip "ν"
Traefikμ λ컀, μΏ λ²λ€ν°μ€, κ·Έλ¦¬κ³ λ€λ₯Έ λꡬμ ν΅ν©λμ΄ μμ΄ μ¬λ¬λΆμ 컨ν
μ΄λλ₯Ό ν¬ν¨νλ HTTPSλ₯Ό μ
μ
νκ³ μ€μ νλ κ²μ΄ λ§€μ° μ½μ΅λλ€.
λμμ μΌλ‘, HTTPSλ ν΄λΌμ°λ μ 곡μμ μν΄ μλΉμ€μ μΌνμΌλ‘ λ€λ£¨μ΄μ§ μλ μμ΅λλ€ (μ΄λλ μ΄ν리μΌμ΄μ
μ μ¬μ ν 컨ν
μ΄λμμ μ€νλ κ²μ
λλ€).
μ΄ μμκ° μμ²λ€μ **λ‘λ**λ₯Ό μ½μ΄λ€μ΄κ³ κ° μ컀μκ² (λ°λΌκ±΄λ) **κ· νμ μΌλ‘** λΆλ°°νλ€λ©΄, μ΄ μμλ μΌλ°μ μΌλ‘ **λ‘λ λ°Έλ°μ**λΌκ³ λΆλ¦½λλ€.
-!!! ν
+!!! tip "ν"
HTTPSλ₯Ό μν΄ μ¬μ©λ **TLS μ’
λ£ νλ‘μ** μμ λν **λ‘λ λ°Έλ°μ**κ° λ μ μμ΅λλ€.
λν 컨ν
μ΄λλ‘ μμ
ν λ, 컨ν
μ΄λλ₯Ό μμνκ³ κ΄λ¦¬νκΈ° μν΄ μ¬μ©ν κ²κ³Ό λμΌν μμ€ν
μ μ΄λ―Έ ν΄λΉ **λ‘λ λ°Έλ°μ**λ‘ λΆν° μ¬λ¬λΆμ μ±μ ν΄λΉνλ 컨ν
μ΄λλ‘ **λ€νΈμν¬ ν΅μ **(μλ₯Ό λ€μ΄, HTTP μμ²)μ μ μ‘νλ λ΄λΆμ μΈ λꡬλ₯Ό κ°μ§κ³ μμ κ²μ
λλ€ (μ¬κΈ°μλ λ‘λ λ°Έλ°μλ **TLS μ’
λ£ νλ‘μ**μΌ μ μμ΅λλ€).
λ§μ½ μ¬λ¬λΆμ΄ **μ¬λ¬κ°μ 컨ν
μ΄λ**λ₯Ό κ°μ§κ³ μλ€λ©΄, μλ§λ κ°κ°μ 컨ν
μ΄λλ **νλμ νλ‘μΈμ€**λ₯Ό κ°μ§κ³ μμ κ²μ
λλ€(μλ₯Ό λ€μ΄, **μΏ λ²λ€ν°μ€** ν΄λ¬μ€ν°μμ). κ·Έλ¬λ©΄ μ¬λ¬λΆμ 볡μ λ μ컀 컨ν
μ΄λλ₯Ό μ€ννκΈ° **μ΄μ μ**, νλμ 컨ν
μ΄λμ μλ **μ΄μ μ λ¨κ³λ€μ** μννλ λ¨μΌ νλ‘μΈμ€λ₯Ό κ°μ§λ **λ³λμ 컨ν
μ΄λλ€**μ κ°μ§κ³ μΆμ κ²μ
λλ€.
-!!! μ 보
+!!! info "μ 보"
λ§μ½ μ¬λ¬λΆμ΄ μΏ λ²λ€ν°μ€λ₯Ό μ¬μ©νκ³ μλ€λ©΄, μλ§λ μ΄λ <a href="https://kubernetes.io/docs/concepts/workloads/pods/init-containers/" class="external-link" target="_blank">Init Container</a>μΌ κ²μ
λλ€.
λ§μ½ μ¬λ¬λΆμ μ΄μ© μ¬λ‘μμ μ΄μ λ¨κ³λ€μ **λ³λ ¬μ μΌλ‘ μ¬λ¬λ²** μννλλ°μ λ¬Έμ κ° μλ€λ©΄ (μλ₯Ό λ€μ΄ λ°μ΄ν°λ² μ΄μ€ μ΄μ μ μ€ννμ§ μκ³ λ°μ΄ν°λ² μ΄μ€κ° μ€λΉλμλμ§ νμΈλ§ νλ κ²½μ°), λ©μΈ νλ‘μΈμ€λ₯Ό μμνκΈ° μ μ μ΄ λ¨κ³λ€μ κ° μ»¨ν
μ΄λμ λ£μ μ μμ΅λλ€.
* <a href="https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker" class="external-link" target="_blank">tiangolo/uvicorn-gunicorn-fastapi</a>.
-!!! κ²½κ³
+!!! warning "κ²½κ³ "
μ¬λ¬λΆμ΄ μ΄ λ² μ΄μ€ μ΄λ―Έμ§ λλ λ€λ₯Έ μ μ¬ν μ΄λ―Έμ§λ₯Ό νμλ‘ νμ§ **μμ** λμ κ°λ₯μ±μ΄ μμΌλ©°, [μμμ μ€λͺ
λ κ²μ²λΌ: 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>λ₯Ό μ€ννλ κ²μ μ§μν©λλ€.
-!!! ν
+!!! tip "ν"
λͺ¨λ μ€μ κ³Ό μ΅μ
μ λ³΄λ €λ©΄, λ컀 μ΄λ―Έμ§ νμ΄μ§λ‘ μ΄λν©λλ€: <a href="https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker" class="external-link" target="_blank">tiangolo/uvicorn-gunicorn-fastapi</a>.
### 곡μ λ컀 μ΄λ―Έμ§μ μλ νλ‘μΈμ€ κ°μ
11. `uvicorn` 컀맨λλ₯Ό μ€ννμ¬, `app.main`μμ λΆλ¬μ¨ `app` κ°μ²΄λ₯Ό μ¬μ©νλλ‘ ν©λλ€.
-!!! ν
+!!! tip "ν"
λ²λΈ μ«μλ₯Ό ν΄λ¦ν΄ κ° μ€μ΄ νλ μΌμ μμλ³Ό μ μμ΅λλ€.
**λ컀 μ€ν
μ΄μ§**λ `Dockefile`μ μΌλΆλ‘μ λμ€μ μ¬μ©νκΈ° μν νμΌλ€μ μμ±νκΈ° μν **μΌμμ μΈ μ»¨ν
μ΄λ μ΄λ―Έμ§**λ‘ μλν©λλ€.