Trước khi vào chủ đề Docker là gì thì cho tôi kể cho anh em nghe 1 câu chuyện ma =)).
Hôm nay tôi mới được giao cho 1 dự án code java spring, với 1 thằng chưa được code dự án spring nào như tôi thì chẳng khác nào đang đói vớ được bánh mì, đang đêm gió rét lại có mì tôm ăn =)). Nhưng cuộc sống đếch giống cuộc đời các ông ạ, Vừa vào dự án tôi bật ngay file readme lên xem có gì hay ho thì chao ôi trang giấy trắng của Phạm Trưởng luôn.
Khi này bắt đầu hoang mang rồi, tiếp tục vào file POM thì trời đất ơi, cả trăm dependence luôn mà không 1 thông tin về môi trường, thư viện, version => kết quả là tôi mất ngày rưỡi mới cài xong môi trường :v, xong kiểu công ty tôi mới, 1 phòng độc có 2 ông code hà, 1 mình 1 dự án mà còn là công nghệ lần đầu đụng vào nên mếu biết cần cài cái gì, version nào =)).
Thế là lúc đó tôi mới nghĩ, giá mà ông anh code trước dựng trên docker có phải mình đỡ cực không. Thế là tôi quyết định dựng lại môi trường trên docker, vừa để sau này thằng tiếp nhận dự án này của tôi nó không khổ như mình hôm nay, vừa có cái để viết blog =). Sau bài này tôi sẽ có 1 bài về cách setup spring boot trên docker luôn. Nhân cái tiện tôi tự học spring thì cũng ham hố viết cho nhanh nhớ :v.
Về Docker thì theo ý kiến cá nhân mình thì docker không chỉ là 1 công nghệ, mà nó còn là tương lai mà rất rất lâu sau không có công nghệ nào có thể thay thế được, Còn Docker có gì mà lại xịn xò như thế thì cùng mình tìm hiểu seri về docker này nhé.
Seri này thì mình dự kiến sẽ chia làm 5 bài:
- Docker là gì? 3 giai đoạn phát triển của công nghệ ảo hóa
- Docker hoạt động như thế nào
- Cách cài đặt và các lệnh docker cơ bản
- Dựng môi trường spring boot trên docker
- Dựng môi trường laravel – vuejs trên docker
Vì sao lại là Docker?
Vậy tại sao mình lại quyết định dựng lại trên docker? cùng thử hình dung 1 ngày đẹp trời thì ông sếp cho join 1 dự án mới, với tâm thế hào hứng ngút trời, tràn đầy nhiệt huyết, sẵn sàng khô máu với bất cứ đứa nào cản đường.
Xong bạn chui vào readme file đọc thì ối dồi ôi dài như 1 quyển kinh thư, nào là npm, mvn, redis, mysql, apache…bla bla Mỗi 1 cái lại cả 1 đống thư viện xong 1 đống version khác nhau. Khốn nạn nhất là bản mình đã cài từ trước trong máy lại không đúng phiên bản với project =)) thế là lại hì hục gỡ phiên bản cũ cài lại đúng version hahahaha.
Đã đến lúc ta cần 1 đấng cứu thế có thể cứu vớt chúng sanh, dìu dắt ta qua nỗi ám ảnh này. Vâng chính là Docker, chỉ cần vài dòng đã có thể tạo 1 môi trường ảo hóa đầy đủ các công nghệ cần dùng cho dự án, không chỉ vậy môi trường này còn biết thuật “đa trùng ảnh phân thân” của naruto, muốn nhân bản bao nhiêu cũng được, dự án có người mới join vào thì ta chỉ cần phân thân thêm 1 cái và ném cho hắn. Và rồi cạch cạch cạch, cài môi trường trong vòng 5 phút.
Đương nhiên công dụng của docker không chỉ dừng lại ở đó, sẽ không ngoa khi nói Docker là cả 1 tương lai tươi sáng, cả 1 hệ tư tưởng và là Legacy. Dù là 5 năm sau, 10 năm sau thì người ta vẫn dùng docker thôi :v . Các cậu có cu à nhầm các cụ có câu muốn tán gái thì phải điều tra gia phả nhà n trước =)). Muốn chinh phục được Docker này thì cùng tìm hiểu xuất thân của con nhà trâm anh thế phiệt này nhé.
Lịch sử hình thành
Có thể chia công nghệ ảo hóa này thành 3 giai đoạn, Mỗi giai đoạn lại mang 1 hình thái riêng biệt và phát triển vượt bậc qua từng thời kì:
Giai đoạn 1 – Thời tiền sử:
Chuyện kể rằng ngày xửa ngày xưa, thuở sơ khai khi con người ta sáng tạo ra 1 cỗ máy vượt qua tất cả tất thảy tầm hiểu biết lúc bấy giờ, tưởng chừng như chỉ có trong giấc mơ, thứ đã khiến cho mọi thứ trên thế gian trở lên điên đảo, thế sự xoay vòng. Vâng đó là máy tính với mô hình máy chủ. Hệ thống đó bao gồm:
- Phần cứng (máy chủ vật lí)
- Hệ điều hành(operating system)
- Ứng dụng (application)
Ở giai đoạn này thì mỗi 1 máy chỉ chạy được 1 hệ điều hành, dù máy có ram mạnh cỡ nào, hay ổ cứng có trâu bò thế nào đi chăng nữa thì cũng chỉ chạy được 1 hệ điều hành thôi, rất chi là lãng phí.
Giai đoạn 2 – Thời đồ đá:
Sau khi xã hội phát triển, đời sống nâng cao, các ông chồng không muốn cả đời chỉ được yêu 1 em nữa, muốn có nhiều em thay đổi cơ. Máy tính cũng vậy, nó không muốn chỉ có thể dùng 1 hệ điều hành nữa, nó cũng muốn có thể chạy thêm nhiều OS khác nữa, Với tư tưởng không chơi được đồ thật thì mình chơi đồ ảo và virtualization ra đời :v.
Chắc hẳn anh em cũng ít nhiều từng nghe tới Virtualbox hay VMware rồi đúng không, chính nó là những sản phẩm công nghệ ảo hóa thời kì này. Về cơ bản Virtualization sử dụng phần mềm mô phỏng chức năng phần cứng để tạo ra một hệ thống ảo hóa.
Với công nghệ này thì 1 máy mình có thể cài được nhiều hệ điều hành hơn, tận dùng tài nguyên tốt hơn so với giai đoạn trước. Dù đã có sự tiến hóa rõ rệt về tư tưởng nhưng Phương pháp này vẫn tồn tại nhiều vấn đề:
Vấn đề về tài nguyên: Khi bật các máy ảo lên thì cần cấu hình trước dung ổ cứng và ram từ máy thật dẫn tới việc dù máy ảo có dùng hết công suất hay không thì số lượng tài nguyên mất đi cũng là cố định.
Đã bật máy ảo lên là auto mất từng đó tài nguyên rồi, dù máy ảo có không sử dụng thì máy thật cũng không tái sử dụng được. Ví dụ mình có con máy cùi ram 4Gb. Khi tạo máy ảo mình cấp cho máy ảo đó 2gb, vậy là máy thật mình còn có 2GB, trong khi máy ảo kia có dùng hết hay không thì máy thật cũng auto mất 2GB đã cấp phát rồi.
Vấn đề về thời gian: ae có công nhận là mỗi lần bật máy ảo lên thì lâu vãi chưởng không, trước mình có dùng con lenovo cùi ram 4gb mà khởi động thằng Virtualbox mất cả gần chục phút, các máy ngon thì cũng phải 1 vài phút :v.
Giai đoạn 3 – Thời văn minh hiện đại:
Thời kì này người ta sinh ra công nghệ Containerlization.Với công nghệ này, trên một máy chủ vật lý, ta sẽ cài đặt được nhiều máy ảo (cái này tương tự như ở giai đoạn 2), nhưng tốt hơn ở chỗ là các máy con này đều dùng chung phần nhân của máy mẹ và chia sẻ với nhau tài nguyên máy mẹ.
Đặc biệt là công nghệ Containerlization chỉ khi nào cần tài nguyên thì mới được cấp, cần bao nhiêu thì cấp bấy nhiêu, như vậy việc tận dụng tài nguyên đã tối ưu hơn. 1 điểm nổi bật của công nghệ này nữa là nó sử dụng công nghệ Container (Là công nghệ hàng đầu hiện nay mà ngay cả gã khổng lồ google cũng đang sử dụng).
Giải thích thêm về Container.
Các phần mềm, chương trình sẽ được Container engine đóng gói thành các Container. Thế Container là cái quái gì? Hiểu đơn giản nó là một giải pháp để chuyển giao phần mềm một cách đáng tin cậy giữa các môi trường máy tính khác nhau. Container có đặc điểm như sau:
- Tạo ra một môi trường chứa mọi thứ mà phần mềm cần để có thể chạy được. Ví dụ để chạy được laravel ta cần có mysql, php, nginx… thì trong container này sẽ chứa các service mysql, php, nginx… và thằng laravel sẽ chạy trong container này. Đã có sẵn mọi thứ để laravel có thể chạy được nên không gây ảnh hưởng tới bên ngoài Container.
- Không bị ảnh hưởng bởi môi trường hệ thống: Do các container này được đóng hộp lại thành các thùng chứa (giống như 1 cái thùng container) nên không bị ảnh hưởng bởi hệ thống thật và ngược lại không làm ảnh hưởng tới các phần còn lại của thống.
Các tiến trình trong một Container bị cô lập với các tiến trình của các container khác trong cùng hệ thống. Tuy vậy tất cả các Container này đều chia sẻ kernel của host OS nên cũng có thể kết nối được với nhau thông qua các cổng giao tiếp.
Công nghệ container này giúp ích cho ae coder chúng ta rất nhiều, ae muốn chạy cái gì chỉ cần tải cái container đó về và chạy thôi, khi không sài nữa thì xóa đi là được mà không ảnh hưởng gì tới máy thật, rất tiện lợi phải không nào.
Ưu điểm:
- Đơn giản: Việc bỏ hay tạo lại container rất dễ dàng.
- Linh động: Bạn có thể triển khai nó ở bất cứ đâu vì nó không phụ thuộc vào hệ điều hành.
- Nhanh: Do dùng chung nhân với OS nên tốc độ tạo container rất nhanh (nó hoàn toàn khác với vagrant, nó tạo môi trường ảo ở phần cứng nên khởi động lâu hơn nhiều).
- Nhẹ: Container cũng sử dụng chung các images nên cũng không tốn nhiều dung lượng.
- Đồng điệu: 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 vì chỉ cần share container là môi trường giống nhau như 2 giọt nước.
- Tính đóng gói: Có thể đóng gói môi trường bao gồm cả app vào trong một container.
Nhược điểm:
- Do dùng chung OS nên nếu có lỗ hổng nào đấy ở kernel của host OS thì nó sẽ ảnh hưởng tới toàn bộ container có trong host OS đấy.
- Ngoài ra hãy thử tưởng tượng với host OS là Linux, nếu trong trường hợp ai đấy hoặc một ứng dụng nào đấy có trong container chiếm được quyền superuser, điều gì sẽ xảy ra? Về lý thuyết thì tầng OS sẽ bị crack và ảnh hưởng trực tiếp tới máy host bị hack cũng như các container khác trong máy đó (hacker sử dụng quyền chiếm được để lấy dữ liệu từ máy host cũng như từ các container khác trong cùng máy host bị hack chẳng hạn).
Docker ra đời như nào?
Công nghệ virtualization thì ta có thể dùng công cụ Virtualbox hay VMware thế còn đối với containerlization thì dùng cái gì đây?
Sau bao năm giấu kín, cuối cùng đã có một công ty tiến hành công khai source code của họ về công nghệ này, họ tung ra sản phẩm tên là Docker và nhận được rất nhiều sự chú ý . Sau không chịu được áp lực từ sự thành công mà công ty cũng đổi tên thành Docker luôn =))
Nhận ra ưu điểm to lớn của công nghệ này, Ngay lập tức gã Microsoft cho ra mắt tính năng mới có tên Window Container. Đó là minh chứng tốt nhất cho ứng dụng toẹt vời của Docker =))
Tổng kết
Tới đây bài viết cũng khá dài rồi, Ở bài này mình chỉ giới thiệu qua Docker là gì? lịch sử hình thành của công nghệ ảo hóa dẫn đến sự ra đời của docker để các bạn có cái nhìn tổng quan nó. Ở bài viết sau mình sẽ giới thiệu Docker hoạt động như thế nào, sau đó mình sẽ đi luôn vào thực hành, cách build 1 dự án spring boot trên docker, build vuejs+laravel trên docker. Hãy cùng theo dõi seri docker này cùng với mình nhé.
Đây là seri về Docker, Mình cũng có viết 1 seri về laravel core, nếu các bạn quan tâm có thể tìm đọc tại đây nhé