All Articles

Giải ngố về docker phần 1

giai-ngo-docker-1

Trong vài năm trở lại đây, Docker nổi lên trong làng Dev như một hiện tượng, phải nói “người người Docker, nhà nhà Docker”. Tuy càng ngày càng phổ biến là vậy, nhưng không ít dev vẫn còn mơ hồ về nó. Sau đây là tập hợp các câu hỏi kinh điển về Docker cũng như một số công nghệ xung quanh nó. Mình sẽ giải thích các khái niệm, các thắc mắc một cách dễ hiểu nhất để ai cũng có thể hiểu được. Let’s go!

1. Sự khác nhau giữa Docker container và máy ảo (Hypervisor) là gì?

giai-ngo-docker-2

Thực sự đây là một trong những câu hỏi kinh điển về Docker mà tất cả những ai đã từng tiếp xúc với Docker đều thắc mắc. Tầng suất xuất hiện của câu hỏi này trên Google còn nhiều hơn cả câu hỏi “Docker là gì?” mà mình sẽ giải thích ở phần sau 😬

Các bạn hoang mang cực độ (confused) khi so sánh 2 thằng, vì giữa thằng máy ảo (VM) và docker nó quá giống nhau, vì sao như vậy???

  • Cả hai thằng đều dựa trên cộng nghệ ảo hóa để làm việc
  • Chúng ta tương tác với containers như một hệ điều hành thực thụ. Máy thật có gì thì thằng Docker có cái đó, những gì máy thật làm được thì Docker cũng làm được
  • Cả hai đều dùng để cô lập môi trường ứng dụng
  • VM có snapshot, docker có docker image
  • Có thể run nhiều VMs, nhiều containers cùng lúc
  • Người dùng có thể giới hạn tài nguyên phần cứng
  • etc.

Việc đi sâu vào công nghệ bên dưới của 2 thằng để giải thích sự khác nhau sẽ là một sự sai lầm. Mà sự khác nhau dễ thấy nhất giữa chúng nằm ở hiệu năng!!

  • Chúng ra có thể run container chỉ trong vài giây, còn máy ảo thì có thể đến hàng phút
  • Container chiếm dung lượng đĩa ít hơn nhiều so với VM
  • Trên hết, run app trên container đem lại performace ngon hơn nhiều - giúp giảm chi phí vận hành

Vì sao lại có sự cách biệt về hiệu suất đến như vậy? Đối với VM nó là công nghê giả lập phần cứng, nó đánh lừa HĐH rằng nó đang chạy trên một phần cứng thật sự. Thế nên, VM tốn khá nhiều tài nguyên khi phải cân cả một HĐH ảo và cả CPU, memory, network,.. Còn đối với container thì nó đánh lừa ứng dụng rắng nó là “độc tôn” trên máy của chúng ta - trên máy của chúng ta nó là duy nhất, nó được run trên phần cứng thật, được truy cập những tài nguyên thật khi bạn cho phép!

Một sự khác biệt nữa, khi một VM chết thì toàn bộ những ứng dụng trong nó đều chết. Containers thì lại được run trên mỗi process khác nhau của máy thật, và hoàn toàn không ảnh hưởng đến nhau.

2. Docker là gì? Và sự hình thành Docker 🐳

Chúng ta có một vấn đề cần được giải quyết như sau: Chúng ta có 2 trang web đều được code bằng Ruby. Tuy nhiên, trang web thứ nhất được code bằng Ruby version 2.7.x, trang web thứ hai lại được code bằng version mới hơn là 3.0.x. Bài toán đặt ra là làm sao để triển khai 2 trang web trên cùng một lúc mà không gây xung độ lẫn nhau (giả sử chúng ta không dùng rvm, hoặc những Ruby Version Manager khác)

Việc mua thêm một server mới sẽ là một sự lựa chọn. Thế nhưng chúng ta sẽ không khai thác hết tài nguyên của server ban đầu. Vả lại khách hàng cũng không chịu chi mua thêm server mới

Thời điểm trước khi Docker ra đời gì có lẽ VM sẽ là sự lựa chọn tuyệt vời nhất…

3. Thực hư Docker chỉ support Linux???

4. Đã đến lúc cần phân biệt Docker và container

5. Vai trò Dockerfile và Docker compose là gì, phân biệt?

6. Các containers nói chuyện với nhau như thế nào?

7. Docker và câu chuyện Deploy

8. Sự kiện Kubernetes hết hỗ trợ Docker, tại sao và tương lai?

**bài viết còn đang dang dở**