Thứ Sáu, 25 tháng 8, 2017

Docker cho người mới bắt đầu (P1)

Đây là bài viết đầu tiên trong loạt bài viết về Docker của mình, mời các bạn đón đọc.

Người người docker, nhà nhà docker

Thời gian gần đây, docker là cụm từ được nhắc đến rất nhiều.
Là một lập trình viên trẻ, trâu, ưa tìm tòi, khám phá cái mới, mình cũng xông pha xem dockergiúp được gì cho 1 cậu lập trình viên như mình.
Sau một thời gian tìm hiểu và dùng thử, mình thấy, ờ, nó hữu ích cho mình thật, đặc biệt là 1 server developer.
Trước khi xem nó giúp ích được gì cho mình, mình muốn ôn lại lịch sử một chút.

The history

Ngày xưa, mô hình máy chủ thường là 1 máy chủ vật lý + 1 hệ điều hành (OS) + 1 application.
server1
Khi ứng dụng phát triển lên, mô hình này nảy sinh ra nhiều vấn đề, ví dụ:
– Lãng phí tài nguyên: mặc dù cấu hình máy thuộc dạng khủng, ổ cứng vi vu, nhưng hệ thống lại không tận dụng được hết lợi thế này.
– Khó khăn trong việc mở rộng hệ thống: muốn mở rộng bạn phải thuê thêm server, rồi thì cấu hình, rồi thì cân bằng tải (load balacing), blah blah. Phew!
Lúc này, công nghệ ảo hóa (vitualization) ra đời.
Ảo hóa
Ảo hóa
Với công nghệ ảo hóa, trên cùng 1 máy chủ vật lý, mình có thể tạo ra nhiều OS, tức là sẽ chạy được nhiều application. Vậy là tài nguyên của máy được tận dụng tốt hơn. Tuy nhiên, việc ảo hóa này lại nảy sinh vấn đề mới:
– Ngốn tài nguyên: khi chạy 1 máy ảo, nó sẽ luôn chiếm 1 phần tài nguyên cố định. Vd: máy chủ bạn có 512GB SSD, 16GB RAM (hàng khủng :v). Bạn tạo ra 4 máy ảo Linux, mỗi máy bạn cấp 64GB SSD và 2GB RAM. Như vậy, bạn sẽ mất 256 GB SSD để chứa 4 máy ảo, và khi chạy cùng 4 máy ảo lên cùng lúc, chúng sẽ chiếm 8GB RAM. Mặc dù chỉ chạy lên để không đó thôi, chưa dùng gì cả nhưng nó vẫn chiếm từng đó.
– Tốn thời gian thực thi: thời gian khởi động, shutdown của các máy ảo sẽ lâu, thường là hàng phút lận.
– Cồng kềnh: rõ ràng, việc phải gánh cho cả 1 team như vậy thì cái server của bạn không thế chạy hết hiệu suất được.
Bước tiến hóa tiếp theo, người ta phát minh ra containerlization (từ này mình không dịch được nên để nguyên luôn :P)
Containerlization
Containerlization
Với công nghệ này, trên một máy chủ, ta sẽ sinh ra được nhiều máy con (giống với ảo hóa), nhưng điều đặc biệt là các máy con (Guess OS) này đều dùng chung phần nhân của máy mẹ (host OS) và chia sẻ với nhau tài nguyên của máy mẹ (RAM chẳng hạn). Như vậy việc tận dụng tài nguyên sẽ được tối ưu hơn.
Ngoài ra, việc sử dụng hệ thống file cắt lớp (layer file system) sẽ khiến việc tối ưu tài nguyên hiệu quả hơn.
Hệ thống file cắt lớp
Hệ thống file cắt lớp
Cụ thể, mỗi máy con (container) mới, nó sẽ được xây dựng dựa trên 1 file ảnh (image) dạng chỉ đọc (read-only). Trong mỗi máy con sẽ có thêm 1 lớp bọc có-thể-ghi-được (writabe-layer), các thay đổi trong máy con sẽ được ghi lên đây. Như vậy, từ 1 image ban đầu, ta có thể tạo nhiều máy con mà chỉ tốn rất ít dung lượng ổ đĩa.
Nghe có vẻ hay đấy, vậy Dockergiúp được gì cho anh server dev như tôi nào?

Docker làm được gì

Docker làm được rất nhiều việc, nhưng trong phạm vi loạt bài viết này, mình chỉ giới thiệu những tính năng mà nó thực sự giúp ích cho 1 anh server dev thôi.

Giả lập môi trường trên server ở dưới máy local

Một trong những ác mộng của server dev là code chạy dưới local thì ngon lành cành đào, nhưng khi deploy dự án lên server thì…tạch. Nguyên nhân đa phần là do sự khác nhau về môi trường giữa local và server (local chạy Ubuntu, server chạy CentOS chẳng hạn, hay server chạy Ruby 2.2.3 trong khi local chạy Ruby 2.3).
Với Docker, ta có thể tạo ra một môi trường y hệt như trên server và chạy thử chương trình ở đó.

Dùng thử một hệ điều hành mới

Cái này thì khá rõ ràng rồi, máy bạn chạy Ubuntu, bạn muốn thử với CentOS xem thế nào, Docker là giải pháp tuyệt vời.

Trải nghiệm một môi trường lập trình mới

Giả sử bạn đang nghe người người nhà nhà nói về Golang, và bạn muốn cài và thử, nhưng việc cài ngay trên máy mình sẽ ảnh hưởng đến môi trường hiện tại của bạn, lại còn tốn ổ đĩa nữa, vọc xong thì không biết đã cài những gì để xóa đi.
Bạn tạo 1 Docker container sau đó thử thiếc, check hàng đã đời trong đó, xong nếu không muốn nữa thì chỉ việc xóa Container đó đi. Xong. Xó sạch mọi dấu vết 😀

Chia sẻ môi trường lập trình cho nhóm làm việc

Khi bạn tạo ra một container với môi trường thuận lợi cho một dự án rồi, bạn có thể chia sẻ dễ dàng cho các thành viên khác trong nhóm. Từ đó, họ sẽ tiết kiệm được kha khá thời gian trong việc cài đặt môi trường.

Test song song

Có những automation test khá là nặng và tốn thời gian (như việc tương tác mạng, upload, download chẳng hạn), nếu chạy test trên 1 máy thì sẽ rất tốn thời gian.
Ta tạo ra nhiều Container giống nhau (việc tạo này cực kỳ đơn giản vì nó dùng chung 1 file gốc – Image), sau đó chi task ra cho chúng thực hiện cùng 1 lúc => tiết kiệm được thời gian và tận dụng được tài nguyên của server (hoặc của máy mình).

Test app trên một hệ điều hành khác

Giả sử bạn viết 1 ruby gem, nó chạy tốt trên Ubuntu, nhưng còn các môi trường khác thì sao? Ta không thể cài hay đi mượn cho đủ các môi trường đó được. Hãy để Docker giúp 😛

Thử cấu hình cân bằng tải

Để học về cân bằng tải, trước kia ta phải có ít nhất 2 server, xong rồi mới tính tới chuyện cấu hình, testing cân bằng tải được.
Với Docker, ta tạo ra được nhiều máy thì nó chính là những con server của mình rồi, tha hồ thử mà không sợ tốn tiền 😛

Thử các tool auto deployment

Docker container nó là 1 cái máy mà, cũng có IP, cũng có mọi thông số như một con server, nên thay vì bỏ tiền thuê server thì mình có thể deploy thẳng vào container của mình 😀

Và còn nhiều, nhiều nữa

Đang chờ bạn khám phá thêm 😛
Bài viết này, mình đưa đến một cái nhìn đầu tiên về Docker và những lợi ích mà nó có thể đem lại cho chúng ta. Bài viết tiếp theo, mình sẽ giới thiệu về các thành phần của Docker và cách cài đặt cũng như những bước chào hỏi, làm quen đầu tiên với Docker. Mời các bạn đón đọc 😀

Không có nhận xét nào:

Đăng nhận xét