Ứng dụng Docker trong lập trình

 


Docker là gì ?

Docker là một nền tảng cho developers và sysadmin để develop, deploy và run application với container. Nó cho phép tạo các môi trường độc lập và tách biệt để khởi chạy và phát triển ứng dụng và môi trường này được gọi là container. Khi cần deploy lên bất kỳ server nào chỉ cần run container của Docker thì application của bạn sẽ được khởi chạy ngay lập tức.

Tại sao phải dùng docker ?



  • Môi trường nhất quán (Consistent environments):
    •  Docker cho phép bạn xác định các môi trường phát triển nhất quán bao gồm mọi thứ cần thiết để chạy một ứng dụng, đảm bảo sự tương đồng giữa phát triển (development), giai đoạn trung gian(staging) và sản xuất (production). Điều này làm cho việc tái tạo lỗi và kiểm tra trong môi trường giống hệt sản xuất trở nên dễ dàng hơn.
  • Cô lập các dependencies (Isolated dependencies): 
    • Docker cô lập các phụ thuộc và cấu hình cho mỗi dự án, đảm bảo việc thêm hoặc cập nhật một phụ thuộc sẽ không ảnh hưởng đến các dự án khác sử dụng các phiên bản khác nhau. Điều này làm cho việc làm việc trên nhiều dự án mà không gặp xung đột phiên bản trở nên dễ dàng hơn.
  • Đơn giản hoá tiếp cận (Streamlined onboarding):
    • Các thành viên mới trong nhóm có thể chạy một dự án với một lệnh docker run đơn giản, mà không cần lo lắng về các phụ thuộc đã cài đặt hoặc cấu hình trên máy local của họ. Điều này làm cho quá trình làm quen dự án nhanh hơn.
  • Khả năng di động tăng lên (Increased portability):
    • Các image Docker có thể chạy trên bất kỳ máy nào hỗ trợ container, cho dù là locally, trên máy chủ của công ty, hoặc trên cloud. Sự di động này đơn giản hóa việc phát triển và triển khai đến các môi trường khác nhau.
  • Nhẹ  (Lightweight):
    • Các container chia sẻ kernel hệ thống chủ và không yêu cầu một hệ điều hành khách đầy đủ, cho phép bạn chạy nhiều container hơn bằng ít tài nguyên hơn so với máy ảo. Điều này cho phép khởi tạo môi trường phát triển nhanh hơn và rẻ hơn.
  • Môi trường có thể vứt bỏ (Disposable environments):
    • Container có thể được xóa và tạo lại dễ dàng mà không cần lo lắng về ảnh hưởng đến trạng thái của máy chủ. Điều này khuyến khích sử dụng container tạm thời cho mỗi nhánh tính năng trong quá trình phát triển.
  • Triển khai nhất quán (Consistent deployments):
    • Bạn có thể xác định cấu hình ứng dụng của mình một lần bằng Dockerfile và Compose file, và có thể tự tin rằng môi trường của bạn sẽ triển khai nhất quán đến giai đoạn trung gian và sản xuất.

Thuật ngữ 


Đây là giải thích cho một số thuật ngữ thường gặp trong Docker:


  • Image: Một image Docker chứa mã nguồn ứng dụng và các phụ thuộc cần thiết để chạy ứng dụng. Image là đơn vị cơ bản để phân phối và chia sẻ ứng dụng trong Docker.
  • Container: Container được khởi tạo từ image và chứa mã nguồn thực thi cùng môi trường chạy tách biệt. Nhiều container có thể chạy từ cùng một image.
  • Dockerfile: Đây là tập tin chứa các lệnh để tạo một image Docker. Dockerfile cho phép tự động hóa quá trình tạo image.
  • Docker Hub: Đây là kho lưu trữ công cộng lớn nhất chứa các image Docker để download và sử dụng.
  • Docker Compose: Công cụ dùng để định nghĩa và khởi chạy multi-container Docker applications. Compose file định nghĩa các dịch vụ cần khởi chạy.
  • Docker Swarm: Giải pháp clustering và scheduling containers. Cho phép quản lý nhiều Docker hosts và khởi chạy containers trên cụm Docker hosts.
  • Docker Volume: Dùng để lưu trữ dữ liệu bền vững cho containers, độc lập với vòng đời của container.
  • Docker Network: Cho phép giao tiếp giữa các container đang chạy trên cùng Docker host hoặc giữa các host khác nhau.

Đó là các khái niệm cơ bản về Docker mà bạn cần biết.


    Ví dụ về quy trình triển khai dự án bằng docker


    1. Các developer viết code ứng dụng và đặt trong một Git repository. Họ cũng viết Dockerfile để định nghĩa cách build image.
    2. Khi code mới được commit vào Git, quy trình CI/CD sẽ được kích hoạt tự động. CI server sẽ pull code mới về và build Docker image dựa trên Dockerfile.
    3. Docker image được tag với git commit hash và push lên Docker registry. Điều này tạo ra một bản ghi của mọi image đã build.
    4. Docker image mới được deploy lên môi trường staging bằng cách pull từ Docker registry về và chạy container.
    5. Các tester sẽ kiểm tra ứng dụng trên staging, chạy các test tự động và integration test. Nếu mọi thứ đều ok, image sẽ được deploy lên production.
    6. Để deploy lên production, CI/CD sẽ định tuyến traffic sang một nhóm container mới. Khi container mới ổn định, traffic sẽ được chuyển hoàn toàn sang nhóm container mới.
    7. Quá trình này lặp lại mỗi lần có code mới. Docker giúp quy trình tự động hóa, nhanh chóng và nhất quán.

    Quy trình docker cơ bản

    Một số vấn đề khi triển khai docker



    • Khó khăn khi migrate các ứng dụng legacy sang Docker, đặc biệt là các ứng dụng monolithic. Cần phân tách thành các dịch vụ nhỏ hơn để đóng gói trong Docker.
    • Sử dụng các image không chính thức hoặc không rõ nguồn gốc có thể dẫn tới các lỗ hổng bảo mật. Nên sử dụng các image đáng tin cậy từ các nguồn uy tín.
    • Quản lý credentials và các biến môi trường nhạy cảm trong Docker là thách thức. Cần sử dụng các công cụ quản lý secrets tích hợp.
    • Các container stateless khiến việc ghi logs, metrics, telemetry trở nên khó khăn hơn. Cần có giải pháp logging tập trung và cơ chế tracking.
    • Sử dụng các volumes để persist dữ liệu có thể gây ra vấn đề hiệu năng nếu không được tối ưu đúng cách.
    • Networking giữa các container và container-to-host là phức tạp, dễ expose các cổng không an toàn hoặc lỗi cấu hình.
    • Quản lý nhiều container và image là thách thức. Cần công cụ giám sát và cơ chế cleanup thường xuyên.
    • Việc triển khai và rollback có thể phức tạp khi có nhiều services và dependencies. Cần tự động hóa quy trình bằng CI/CD pipeline.

    Đăng nhận xét

    Mới hơn Cũ hơn