Kết hợp Vagrant, Docker trong việc tạo dựng môi trường dev

Bài viết này Nghĩa xin phép trích lại một phần practice đã thực hiện trong những năm tháng vừa qua tại Squarebit Studio, và mới đây hơn là trong các dự án của Soft World Studio (SWS).



Vấn đề:

Giả sử chúng ta đang cần phát triển một ứng dụng nền web, có frontend là React, backend là Java, dùng CSDL là MongoDB, memcache Redis.

  • Là một frontend developer, tôi muốn lúc develop trên máy cá nhân của mình có thể sử dụng backend được chạy trên chính máy của mình (sẽ được chạy trên một máy server ảo được setup bởi Vagrant) mà không cần quá hiểu biết về backend đó, đơn giản: tôi cần một cái địa chỉ IP và một cái port để tôi connect. Hết!

  • Là một backend developer, tôi muốn có database MongoDB hàng thật để connect vào, admin nó, drop bảng,... quá trình phát triển của tôi có thể sẽ nhanh hết sức bởi hàng họ database tôi đang có quyền admin trực tiếp!

Nhìn chung vấn đề khi phát triển tiếp đó là các sub-system cần thiết: host, port của MongoDB, Redis, backend, v.v..

Nếu ở các công ty lớn họ sẽ setup lên máy chủ dev của họ và mở các host, port nội bộ cho developer kết nối vào.

Tuy nhiên, bài viết này hướng đến việc dùng Vagrant và Docker để setup môi trường dev (phải chăng là một mini local server) để mỗi developer có thể tự độc lập tạo được môi trường dev cho riêng mình trên chính máy cá nhân của họ.

Tất nhiên ta cũng có thể đem practice này lên quy mô lớn hơn tùy vào cách hiểu và setup, túm cái quần lại là quy mô nhỏ như SWS hay các startup, việc tạo dựng môi trường dev độc lập cho mỗi developer giúp tiết kiệm thời gian, giảm chi phí setup máy chủ dev, giảm sự lệ thuộc, và cũng là một phần trên con đường giúp họ trở thành Full Stack Developer trong tương lai chăng? Và Vagrant cùng Docker là sự lựa chọn không tồi.

Tình huống và từng bước:

  • Cần setup một server local Linux Ubuntu 16.04 (để cài MongoDB phục vụ cho backend developer).

Dùng Vagrant, viết một file Vagrantfile định nghĩa cho nó dùng file ISO Ubuntu-16.04, và gõ lệnh vagrant up, thế là nó tự tạo một máy ảo trên PC của mình và cài Ubuntu 16.04.
Không dùng vagrant cũng được, thì ta phải mở GUI của Virtualbox lên tự tạo máy ảo giống như cài Win vậy :)).

Vagrant đã giúp skip được phân tạo máy ảo và cài hệ điều hành cho server dev chỉ với một dòng lệnh: vagrant up.

Sau khi đã vagrant up rồi, ta có thể nhảy vào shell của máy server local bằng: vagrant ssh.
Lúc này có thể toàn quyền vọc vạch, cài MySQL, cài MongoDB, Redis theo ý muốn
Và cũng giả sử luôn là ta đã chỉ định một địa chỉ IP cho server local này là: 172.16.1.52 (địa chỉ IP ta đặt tùy ý vì nó là một máy ảo trên chính PC của mình).
  • Cài MongoDB lên máy 172.16.1.52

Có 2 cách:
  • Cài bằng các gói (package) của hệ điều hành tương ứng như apt-get của Debian, yum của CentOS...
  • Dùng Docker.

Docker nói một cách nhanh nhất thì nó là một toolkit xoay quanh hai khái niệm chính: image, container.

Image: là một file ảnh, là chương trình, là ứng dụng đã được đóng gói (~ ISO) và nó có một câu lệnh để chạy chương trình chứa trong image đó (vd tôi có ứng dụng Java và muốn chạy nó tôi có câu lệnh là java -jar app.jar, với MongoDB thì chạy câu lệnh mongod chẳng hạn...).
Container: là image khi chạy câu lệnh và trở thành process trong OS.

Cụ thể hơn ta cần MongoDB 3.6, ta dùng Docker Image mongo:3.6 và docker run nó:

docker run mongo:3.6 -p 27017:27017

-p 27017:27017 có ý nghĩa là thông port 27017 (port mặc định của MongoDB) của Docker container về chính port 27017 của máy host (172.16.1.52:27017)

Sau khi chạy MongoDB bằng Docker và thông port, ta chắc chắn có thể connect được. Nghĩa là lúc này Backend developer chỉ cần chỉnh cho trỏ vào MongoDB tại 172.16.1.52:27017 là có thể dev ngon lành.

Bài viết này có thể dài hơn nhưng có thể tạm chốt lại ở đây:

  • Ta dùng Vagrant để tạo một máy ảo (cụ thể là Linux) dùng làm server dev local bằng một dòng lệnh: vagrant up.
  • Ta dùng Docker để cài đặt các sub-system (MongoDB, MySQL, Redis) thay vì cài đặt trực tiếp trên máy server dev. 

Tóm lại

  • Được: tiết kiệm thời gian tạo máy dev, tái sử dụng các binary image của Docker để chạy các sub-system (bỏ qua được việc cài đặt, tinh chỉnh phức tạp của các sub-sytem) vì đã dùng các image được fine-tune build sẵn rồi.
    Mỗi developer sẽ ít phụ thuộc nhau cũng như ít phụ thuộc vào một máy server dev chẳng hạn.
    Việc cần làm là định hình được môi trường dev từ đầu và xuyên suốt quá trình phát triển.
  • Mất: tùy cảm nhận, và phải mất một chút thời gian để học Docker. Nhưng cái lợi của Docker nằm ở bên dưới đây.
  • Xa hơn: Docker cũng sẽ là kiến trúc dùng trong deployment và SWS tự hào đang làm chủ nó.





Comments

Popular Posts

Liên hệ

Name

Email *

Message *