FastAPI: triển khai bằng Docker
Tiếp theo bài giới thiệu FastAPI, Fullstack Station tiếp tục với triển khai FastAPI bằng Docker. Nhiệm vụ này khá đơn giản và nhanh chóng nhưng mang lại hiệu quả rất lớn.
Nội dung chính
Cấu trúc thư mục
Giả sử chúng ta có cấu trúc thư mục như sau:
.
├── Dockerfile
├── app
│ ├── db.py
│ └── main.py
├── requirements.txt
├── test.db #RISKY, đừng bao giờ lưu trữ dữ liệu trong container.
Với nội dung của Dockerfile như sau:
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.7
COPY requirements.txt /app/requirements.txt
WORKDIR /app
RUN pip install -r requirements.txt
COPY ./app /app
Ở đây, bạn chú ý file requirements.txt
được tách riêng COPY trước, mục đích là để Docker không cần phải build lại layer này nếu không có gì thay đổi. Như vậy, Docker sẽ tận dụng lại cache của các layer cũ và việc build sẽ nhanh hơn rất nhiều. (Tham khảo tại đây). File requirements.txt sẽ chứa các package được sử dụng trong api.
Thực hiện build image
Phần này đơn giản thôi, sau khi đã có Dockerfile
rồi, thì tiến hành build image với lệnh:
docker build -t test-fastapi-image .
Việc build khá nhanh, tuy nhiên phần image gốc nặng gần 1Gb nên nếu mạng chậm bạn phải chờ 1 chút.
Tiến hành thực thi
Sau khi build xong nếu không có vấn đề gì thì chạy thử xem nhé:
docker run -d --name my-fastapi-container -p 8000:80 test-fastapi-image
Ở đây mình map port 8000 (máy chủ) vào port 80 (của container), sau đó máy chủ sẽ dùng nginx như 1 proxy chuyển request vào container.
Với lệnh trên thành công, chúng ta truy cập tại địa chỉ IP của “máy chủ” ví dụ 127.0.0.1:8000 sẽ có kết quả của API như việc chạy ở bước development uvicorn main:app --reload
, hoặc các tài liệu tương tác trực quan như http://127.0.0.1:8000/docs
hay http://127.0.0.1:8000/redocs
. Điểm quan trọng là chúng ta đã build thành công docker cho api, việc tiếp theo sẽ đưa image lên môi trường production. Việc đưa image lên production có nhiều cách và sẽ được nói trong một bài viết khác.
Fullstack Station Tips
- Phần docker cho FastAPI được làm rất tốt, nên việc deploy sau này sẽ rất dễ dàng, chỉ đơn giản là lặp lại các thao tác build, deploy mà không cần phải quan tâm các phần khác như sử dụng hypercorn hay unicorn, bao nhiêu workers…
- Nhiều bạn hay sử dụng
pip freeze > requirements.txt
để tạo file “requirements.txt”, đây là cách không đúng vì các package dùng cho quá trình development khác với production, không dùng chung. Thường sẽ cóbase.txt
cho các package chung và các môi trường khác nhau nhưlocal.txt
,production.txt
.
Khách
5