Lời nói đầu
Là 1 lập trình viên, việc setup những môi trường phức tạp khi tham gia vào dự án là điều bắt buộc để có thể lập trình. Đã bao giờ bạn cảm giác rằng mình setup hệt như môi trường của những người khác trong team và chạy cùng 1 sourcecode nhưng họ chạy được còn bạn thì không chạy được không?
Docker và Vagrant chính là những giải pháp để giải quyết vấn đề đó và nhiều hơn thế nữa. Tuy nhiên, cách mà chúng hiện thực để đạt được mục tiêu đó có phần khác nhau. Docker sử dụng container technology, còn Vagrant sử dụng virtual machines. Bằng việc hiểu được điểm mạnh và điểm yếu của Docker và Vagrant, bạn có thể chọn 1 trong 2 hoặc kết hợp cả 2 sao cho thích hợp nhất. Đầu tiên chúng ta sẽ làm rõ 2 khái niệm quan trọng là virtual machine và container.
Virtual machine
Virtual machine (VM) giả lập 1 máy tính vật lý. Nó có hệ điều hành, cung cấp các tài nguyên vật lý cần thiết nhưng thật chất là môi trường ảo và hoạt động như 1 máy tính độc lập với đầy đủ BIOS, CPU, storage và network adapters.
Thật ra ý tưởng về VM đã có từ rất lâu. Năm 1965, nhằm mục đích nghiên cứu IBM Yorktown Research Center đã chia 1 máy đơn thành các phân vùng nhỏ hơn. Những phân vùng nhỏ hơn đó có khả năng tự quản lý tài nguyên của chúng và có thể xem như là những máy ảo đơn giản.
Lúc đó ý tưởng về VM trở nên rất thành công. IBM bắt đầu làm ra hệ điều hành dựa trên ý tưởng của VM. IBM System 370 (S/370) và IBM System 390 (S/390), cả hai đều là IBM VM/ESA based systems đã trở nên rất nổi tiếng trên thị trường vì chúng cho phép các tổ chức để các người dùng chia sẻ computing resources mà không làm ảnh hưởng đến môi trường của các cá nhân khác. Ý tưởng đó còn giúp tạo ra hệ điều hành Unix và ngôn ngữ lập trình Java.
Ngày nay các máy ảo hiện đại chạy trên hypervisors. Hypervisors là software, firmware hoặc hardware chịu trách nhiệm cho việc khởi tạo hay thực thi của các máy ảo. Có rất nhiều hypervisors nên thị trường mà nổi bật là KVM, Red Hat Enterprise Virtualization (RHEV), XenServer, Microsoft Hyper-V và VMware vSphere / ESXi.
Ngày nay máy ảo đã thúc đẩy sự tăng trưởng của điện toán đám mây. Amazon AWS, Microsoft Azure, Google Cloud, Digital Ocean và các công ty điện toán đám mây khác phụ thuộc rất nhiều vào công nghệ ảo hóa này.
Container
Các container tạo ra virtualization trên hệ điều hành. Chúng hoạt động như một gói phần mềm thực thi để cô lập các ứng dụng khỏi môi trường xung quanh chúng. Bên trong gói phần mềm đó, container có các thuộc tính cần thiết như code, thời gian chạy, các thư viện hệ thống và các công cụ để giữ cho ứng dụng tách khỏi sự ảnh hưởng từ bên ngoài. Nó chạy trên hệ điều hành của máy chủ. Container chia sẻ các thư viện và các chương trình nhị phân khi có thể và chỉ phân tách các resource mà thực sự cần thiết.
Năm 1979, chroot system call được dùng để tách biệt các processes của Unix. Đó là hạt giống đầu tiên của ý tưởng về container. Công nghệ container đầu tiên bắt đầu với FreeBSD Jails vào năm 2000. Một năm sau, Linux VServer cho phép nhiều máy Linux chạy trên một máy chủ duy nhất. Năm 2004, Oracle Solaris Zones cung cấp các chức năng tương tự như FreeBSD Jails. Trong năm 2006-2007, Google đã phát triển Process Container và sau đó hợp nhất nó vào Linux Kernel. Linux Containers (LXC) được tạo ra trong năm 2008 để tận dụng lợi thế của các nhóm Linux cgroups and namespacing. Năm 2013, Docker được tạo ra thông qua việc kết hợp ý tưởng của LXC. Nó cũng bổ sung các công cụ để dễ dàng build và retrieve images của các container.
Docker
Docker là một công nghệ container mã nguồn mở dựa trên LXC. Docker phổ biến vì nó giúp bạn dễ dàng tạo, chạy và triển khai các ứng dụng trong một môi trường khép kín. Docker không tạo ra cả một hệ điều hành như VM. Thay vào đó, nó sử dụng hạt nhân của hệ điều hành của máy chủ và chỉ tạo virtualization cho ứng dụng và các thư viện cần thiết. Phương pháp này làm cho nó nhẹ hơn nhiều so với các máy ảo.
Docker được tạo từ Docker Images. Docker Images có thể được coi là ảnh chụp nhanh của máy. Người dùng có thể dễ dàng start một container từ một image. Các image được tạo ra dưới dạng các layer. Giả sử một nhóm phát triển cần một container với Apache và Python được cài đặt trên một phiên bản nhất định của Linux. Một lập trình viên có thể tải xuống một image Linux từ Docker Hub, start 1 container, cài đặt Apache và Python, tạo ra một image mới từ container và chia sẻ image đó. Các thành viên khác của nhóm không cần phải cài đặt lại từ đầu. Nó giúp duy trì một môi trường nhất quán cho tất cả mọi người.
Docker cũng hỗ trợ các ứng dụng scripting và multi-container. Người dùng có thể sử dụng text-based Dockerfile để xác định các yêu cầu và sau đó xây dựng các container thông qua Docker Compose. Ví dụ trên về việc tạo ra một máy chủ Apache / Python / Linux cũng có thể đạt được thông qua quá trình này. Với Docker Compose, các nhóm phát triển chỉ cần chia sẻ tệp Dockerfile để tạo ra cùng một môi trường.
Vagrant
Vagrant là một công cụ mã nguồn mở giúp tạo và duy trì các máy ảo. Nó hoạt động với VirtualBox, VMWare, AWS và các nhà cung cấp khác.
Vagrant đơn giản hóa việc quản lý máy ảo. Sử dụng tệp Vagrantfile, các lập trình viên có thể định nghĩa các thuộc tính của máy ảo như hệ điều hành, cài đặt phần mềm và các phần khác. Text-based Vagrantfile có thể được chia sẻ thông qua version control và máy ảo của bạn sẽ được tạo ra dựa trên những gì bạn đã configure ở vagrantfile sau khi chạy lệnh "vagrant up". Người dùng có thể đăng nhập vào máy ảo như một máy chủ vật lý.
Điểm tương đồng
Cả Docker và Vagrant đều có các môi trường mà bạn có thể dễ dàng cấu hình và kiểm soát chúng thông qua scripts. Chúng cũng dễ dàng để sử dụng với cloud.
Điểm khác biệt
Máy ảo Vagrant cung cấp Kernel-based security separation. Việc tách biệt này làm cho các máy ảo ít gặp rủi ro về security hơn so với container. Nhưng các container Docker rất nhẹ. Chúng sử dụng ít tài nguyên hơn và thực thi nhanh hơn. Vì vậy, bạn có thể có nhiều hơn một container trên một máy chủ duy nhất so với các máy ảo. Ngoài ra, việc start và stop container là gần như tức thời so với máy ảo. Các máy ảo phải đi qua toàn bộ chu kỳ khởi động BIOS và Hệ điều hành.
Nhờ vào security separation của VM, khi có failure xảy ra thì không bị ảnh hưởng đến các phần khác. Còn đối với container, chúng chia sẻ các tài nguyên và có thể có hiệu ứng fail 1 cách dây chuyền. Ngoài ra, các mối đe dọa an ninh của container có thể chạm đến được cả kernel của hệ điều hành máy chủ.
Tuy nhiên, tốc độ thực thi và tính gọn nhẹ của container làm cho Docker rất hấp dẫn để phát triển. Với kiến trúc microservice, container có thể hoạt động tốt vì các yếu tố rủi ro được giảm thiểu thông qua việc sử dụng các microservices. Ngoài ra, những nổ lực nhằm cải tiến Docker bảo mật hơn càng ngày càng được đẩy mạnh.
Kết luận
Docker và Vagrant đều là những công nghệ hữu ích có thể giúp các nhà phát triển nâng cao năng suất của họ. Nếu bạn rất quan tâm đến bảo mật ứng dụng thì Vagrant và máy ảo có thể là một ý tưởng tốt. Để phát triển và chia sẻ nhanh chóng, Docker là một lựa chọn thông minh. Hầu hết các đội phát triển sử dụng cả Vagrant và Docker để tận dụng sức mạnh của cả hai.