@ -1,6 +1,6 @@
# ์ปจํ
์ด๋์ FastAPI - ๋์ปค { #fastapi -in-containers-docker }
FastAPI ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐฐํฌํ ๋ ์ผ๋ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ๋ฒ์ **๋ฆฌ๋
์ค ์ปจํ
์ด๋ ์ด๋ฏธ์ง**๋ฅผ ๋น๋ํ๋ ๊ฒ์
๋๋ค. ๋ณดํต <a href="https://www.docker.com/" class="external-link" target="_blank">**Docker** </ a > ๋ฅผ ์ฌ์ฉํด ์ํํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ํด๋น ์ปจํ
์ด๋ ์ด๋ฏธ์ง๋ฅผ ๋ช ๊ฐ์ง ๊ฐ๋ฅํ ๋ฐฉ๋ฒ ์ค ํ๋๋ก ๋ฐฐํฌํ ์ ์์ต๋๋ค.
FastAPI ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐฐํฌํ ๋ ์ผ๋ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ๋ฒ์ **๋ฆฌ๋
์ค ์ปจํ
์ด๋ ์ด๋ฏธ์ง**๋ฅผ ๋น๋ํ๋ ๊ฒ์
๋๋ค. ๋ณดํต [**Docker** ](https://www.docker.com/) ๋ฅผ ์ฌ์ฉํด ์ํํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ํด๋น ์ปจํ
์ด๋ ์ด๋ฏธ์ง๋ฅผ ๋ช ๊ฐ์ง ๊ฐ๋ฅํ ๋ฐฉ๋ฒ ์ค ํ๋๋ก ๋ฐฐํฌํ ์ ์์ต๋๋ค.
๋ฆฌ๋
์ค ์ปจํ
์ด๋๋ฅผ ์ฌ์ฉํ๋ฉด **๋ณด์** , **์ฌํ ๊ฐ๋ฅ์ฑ** , **๋จ์ํจ** ๋ฑ ์ฌ๋ฌ ์ฅ์ ์ด ์์ต๋๋ค.
@ -60,16 +60,16 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"]
Docker๋ **์ปจํ
์ด๋ ์ด๋ฏธ์ง**์ **์ปจํ
์ด๋**๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ ์ฃผ์ ๋๊ตฌ ์ค ํ๋์
๋๋ค.
๋ํ < a href = "https://hub.docker.com/" class = "external-link" target = "_blank" > Docker Hub< / a > ์๋ ๋ค์ํ ๋๊ตฌ, ํ๊ฒฝ, ๋ฐ์ดํฐ๋ฒ ์ด์ค, ์ ํ๋ฆฌ์ผ์ด์
์ ์ํ ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ง **๊ณต์ ์ปจํ
์ด๋ ์ด๋ฏธ์ง**๊ฐ ๊ณต๊ฐ๋์ด ์์ต๋๋ค.
๋ํ [Docker Hub ](https://hub.docker.com/ ) ์๋ ๋ค์ํ ๋๊ตฌ, ํ๊ฒฝ, ๋ฐ์ดํฐ๋ฒ ์ด์ค, ์ ํ๋ฆฌ์ผ์ด์
์ ์ํ ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ง **๊ณต์ ์ปจํ
์ด๋ ์ด๋ฏธ์ง**๊ฐ ๊ณต๊ฐ๋์ด ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ๊ณต์ < a href = "https://hub.docker.com/_/python" class = "external-link" target = "_blank" > Python Image< / a > ๊ฐ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ๊ณต์ [Python Image ](https://hub.docker.com/_/python ) ๊ฐ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฑ ๋ค์ํ ์ฉ๋์ ๋ค๋ฅธ ์ด๋ฏธ์ง๋ ๋ง์ด ์์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด:
* < 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 > ๋ฑ
* [PostgreSQL ](https://hub.docker.com/_/postgres )
* [MySQL ](https://hub.docker.com/_/mysql )
* [MongoDB ](https://hub.docker.com/_/mongo )
* [Redis ](https://hub.docker.com/_/redis ) ๋ฑ
๋ฏธ๋ฆฌ ๋ง๋ค์ด์ง ์ปจํ
์ด๋ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ก ๋ค๋ฅธ ๋๊ตฌ๋ฅผ **๊ฒฐํฉ**ํ๊ณ ์ฌ์ฉํ๊ธฐ๊ฐ ๋งค์ฐ ์ฝ์ต๋๋ค. ์๋ฅผ ๋ค์ด ์๋ก์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ํํด ๋ณผ ๋๋ ๊ทธ๋ ์ต๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ **๊ณต์ ์ด๋ฏธ์ง**๋ฅผ ์ฌ์ฉํ๊ณ , ํ๊ฒฝ ๋ณ์๋ก ์ค์ ๋ง ํ๋ฉด ๋ฉ๋๋ค.
@ -111,7 +111,7 @@ Docker๋ Kubernetes ๊ฐ์ ๋ชจ๋ ์ปจํ
์ด๋ ๊ด๋ฆฌ ์์คํ
์๋ ์ด๋ฌํ
๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ ํจํค์ง ์ด๋ฆ๊ณผ ๋ฒ์ ์ ํ ์ค์ ํ๋์ฉ ์ ์ด ๋ `requirements.txt` ํ์ผ์ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
๋ฒ์ ๋ฒ์๋ฅผ ์ค์ ํ ๋๋ [FastAPI ๋ฒ์ ๋ค์ ๋ํ์ฌ ](versions.md ){.internal-link target=_blank} ์์ ์ฝ์ ๊ฒ๊ณผ ๊ฐ์ ์์ด๋์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
๋ฒ์ ๋ฒ์๋ฅผ ์ค์ ํ ๋๋ [FastAPI ๋ฒ์ ๋ค์ ๋ํ์ฌ ](versions.md )์์ ์ฝ์ ๊ฒ๊ณผ ๊ฐ์ ์์ด๋์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด `requirements.txt` ๋ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค:
@ -238,7 +238,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"]
#### `CMD` ์ฌ์ฉํ๊ธฐ - Exec Form { #use -cmd-exec-form }
Docker ์ง์์ด < a href = "https://docs.docker.com/reference/dockerfile/#cmd" class = "external-link" target = "_blank" > `CMD`< / a > ๋ ๋ ๊ฐ์ง ํ์์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค:
Docker ์ง์์ด [`CMD` ](https://docs.docker.com/reference/dockerfile/#cmd ) ๋ ๋ ๊ฐ์ง ํ์์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค:
โ
**Exec** form:
@ -254,11 +254,11 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80"]
CMD fastapi run app/main.py --port 80
```
FastAPI๊ฐ ์ ์์ ์ผ๋ก ์ข
๋ฃ(graceful shutdown)๋๊ณ [lifespan ์ด๋ฒคํธ ](../advanced/events.md ){.internal-link target=_blank} ๊ฐ ํธ๋ฆฌ๊ฑฐ๋๋๋ก ํ๋ ค๋ฉด, ํญ์ **exec** form์ ์ฌ์ฉํ์ธ์.
FastAPI๊ฐ ์ ์์ ์ผ๋ก ์ข
๋ฃ(graceful shutdown)๋๊ณ [lifespan ์ด๋ฒคํธ ](../advanced/events.md )๊ฐ ํธ๋ฆฌ๊ฑฐ๋๋๋ก ํ๋ ค๋ฉด, ํญ์ **exec** form์ ์ฌ์ฉํ์ธ์.
์์ธํ ๋ด์ฉ์ < a href = "https://docs.docker.com/reference/dockerfile/#shell-and-exec-form" class = "external-link" target = "_blank" > shell and exec form์ ๋ํ Docker ๋ฌธ์< / a > ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
์์ธํ ๋ด์ฉ์ [shell and exec form์ ๋ํ Docker ๋ฌธ์ ](https://docs.docker.com/reference/dockerfile/#shell-and-exec-form ) ๋ฅผ ์ฐธ๊ณ ํ์ธ์.
์ด๋ `docker compose` ๋ฅผ ์ฌ์ฉํ ๋ ๊ฝค ๋์ ๋ ์ ์์ต๋๋ค. ์ข ๋ ๊ธฐ์ ์ ์ธ ์์ธ ๋ด์ฉ์ Docker Compose FAQ ์น์
์ ์ฐธ๊ณ ํ์ธ์: < a href = "https://docs.docker.com/compose/faq/#why-do-my-services-take-10-seconds-to-recreate-or-stop" class = "external-link" target = "_blank" > Why do my services take 10 seconds to recreate or stop?</ a > .
์ด๋ `docker compose` ๋ฅผ ์ฌ์ฉํ ๋ ๊ฝค ๋์ ๋ ์ ์์ต๋๋ค. ์ข ๋ ๊ธฐ์ ์ ์ธ ์์ธ ๋ด์ฉ์ Docker Compose FAQ ์น์
์ ์ฐธ๊ณ ํ์ธ์: [Why do my services take 10 seconds to recreate or stop? ](https://docs.docker.com/compose/faq/#why-do-my-services-take-10-seconds-to-recreate-or-stop ) .
#### ๋๋ ํฐ๋ฆฌ ๊ตฌ์กฐ { #directory -structure }
@ -305,7 +305,7 @@ RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
ํจํค์ง ์์กด์ฑ์ ๋ค์ด๋ก๋ํ๊ณ ์ค์นํ๋ ๋ฐ์๋ **๋ช ๋ถ**์ด ๊ฑธ๋ฆด ์ ์์ง๋ง, **์บ์**๋ฅผ ์ฌ์ฉํ๋ฉด ๋ง์์ผ **๋ช ์ด**๋ฉด ๋๋ฉ๋๋ค.
๋ํ ๊ฐ๋ฐ ์ค์ ์ฝ๋ ๋ณ๊ฒฝ ์ฌํญ์ด ๋์ํ๋์ง ํ์ธํ๊ธฐ ์ํด ์ปจํ
์ด๋ ์ด๋ฏธ์ง๋ฅผ ๊ณ์ ๋น๋ํ๊ฒ ๋๋ฏ๋ก, ์ด๋ ๊ฒ ์ ์ฝ๋๋ ์๊ฐ์ ๋์ ๋์ด ์๋นํ ์ปค์ง๋๋ค.
๋ํ ๊ฐ๋ฐ ์ค์ ์ฝ๋ ๋ณ๊ฒฝ ์ฌํญ์ด ๋์ํ๋์ง ํ์ธํ๊ธฐ ์ํด ์ปจํ
์ด๋ ์ด๋ฏธ์ง๋ฅผ ๊ณ์ ๋น๋ํ๊ฒ ๋๋ฏ๋ก, ์ด๋ ๊ฒ ์ ์ฝ๋๋ ์๊ฐ์ ๋์ค ๋์ด ์๋นํ ์ปค์ง๋๋ค.
๊ทธ ๋ค์ `Dockerfile` ์ ๋๋ถ๋ถ ๊ทผ์ฒ์์ ๋ชจ๋ ์ฝ๋๋ฅผ ๋ณต์ฌํฉ๋๋ค. ์ด ๋ถ๋ถ์ **๊ฐ์ฅ ์์ฃผ ๋ณ๊ฒฝ๋๋** ๋ถ๋ถ์ด๋ฏ๋ก, ๊ฑฐ์ ํญ์ ์ด ๋จ๊ณ ์ดํ์๋ ์บ์๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ถ๋ถ์ ๋ก๋๋ค.
@ -352,7 +352,7 @@ $ docker run -d --name mycontainer -p 80:80 myimage
## ํ์ธํ๊ธฐ { #check -it }
Docker ์ปจํ
์ด๋์ 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 > (๋๋ Docker ํธ์คํธ๋ฅผ ์ฌ์ฉํด ๋๋ฑํ๊ฒ ํ์ธํ ์ ์์ต๋๋ค).
Docker ์ปจํ
์ด๋์ URL์์ ํ์ธํ ์ ์์ด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด: [http://192.168.99.100/items/5?q=somequery ](http://192.168.99.100/items/5?q=somequery ) ๋๋ [http://127.0.0.1/items/5?q=somequery ](http://127.0.0.1/items/5?q=somequery ) (๋๋ Docker ํธ์คํธ๋ฅผ ์ฌ์ฉํด ๋๋ฑํ๊ฒ ํ์ธํ ์ ์์ต๋๋ค).
์๋์ ๊ฐ์ ๊ฒ์ ๋ณด๊ฒ ๋ ๊ฒ์
๋๋ค:
@ -362,17 +362,17 @@ Docker ์ปจํ
์ด๋์ URL์์ ํ์ธํ ์ ์์ด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค
## ์ธํฐ๋ํฐ๋ธ API ๋ฌธ์ { #interactive -api-docs }
์ด์ < 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 > (๋๋ Docker ํธ์คํธ๋ฅผ ์ฌ์ฉํด ๋๋ฑํ๊ฒ ์ ๊ทผ)๋ก ์ด๋ํ ์ ์์ต๋๋ค.
์ด์ [http://192.168.99.100/docs ](http://192.168.99.100/docs ) ๋๋ [http://127.0.0.1/docs ](http://127.0.0.1/docs ) (๋๋ Docker ํธ์คํธ๋ฅผ ์ฌ์ฉํด ๋๋ฑํ๊ฒ ์ ๊ทผ)๋ก ์ด๋ํ ์ ์์ต๋๋ค.
์๋์ผ๋ก ์์ฑ๋ ์ธํฐ๋ํฐ๋ธ API ๋ฌธ์(< a href = "https://github.com/swagger-api/swagger-ui" class = "external-link" target = "_blank" > Swagger UI< / a > ์ ๊ณต)๋ฅผ ๋ณผ ์ ์์ต๋๋ค:
์๋์ผ๋ก ์์ฑ๋ ์ธํฐ๋ํฐ๋ธ API ๋ฌธ์([Swagger UI](https://github.com/swagger-api/swagger-ui) ์ ๊ณต)๋ฅผ ๋ณผ ์ ์์ต๋๋ค:

## ๋์ API ๋ฌธ์ { #alternative -api-docs }
๋ํ < 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 > (๋๋ Docker ํธ์คํธ๋ฅผ ์ฌ์ฉํด ๋๋ฑํ๊ฒ ์ ๊ทผ)๋ก ์ด๋ํ ์๋ ์์ต๋๋ค.
๋ํ [http://192.168.99.100/redoc ](http://192.168.99.100/redoc ) ๋๋ [http://127.0.0.1/redoc ](http://127.0.0.1/redoc ) (๋๋ Docker ํธ์คํธ๋ฅผ ์ฌ์ฉํด ๋๋ฑํ๊ฒ ์ ๊ทผ)๋ก ์ด๋ํ ์๋ ์์ต๋๋ค.
๋์ ์๋ ๋ฌธ์(< a href = "https://github.com/Rebilly/ReDoc" class = "external-link" target = "_blank" > ReDoc< / a > ์ ๊ณต)๋ฅผ ๋ณผ ์ ์์ต๋๋ค:
๋์ ์๋ ๋ฌธ์([ReDoc](https://github.com/Rebilly/ReDoc) ์ ๊ณต)๋ฅผ ๋ณผ ์ ์์ต๋๋ค:

@ -413,7 +413,7 @@ CMD ["fastapi", "run", "main.py", "--port", "80"]
## ๋ฐฐํฌ ๊ฐ๋
{ #deployment -concepts }
์ปจํ
์ด๋ ๊ด์ ์์ ๊ฐ์ [๋ฐฐํฌ ๊ฐ๋
](concepts.md ){.internal-link target=_blank} ๋ค์ ๋ค์ ์ด์ผ๊ธฐํด ๋ด
์๋ค.
์ปจํ
์ด๋ ๊ด์ ์์ ๊ฐ์ [๋ฐฐํฌ ๊ฐ๋
](concepts.md )๋ค์ ๋ค์ ์ด์ผ๊ธฐํด ๋ด
์๋ค.
์ปจํ
์ด๋๋ ์ฃผ๋ก ์ ํ๋ฆฌ์ผ์ด์
์ **๋น๋ ๋ฐ ๋ฐฐํฌ** ๊ณผ์ ์ ๋จ์ํํ๋ ๋๊ตฌ์ด์ง๋ง, ์ด๋ฌํ **๋ฐฐํฌ ๊ฐ๋
**์ ์ฒ๋ฆฌํ๋ ํน์ ์ ๊ทผ ๋ฐฉ์์ ๊ฐ์ ํ์ง๋ ์์ผ๋ฉฐ, ๊ฐ๋ฅํ ์ ๋ต์ ์ฌ๋ฌ ๊ฐ์ง์
๋๋ค.
@ -432,7 +432,7 @@ CMD ["fastapi", "run", "main.py", "--port", "80"]
FastAPI ์ ํ๋ฆฌ์ผ์ด์
์ **์ปจํ
์ด๋ ์ด๋ฏธ์ง** (๊ทธ๋ฆฌ๊ณ ๋์ค์ ์คํ ์ค์ธ **์ปจํ
์ด๋** )์๋ง ์ง์คํ๋ค๋ฉด, HTTPS๋ ๋ณดํต ๋ค๋ฅธ ๋๊ตฌ์ ์ํด **์ธ๋ถ์ ์ผ๋ก** ์ฒ๋ฆฌ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด < a href = "https://traefik.io/" class = "external-link" target = "_blank" > Traefik</ a > ์ ์ฌ์ฉํ๋ ๋ค๋ฅธ ์ปจํ
์ด๋๊ฐ **HTTPS**์ **์ธ์ฆ์**์ **์๋** ํ๋์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด [Traefik ](https://traefik.io/ ) ์ ์ฌ์ฉํ๋ ๋ค๋ฅธ ์ปจํ
์ด๋๊ฐ **HTTPS**์ **์ธ์ฆ์**์ **์๋** ํ๋์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
/// tip | ํ
@ -558,7 +558,7 @@ CMD ["fastapi", "run", "app/main.py", "--port", "80", "--workers", "4"]
/// info | ์ ๋ณด
Kubernetes๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ์ด๋ ์๋ง๋ < a href = "https://kubernetes.io/docs/concepts/workloads/pods/init-containers/" class = "external-link" target = "_blank" > Init Container< / a > ์ผ ๊ฒ์
๋๋ค.
Kubernetes๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ์ด๋ ์๋ง๋ [Init Container ](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/ ) ์ผ ๊ฒ์
๋๋ค.
///
@ -570,7 +570,7 @@ Kubernetes๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ์ด๋ ์๋ง๋ <a href="https://kubernetes.io/d
### ๋ฒ ์ด์ค ๋์ปค ์ด๋ฏธ์ง { #base -docker-image }
๊ณผ๊ฑฐ์๋ ๊ณต์ FastAPI Docker ์ด๋ฏธ์ง๊ฐ ์์์ต๋๋ค: < a href = "https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker" class = "external-link" target = "_blank" > tiangolo/uvicorn-gunicorn-fastapi< / a > . ํ์ง๋ง ์ด์ ๋ deprecated๋์์ต๋๋ค. โ๏ธ
๊ณผ๊ฑฐ์๋ ๊ณต์ FastAPI Docker ์ด๋ฏธ์ง๊ฐ ์์์ต๋๋ค: [tiangolo/uvicorn-gunicorn-fastapi ](https://github.com/tiangolo/uvicorn-gunicorn-fastapi-docker ) . ํ์ง๋ง ์ด์ ๋ deprecated๋์์ต๋๋ค. โ๏ธ
์๋ง๋ ์ด ๋ฒ ์ด์ค ๋์ปค ์ด๋ฏธ์ง(๋๋ ์ ์ฌํ ๋ค๋ฅธ ์ด๋ฏธ์ง)๋ **์ฌ์ฉํ์ง ์๋** ๊ฒ์ด ์ข์ต๋๋ค.
@ -600,7 +600,7 @@ Kubernetes๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ์ด๋ ์๋ง๋ <a href="https://kubernetes.io/d
## `uv` ๋ฅผ ์ฌ์ฉํ๋ ๋์ปค ์ด๋ฏธ์ง { #docker -image-with-uv }
ํ๋ก์ ํธ๋ฅผ ์ค์นํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํด < a href = "https://github.com/astral-sh/uv" class = "external-link" target = "_blank" > uv< / a > ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, < a href = "https://docs.astral.sh/uv/guides/integration/docker/" class = "external-link" target = "_blank" > uv Docker guide< / a > ๋ฅผ ๋ฐ๋ฅผ ์ ์์ต๋๋ค.
ํ๋ก์ ํธ๋ฅผ ์ค์นํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํด [uv ](https://github.com/astral-sh/uv )๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, [uv Docker guide ](https://docs.astral.sh/uv/guides/integration/docker/ ) ๋ฅผ ๋ฐ๋ฅผ ์ ์์ต๋๋ค.
## ์์ฝ { #recap }