Sử dụng python với docker

Sử dụng python với docker

Docker

What ?
Docker là một open platform cung cấp cho người sử dụng những công cụ và service để người sử dụng có thể đóng gói và chạy chương trình của mình trên các môi trường khác nhau một cách nhanh nhất.
For what?
- Dùng để triển khai một ứng dụng (website bằng php, python, java...) lên server (server thật hoặc vps) một cách nhanh chóng.
- Tại sao lại dùng vps thay vì shared host trong khi shared host giá rất rẻ, vps thì chat hơn:
+  Lưu lượng truy cập lớn
+  Bảo mất và độ ổn định
+ Kiểm soát tốt hơn, quyền quản trị (root)
- Nếu bạn dùng shared host thì hôi, không cần quan tâm đến docker.
- Vps thì nên là linux vì: Rẻ hơn window, nhẹ hơn window...Hỗ trợ docker tốt hơn window…
- Triển khai các ứng dụng khác một cách nhanh chóng, ví dụ như triển khai wordpress trong 1 dòng lệnh, triển khai odoo crm nhanh không kém...Và hàng ngàn ứng dụng khác có sẵn trên docker hub.
How ?
Trong bài này sẽ đưa ra một hướng dẫn để triển khai một ứng dụng web bằng python lên server linux sử dụng docker và docker compose.
Cài đặt docker trên ubuntu:
Cài đặt docker-compose:

Python với docker

Cấu trúc thư mục và code mẫu

Chức năng các file như sau:
Index.html
Chứa code html của trang web
Server.py
Chứa code python để cung cấp các endpoint
Dòng 12: Endpoint '/' sẽ trả về html của trang index.
Dockerfile
File này dùng để tạo ra một image(hình dung giống như một máy ảo cài sẵn các phần mềm để chạy một website).
Dòng 1: Image này dựa trên một image có sẵn là python 3.6
Dòng 5,6: Copy file requirements.txt vào image và build, Nên copy file này trước khi copy của source code vào để khi build docker thì layer này sẽ được cache lại, giúp quá trình build nhanh hơn.
Dòng 9: Copy toàn bộ source code vào trong image
Dòng 11: Khi start container thì sẽ chạy lệnh này (di chuyển đến thư mục code, và chạy lệnh python3 server.py)
Khi build sẽ ra một image cài đặt sẵn python3.6 và source code của ứng dụng ta vừa viết.
Requirements.txt
Đơn giản là chứa thư viện flask (là một webframework trong python)
Khi build dockerfile, ở dòng thứ 6 sẽ dùng pip (trình quản lý gói trong python) để cài đặt các gói liệt kê trong file này.
Docker-compose.yml
Chứa cấu hình cho service websample.
dòng 6: Hiểu như working dir là ở thư mục chứa file docker-compose.yml
dòng 7: Đường dẫn đến dockerfile tính từ working dir ở trên
dòng 9: Map port 14000 trên máy host vào port 14000 trong container, vì code python mở port 14000.

Build và up ứng dụng

Build
Di chuyển đến thư mục chứa docker-compose.yml
sau khi build xong, nếu không có lỗi xảy ra thì ta sẽ sẽ được một image tên là web_sample:latest
Up
Sau khi build xong rồi, gõ lệnh
Nếu hiện như trên là đã start thành công, Kiểm tra trên trình duyệt:
Done.

Một số lưu ý

- Trong demo này sử dụng cổng 14000, nếu trên server thì phải dùng cổng 80. Khi đó chỉ cần sửa trong file docker-compose.yml, 80:14000
- Nếu cần binding https thì có thể dùng certbot+nginx. Tham khảo thêm ở https://medium.com/@pentacent/nginx-and-lets-encrypt-with-docker-in-less-than-5-minutes-b4b8a60d3a71
- Đây chỉ demo làm một web bằng python đơn giản, tất nhiên là có thể làm bằng rất nhiều ngôn ngữ khác như java, php,... Và điểm thú vị ở đây là khi triển khai thì không khác nhau là mấy vì đã sử dụng docker.
- Nếu bạn muốn sử dụng wordpress thì chỉ bỏ hết các thứ bên trên đi. chỉ cần tạo một file docker-compose.yml như sau: (tham khảo tại https://docs.docker.com/compose/wordpress/)
Và chạy lệnh docker-compose up là xong.
Docker sẽ làm cho cuộc sống đơn giản hơn.

Tóm lại

Docker là một giải pháp tuyệt vời, Nó đã tạo nên một trào lưu trong làng công nghệ, làm cho microsoft phải dần chuyển hướng. Và chúng ta (nếu bạn là một dev hoặc ko phải dev nhưng vẫn lập trình) nên làm chủ được nó.