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.

Cấu trúc thư mục

Giả sử chúng ta có cấu trúc thư mục như sau:

Với nội dung của Dockerfile như sau:

Ở đâ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:

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é:

Ở đâ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.

Comments