12/08/2018, 13:43

Tại sao nên đưa Docker làm chuẩn khi phát triển

1. Nguồn 開発におけるDocker導入のメリット 2. Động cơ Docker hiện đã là một tool rất nổi tiếng tuy nhiên việc có đủ dũng khí để đưa vào 1 dự án thật, tác động và khuyên khách hàng sử dụng nó chưa bao giờ dễ dàng (nhất là tại các dự án khách hàng không có đội tech lead thật trình độ). Thông qua bài viết ...

1. Nguồn

開発におけるDocker導入のメリット

2. Động cơ

Docker hiện đã là một tool rất nổi tiếng tuy nhiên việc có đủ dũng khí để đưa vào 1 dự án thật, tác động và khuyên khách hàng sử dụng nó chưa bao giờ dễ dàng (nhất là tại các dự án khách hàng không có đội tech lead thật trình độ). Thông qua bài viết này, mong nó sẽ là một tài liệu để mọi người tham khảo, nhận ra các risk cũng như merit nó sẽ mang lại dự án, từ đó mạnh dạn áp dụng docker.

3. Bài viết

Có thể nhiều người cho rằng nói về ưu và nhược điểm của Docker đã quá nhàm rồi, tuy nhiên mặc dù các bạn hay thấy các bài viết so sánh với các kỹ thuật ảo hoá khác thì thực tế ưu và nhược điểm khi vận dụng nó vào trong quá trình phát triển thực tế lại không được nêu rõ, bài viết này là cảm nhận của cá nhân tôi sau một thời gian dài sử dụng.

3.1 Ưu điểm

  • Tính đồng nhất
    • Khi nhiều người cùng phát triển trong cùng một dự án sẽ không bị sự sai khác về mặt môi trường.
  • Đóng gói
    • Có thể ẩn môi trường bao gồm cả app vào trong một gói được gọi là container.
    • Có thể test được các container.
    • Việc bỏ hay tạo lại container rất dễ dàng.
  • Linh động (tính nhất quán)
    • Có thể test container được dùng để phát triển bằng CI.
    • Có thể deploy container đã được test bằng CI lên server.
    • Có thể scale container đã được deploy.

3.2. Những sự mệt mỏi có thể phòng tránh được bằng Docker

  • Chạy được ở môi trường của tôi rồi mà

    Chuẩn luôn.

    Sử dụng docker sẽ giúp cho tất cả developer được phát triển cùng trên một môi trường giống hệt nhau.

  • Test tại local thì được nhưng lại fail với CI.

    Do môi trường test và phát triển giống nhau nên sẽ phòng được trường hợp này.

  • Thất bại khi chạy bundle install hay npm install dẫn tới việc test bị fail

    Có thể phòng tránh bằng việc test bằng các image đã fetch thành công các library liên quan.

  • Mặc dù không thay đổi code tí gì cơ mà hoạt động của app lại bị sai khác. Hoạt động của các library được lấy về bằng go get đã bị thay đổi từ lúc nào không hay

    Có thể cố định version bằng cách chia sẻ các image đã fetch library liên quan.

  • Tôi muốn thay đổi cài đặt của nginx. SSH key để login vào server là cái nào nhỉ

    Vì các bạn có thể kiểm tra hoạt động mà mình đã cài đặt ngay lập tức và nếu OK có thể deploy docker image đó, cho nên việc login vào server để thay đổi cài đặt trở nên không cần thiết nữa.

    Hơn nữa, hoàn toàn có thể test blackbox xem việc cài đặt đã chuẩn hay chưa.

Đây chỉ là một vài ví dụ, tuy nhiên cũng cho thấy Docker có ích thế nào khi giúp các bạn giải quyết những vấn đề bên lề và nhiều khi rất mất thời gian bên cạnh việc phát triển.

3.3. Nhược điểm

  • Tốn thời gian học tập

    • Đoạn đầu (chạy 1 container) sẽ khá thoải mái và cảm thấy như làm chủ cả thế giới, tuy nhiên các bạn sẽ nhanh chóng gặp khá nhiều vấn đề khi thực tế áp dụng nó vào môi trường phát triển, những câu hỏi như "đoạn này làm thế nào nhỉ?", hay "không biết cài đặt bằng cách nào thì tốt hơn nhỉ?".. sẽ xuất hiện và đòi hỏi kiến thức chuyên sâu.

    • Trong một đội phát triển không cần tất cả phải có kiến thức chuyên sâu về Docker, tuy nhiên ít nhất cũng cần một người nắm vững những kiến thức để có thể giải quyết được vấn đề nếu gặp phải.

  • Công cần thiết để biết viết code tại một môi trường gần như không kém hơn so với phát triển trên local.

3.4. Những hạn chế sinh ra bởi nhược điểm

  • Học cách tạo một image tốt
    • Jonathan Bergknoff: Building Good Docker Images
    • Dockerfile Best practise (tạm thời) - Qoosky
  • "Phải login vào container mới viết code được đúng không"
    • "Do host và volume của container có thể chia sẻ lẫn nhau nên bạn sẽ được viết code trên text editor mà mình yêu thích"
  • "Networking giữa các container có vẻ phiền phức lắm"
    • "(Docker Compose|Tutum|Kubernetes) sẽ làm việc đó giúp bạn đấy"
  • Cái nào tốt hơn docker build --build-arg FOO=bar+ARG+ENV hay docker run --env FOO=bar?
    • Tuỳ trường hợp thôi. Nếu bạn ưu tiên việc đống gói thì sẽ là cái thứ nhất, tuy nhiên nếu tính nhất quán mới quan trọng với bạn thì sẽ là cái thứ 2.
  • Cái nào tốt hơn docker run --volume /host/dir:/container/dir hay docker run --volume /container/dir?
    • Tuỳ trường hợp luôn. Khi phát triển, nếu mục đích là cần share giữa directory của host và volume hay đảm bảo tính vĩnh viễn cho data thì sẽ là cái thứ nhất, còn nếu muốn chia sẻ giữa các container khác và volume sẽ là cái thứ 2.

Dù chỉ là chút ví dụ thôi, tuy nhiên các bạn cũng nên nắm rõ sẽ phát sinh công để học và hiểu những thứ như trên, tuỳ trường hợp có thể dẫn tới sự gián đoạn khi phát triển.

3.5. Những service bên cạnh tạo nên ưu điểm cho Docker

Service chia sẻ image

Khi phát triển trên nhiều môi trường, bạn cần một service có thể chia sẻ image giúp bảo đảm tính đồng nhất.

  • Docker Hub: Service host và build image
    • Pricing | Docker
  • Google Container Registry: Service host image
    • Giúp lưu image và tag vào Google Cloud Storage.
    • Chi phí sẽ bao gồm phí sử dụng Google Cloud Storage và lượng data truyền tải.
    • Do image sẽ được build bởi CI cho nên nếu các bạn chỉ muốn host mà thôi sẽ rất rẻ.

Ngoài ra còn rất nhiều thứ khác nữa: Chọn Docker Register dựa trên việc nhìn thấu quá trình vận hành Production - Qiita

CI service

Vận dụng tính linh động, đây là những service test môi trường giống với môi trường của container được sử dụng khi phát triển.

  • CircleCI: Docker support
    • Do có hệ thống cache cho nên có thể cache image đã build và chỉ build khi có sự thay đổi.
    • Follow up version mới nhất

Service vận hành server của nhiều container

Service phát huy tính linh động để deploy image lên server và khởi động giúp chúng ta.

  • Tutum: Service liên kết với các loại IaaS (Infra as a service), có thể build - deploy - quản lý nhiều container.
    • Kể cả với các Iaas không liên kết đi chăng nữa, nó vẫn setup được cho chúng ta bằng việc cài đặt thông tin login qua SSH.
    • Về chi phí sẽ phụ thuộc vào các IaaS. Dịch vụ này cho tới ngày 14 tháng 1 năm 2016 vẫn đang miễn phí với bản β.
    • Việc setup rất đơn giản và công học cũng không nhiều.
  • Google Container Engine: Service setup Kubernetes tại Google Compute Engine.
    • Clustering (kỹ thuật tổng hợp nhiều server để nâng cao năng lực xử lý như một hệ thống thống nhất, phòng tránh việc service bị ngừng) nhiều node thành 1 platform.
    • App tương tác với nhiều container dưới đơn vị pod, thực hiện replication , quản lý xử lý chết, auto scaling, rolling update.
    • Do có thể deploy nhiều service trong cluster đã được cấu trúc, trong các trường hợp dựng nhiều service thì tuỳ lúc có thể giảm thiểu được chi phí.
    • Các thứ khác có lợi từ Google Cloud Platform
    • Chi phí phụ thuộc vào giá của Google Compute Engine. Nếu clustering quá 6 node sẽ phát sinh giá riêng.
    • Mất rất nhiều công để học nếu muốn vận hành thực tiễn.

3.6. Về việc áp dụng Docker

Với việc có thể hạn chế tới mức tối đa công sức cho những thứ không thuộc bản chất của việc phát triển, bạn sẽ rất ngạc nhiên với hiệu quả không ngờ của nó tới chính trái tim và tâm trí của mình khi làm việc. Ngoài ra, việc có thể đảm bảo được tính nhất quán trong vận hành môi trường production, bạn sẽ có thể yên tâm khi những gì bạn đã test thành công cũng được áp dụng trên production. Về vấn đề công sức cần bỏ ra để học kỹ thuật mới này, hãy nghĩ rằng nó chỉ đau một lần rồi thôi, sau khi trải qua dự án bạn sẽ được trang bị hầu hết những thứ để đưa dự án sau tới thành công. Tuy vậy, việc áp dụng Docker vào dự án hay không vẫn phụ thuộc nhiều vào team phát triển và product cuối cùng ra sao, khi ưu điểm nhiều hơn nhược điểm thì có gì cần ngại ngùng đâu đúng không?

Hãy đưa vào dự án một cách có kế hoạch.

0