Tạo máy ảo trên máy tính với Vagrant và VirtualBox

Hiện nay chúng ta khi làm website hoặc lập trình website luôn muốn thao tác mọi thứ trên Linux vì nếu bạn là lập trình viên PHP thì sẽ có lợi hơn khi sử dụng Linux. Ngoài ra trong một số trường hợp, chúng ta muốn tạo một máy ảo Linux riêng để tự cài webserver lên đó để phục vụ vào việc lập trình website. Mà nếu bạn không muốn mất tiền vào các dịch vụ máy ảo riêng (VPS) như DigitalOcean thì chúng ta nên tự tạo máy ảo riêng trên máy tính của mình.

Ở bài này, mình sẽ giới thiệu bạn đến một công cụ khác mà bạn có thể sử dụng kèm với VirtualBox hoặc VMWare để tạo máy ảo trong thời gian nhanh nhất, đơn giản nhất và chuyên nghiệp nhất đó là công cụ Vagrant.

Vagrant là gì?

Vagrant là một ứng dụng thêm dành riêng cho VirtualBox và VMWare để hỗ trợ người dùng tạo ra các máy ảo trên máy tính theo nhu cầu của mình và hỗ trợ quản lý toàn bộ máy ảo qua các dòng lệnh, hỗ trợ sẵn các box (bạn có thể hiểu “box” là một gói hệ điều hành với các thiết lập riêng biệt), đặc biệt  là bạn có thể chuyển thiết lập các máy ảo trong máy mình sang một máy tính khác (re-package), hoặc cho phép các thành viên cùng team với bạn truy cập vào thư mục riêng trên máy chủ để sửa/xem file mà họ không cần cài đặt bất cứ cái gì, miễn là dùng chung mạng LAN (Mạng nội bộ), thậm chí bạn có thể đưa máy chủ của bạn lên môi trường internet chỉ với vài dòng lệnh đơn giản.

Nói tóm lại, tuy rằng trong bài này mình sẽ nói về cách dùng Vagrant cơ bản nhưng khi bạn đã hiểu về nó, tự khắc bạn sẽ thấy Vagrant có ích như thế nào trong môi trường làm việc với web nói riêng và ảo hóa máy tính nói chung.

Cách cài đặt Vagrant

Ở bài này mình sẽ hướng dẫn cách cài đặt và sử dụng Vagrant trên hệ điều hành Windows (mình dùng Windows 8.1), nhưng nếu bạn dùng các hệ điều hành Linux như Ubuntu, Mac,…thì sẽ cài đặt dễ hơn vì đã có sẵn công cụ terminal nên bạn cứ làm theo, không cần cài đặt Git Bash ở bước 2.

Bước 1. Cài VirtualBox

Trước khi cài Vagrant, bạn nên cài VirtualBox để có thể tạo ra máy ảo trên máy tính của bạn. Bạn có thể tải phần mềm VirtualBox về và cài đặt vào máy như một phần mềm bình thường, yên tâm đây là phần mềm hoàn toàn miễn phí.

virtualbox

Bước 2. Cài Git Bash

Tại sao lại có Git ở đây? Bởi vì chúng ta sẽ sử dụng và điều khiển Vagrant qua bằng lệnh linux nên nếu dùng Windows thì sẽ hơi bất tiện khi dùng cái ứng dụng cmd có sẵn. Do vậy chúng ta cần một phần mềm để hỗ trợ giả lập môi trường UNIX trên Windows và công cụ Git có hỗ trợ cái này, mặc khác Vagrant rất có ích trong việc dùng chung với Git nên cứ cài sẵn để sau này cần thì dùng chung luôn.

Đầu tiên bạn truy cập vào http://git-scm.com/download/win để tải Git dành cho Windows phiên bản mới nhất. Sau đó chạy file vừa tải về để cài đặt và chọn tùy chọn như hình dưới.

git-install-windows

git-install-windows-2

git-install-windows-3

Sau khi cài xong, bạn có thể thấy máy tính mình có thêm một ứng dụng tên là Git Bash và Git GUI khi vào menu Start trên máy tính, chúng ta chỉ cần sử dụng Git Bash trong khuôn khổ bài viết này. Mở lên thì bạn sẽ có cửa sổ nhập lệnh như thế này:

git-bash

Tạm thời để đó đi, chúng ta cần cài thêm Vagrant nữa.

Bước 3. Cài Vagrant

Ứng dụng Vagrant sẽ tự động thêm vào các chương trình command line trên Windows/Linux sau khi cài đặt nên cũng không có gì khó cả. Trước tiên bạn cần truy cập vào https://www.vagrantup.com/downloads.html và tải gói cài đặt tương ứng với hệ điều hành mà bạn đang dùng.

Tải về và cài đặt như một phần mềm bình thường. Cài xong bạn sẽ cần khởi động lại máy tính để hoàn tất. Sau đó là hãy kiểm tra bằng cách mở cái Git Bash lên và gõ vagrant -h xem nó có hiện ra các thông tin trợ giúp không. Nếu có thì bạn đã cài Vagrant thành công.

vagrant-help

Cách sử dụng Vagrant để tạo máy ảo

Trước khi sử dụng, mình cần nói sơ qua về các quy trình để có một máy chủ ảo nhằm tránh bỡ ngỡ cho nhiều bạn.

Trong Vagrant, nó có một khái niệm bạn cần biết rõ đó là Box. Box có nghĩa là một gói hệ điều hành và có nhiều box đã cài sẵn một số ứng dụng cần thiết, chẳng hạn như box CentOS 6.5 32bit, CentOS 6.5 64bit, Ubuntu 12.04 có sẵn LAMP,…Bạn có thể tải các box này về để sẵn ở máy và sau đó bạn có thể sử dụng box này cho các máy ảo tùy thích.

Khi dùng Vagrant, bạn sẽ cần tạo một thư mục riêng cho mỗi máy ảo và mỗi thư mục này sẽ chứa các thiết lập cho 1 máy ảo. Bởi vì khi khởi động, bạn sẽ cần truy cập vào thư mục của máy ảo cần khởi động và sử dụng lệnh vagrant upđể khởi động nó lên.

Cũng nên nói lại rằng, tất cả các thao tác ở Vagrant đều thông qua lệnh. Nếu bạn dùng Windows thì bật phần mềm Git Bash vừa cài đặt ở trên, còn Linux thì dùng Terminal.

Sơ sơ là như vậy, còn chi tiết mình sẽ trình bày ở dưới.

Bước 1. Nạp box cho Vagrant

Sau khi cài đặt, Vagrant sẽ không có box sẵn mà bạn sẽ phải cần nạp nó về máy. Danh sách các box và đường dẫn của nó bạn có thể xem tại https://vagrantcloud.com/discover/featured.

Bây giờ hãy mở Git Bash lên và tiến hành gõ như sau:  

>> Link Centos

https://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.6-i386-v20150426.box
vagrant box add chef/centos-6.5-i386

Trong đó:

  • vagrant: đây là cú pháp bắt buộc phải gõ khi muốn dùng ứng dụng vagrant.
  • box: thành phần cần tương tác trên Vagrant, ở đây chúng ta cần tương tác với box.
  • add: hành động cần tương tác với thành phần box.
  • chef/centos-6.5-i386: tên box cần nạp trong địa chỉ https://vagrantcloud.com/discover/featured.

Sau khi Enter, nó sẽ hỏi bạn cần nạp box cho ứng dụng nào, nếu dùng VirtualBox thì gõ số 1 và Enter. Sau đó là nó sẽ tiến hành tải box bạn cần nạp về:

vagrant-add-box

Sau khi add box xong, hãy gõ lệnh vagrant box listđể xem danh sách các box hiện đang có trên máy của mình và quan trọng là để xem tên từng box.

vagrant-box-list

Vậy là xong bước nạp box nhé.

Bước 2. Tạo một máy ảo mới

Để tạo máy ảo mới, bạn cần tạo một thư mục riêng cho nó, bạn có thể gõ lệnh dưới để tạo thư mục tên là vm1:

 
mkdir vm1

Thư mục được tạo ra mặc định sẽ nằm ở C:\Users\Tên-User\(Windows) hoặc /home/$user/(Linux).

Tạo xong, hãy truy cập vào thư mục đó với lệnh cd:

cd vm1
 

Bạn gõ thể gõ lệnh pwdđể xem đường dẫn thư mục mà bạn đang truy cập.

Sau khi truy cập vào thư mục cần chứa máy ảo mới, bạn gõ lệnh sau để cài đặt một máy ảo mới với box cần sử dụng, ở đây mình cần sử dụng box centos65 mà mình vừa nạp ở trên:

 
vagrant init centos65

Đợi một xíu nó sẽ có thông báo đã nạp file Vagrantfile vào thư mục này như sau:

vagrant-init-finish

 

Dòng thông báo nghĩa là nó đã đặt file Vagrantfile vào thư mục máy ảo của bạn rồi, hãy mở nó lên để thiết lập lại và sử dụng lệnh vagrant up để khởi động máy ảo. Khoan hãy khởi động, nếu bạn cần tạo máy ảo để làm máy chủ webserver thì hãy vào thư mục vm1 vừa tạo ở trên và mở file Vagrantfile ra để sửa lại một số cấu hình cần thiết.

Đây là nội dung Vagrantfile của box centos65 của mình, file này có thể sẽ khác tùy theo box.

# -*- mode: ruby -*-

# vi: set ft=ruby :


# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!

VAGRANTFILE_API_VERSION = "2"


Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

 # All Vagrant configuration is done here. The most common configuration

 # options are documented and commented below. For a complete reference,

 # please see the online documentation at vagrantup.com.


# Every Vagrant virtual environment requires a box to build off of.

 config.vm.box = "centos65"


# Disable automatic box update checking. If you disable this, then

 # boxes will only be checked for updates when the user runs

 # `vagrant box outdated`. This is not recommended.

 # config.vm.box_check_update = false


# Create a forwarded port mapping which allows access to a specific port

 # within the machine from a port on the host machine. In the example below,

 # accessing "localhost:8080" will access port 80 on the guest machine.

 # config.vm.network "forwarded_port", guest: 80, host: 8080


# Create a private network, which allows host-only access to the machine

 # using a specific IP.

 # config.vm.network "private_network", ip: "192.168.33.10"


# Create a public network, which generally matched to bridged network.

 # Bridged networks make the machine appear as another physical device on

 # your network.

 # config.vm.network "public_network"


# If true, then any SSH connections made will enable agent forwarding.

 # Default value: false

 # config.ssh.forward_agent = true


# Share an additional folder to the guest VM. The first argument is

 # the path on the host to the actual folder. The second argument is

 # the path on the guest to mount the folder. And the optional third

 # argument is a set of non-required options.

 # config.vm.synced_folder "../data", "/vagrant_data"


# Provider-specific configuration so you can fine-tune various

 # backing providers for Vagrant. These expose provider-specific options.

 # Example for VirtualBox:

 #

 # config.vm.provider "virtualbox" do |vb|

 # # Don't boot with headless mode

 # vb.gui = true

 #

 # # Use VBoxManage to customize the VM. For example to change memory:

 # vb.customize ["modifyvm", :id, "--memory", "1024"]

 # end

 #

 # View the documentation for the provider you're using for more

 # information on available options.


# Enable provisioning with CFEngine. CFEngine Community packages are

 # automatically installed. For example, configure the host as a

 # policy server and optionally a policy file to run:

 #

 # config.vm.provision "cfengine" do |cf|

 # cf.am_policy_hub = true

 # # cf.run_file = "motd.cf"

 # end

 #

 # You can also configure and bootstrap a client to an existing

 # policy server:

 #

 # config.vm.provision "cfengine" do |cf|

 # cf.policy_server_address = "10.0.2.15"

 # end


# Enable provisioning with Puppet stand alone. Puppet manifests

 # are contained in a directory path relative to this Vagrantfile.

 # You will need to create the manifests directory and a manifest in

 # the file default.pp in the manifests_path directory.

 #

 # config.vm.provision "puppet" do |puppet|

 # puppet.manifests_path = "manifests"

 # puppet.manifest_file = "default.pp"

 # end


# Enable provisioning with chef solo, specifying a cookbooks path, roles

 # path, and data_bags path (all relative to this Vagrantfile), and adding

 # some recipes and/or roles.

 #

 # config.vm.provision "chef_solo" do |chef|

 # chef.cookbooks_path = "../my-recipes/cookbooks"

 # chef.roles_path = "../my-recipes/roles"

 # chef.data_bags_path = "../my-recipes/data_bags"

 # chef.add_recipe "mysql"

 # chef.add_role "web"

 #

 # # You may also specify custom JSON attributes:

 # chef.json = { mysql_password: "foo" }

 # end


# Enable provisioning with chef server, specifying the chef server URL,

 # and the path to the validation key (relative to this Vagrantfile).

 #

 # The Opscode Platform uses HTTPS. Substitute your organization for

 # ORGNAME in the URL and validation key.

 #

 # If you have your own Chef Server, use the appropriate URL, which may be

 # HTTP instead of HTTPS depending on your configuration. Also change the

 # validation key to validation.pem.

 #

 # config.vm.provision "chef_client" do |chef|

 # chef.chef_server_url = "https://api.opscode.com/organizations/ORGNAME"

 # chef.validation_key_path = "ORGNAME-validator.pem"

 # end

 #

 # If you're using the Opscode platform, your validator client is

 # ORGNAME-validator, replacing ORGNAME with your organization name.

 #

 # If you have your own Chef Server, the default validation client name is

 # chef-validator, unless you changed the configuration.

 #

 # chef.validation_client_name = "ORGNAME-validator"

end

Nội dung trong đây là tất cả những thiết lập mà bạn sẽ cần sử dụng nếu cần thiết. Các thiết lập đã được ghi mẫu sẵn mà bạn chỉ cần bỏ comment (xóa dấu # ở đầu) thì có thể sử dụng hoặc copy lại. Nếu bạn muốn thiết lập máy ảo cho việc cài webserver thì nên thiết lập như sau:

Tìm:

 
# config.vm.network "forwarded_port", guest: 80, host: 8080

Và bỏ dấu #ở trước nó đi.

Đoạn trên có nghĩa là chúng ta sẽ forward các truy cập từ port 8080 trên máy khách vào port 80 trên máy chủ. Tức là sau này bạn cần truy cập vào website thì sẽ sử dụng tên miền localhost:8080.

Tạm thời như vậy là xong, bây giờ hãy mở Git Bash lên và truy cập vào thư mục vm1 nếu bạn chưa truy cập. Sau đó khởi động máy ảo bằng lệnh sau:

vagrant up
 

vagrant-up-finish

Nếu bạn gặp lỗi khi dùng lệnh vagrant up, hãy tắt VirtualBox và mở lên lại.

Và cuối cùng là gõ lệnh vagrant sshđể truy cập vào máy ảo vừa khởi động qua giao thức SSH. Khởi động xong, hãy thử mở VirtualBox lên và bạn sẽ thấy đã có một máy ảo đang được chạy.

virtualbox-vagrantup

Hãy lưu ý rằng, bạn có thể tạo ra nhiều máy chủ nhưng mỗi máy chủ phải ở riêng một thư mục khác nhau. Khi truy cập vào thư mục nào, thì các lệnh ở trên sẽ tương tác với máy ảo ở thư mục đó.

Một số lệnh Vagrant cơ bản cần thiết

Trong khi dùng Vagrant, có thể bạn sẽ sử dụng rất nhiều một số lệnh dưới đây nên tốt nhất là hãy nhớ chức năng của nó:

  • vagrant box add– Nạp box.
  • vagrant box list– Xem danh sách các box.
  • vagrant suspend– Cho máy ảo tạm nghỉ.
  • vagrant halt– Cho máy ảo đi ngủ, shutdown đó.
  • vagrant destroy– Cho máy ảo về vườn.
  • vagrant login– Đăng nhập vào hệ thống Vagrant Cloud.
  • vagrant share --ssh: Chia sẻ máy ảo của bạn cho người khác truy cập, bạn phải gõ lệnh vagrant login trước khi dùng tính năng này.
  • vagrant reload: Tải lại các thiết lập trong file Vagrantfile của máy ảo, khi đổi nội dung file đó bạn phải sử dụng lệnh vagrant halt trước để tắt máy ảo, sau đó sử dụng lệnh reload này để nạp lại cấu hình.

Một số câu hỏi phổ biến

Sử dụng SSH quyền Root

Mặc định khi truy cập vào SSH thông qua lệnh vagrant ssh, bạn sẽ truy cập vào máy ảo thông qua user vagrant và user này sẽ không có quyền root. Do đó mỗi lần gõ lệnh cài hay thay đổi thiết lập gì bạn bắt buộc phải thêm sudođằng trước lệnh. Tuy nhiên, bạn không thể sử dụng sFTP để truy cập được và sửa các file cấu hình vì không có quyền root.

Trước hết, mình khuyên bạn nên sử dụng user vagrant để làm việc, cần gì thì cứ sudo nhé. Còn nếu cần vào sFTP thì bạn có thể thiết lập mật khẩu root với lệnh sau:

$ sudo passwd root

Truy cập webserver

Nếu bạn có cài LAMP hay LEMP thì khi muốn truy cập vào website, bạn phải sử dụng đường dẫn là http://127.0.0.1:8080 vì Vagrant chỉ hỗ trợ bạn listen cổng 8080 trỏ về cổng 80 chứ không listen trực tiếp.

Lỗi timeout khi kết nối vào SSH

Nếu bạn gặp lỗi timeout khi kết nối vào máy chủ qua SSH bằng lệnh vagrant ssh, sẽ có 2 lý do phổ biến như sau:

  • Bạn đang dùng máy ảo để cài Vagrant, tài nguyên bị thiếu.
  • Dùng hệ điều hành không tương thích với phần cứng. Ví dụ bạn có máy ảo chỉ vài trăm MB RAM mà lại dùng bản 64bit.

Làm sao tôi có thể thêm nhiều domain vào webserver?

Khi cài LAMP hay LEMP, bạn cứ thêm domain bằng virtualhost như thường lệ. Sau đó mở file hosts trên máy tính và trỏ domain đã add về IP 127.0.0.1. Ví dụ:

thachpham.dev 127.0.0.1

Đồng bộ hóa dữ liệu thư mục (Synced Folder)

Trong một vài trường hợp, bạn sẽ cần di chuyển qua lại các dữ liệu giữa máy tính của bạn với máy ảo, lúc đó tính năng Synced Folder sẽ phát huy tác dụng của nó. Bây giờ bạn hãy thử vào thư mục vm1 mà bạn đã tạo để chứa máy ảo và tạo một file bất kỳ trong đó.

Sau đó vào SSH, gõ lệnh ls /vagrantthì bạn sẽ thấy file của bạn đã có ở đó. Ngược lại nếu bạn vào máy ảo, đặt cái gì vào thư mục này thì thư mục vm1 trên máy tính cũng sẽ có.

Như vậy bạn có thể hiểu, mặc định bất cứ cái gì bạn bỏ vào thư mục vm1 trên máy tính sẽ đều đưa vào thư mục /vagrant của máy ảo. Nếu bạn có nhu cầu đổi thư mục đồng bộ này, bạn có thể mở file Vagrantfile ra và tìm:

# config.vm.synced_folder "../data", "/vagrant_data"

Trong đó, ../data nghĩa là thư mục trên máy tính của bạn và /vagrant_data là thư mục trên máy ảo. Bạn có thể thử bằng cách tạo thêm một thư mục tên data trong thư mục vm1, sau đó sửa đoạn trên thành:

config.vm.synced_folder "data/", "/vagrant"

Và bây giờ hãy thử đặt một file nào đó trong thư mục data/ rồi vào máy ảo xem kết quả.

Chia sẻ máy ảo (Share Machine)

Tính năng này rất hay và hữu dụng nếu bạn muốn truy cập vào máy ảo trên một máy tính khác ở ngoài mạng hoặc cho bạn bè xem website mà không cần thiết lập mạng máy tính để tránh các vấn đề rủi ro bảo mật. Tính năng này nó sẽ sử dụng máy chủ vagrantcloud.com làm máy chủ trung gian và mỗi lần bạn chia sẻ, nó sẽ cung cấp cho bạn một cái tên ngẫu nhiên kiểu http://random-number.vagrantcloud.com và địa chỉ này sẽ bị hủy nếu bạn tắt cửa sổ lệnh hoặc ấn Ctrl + C ở cửa sổ gõ lệnh (ở đây là Git Bash).

Bước 1. Chia sẻ

Để sử dụng tính năng này, trước tiên bạn cần phải đăng ký một tài khoản tại https://vagrantcloud.com, hoàn toàn miễn phí nhé.

Sau đó mở Git Bash lên và gõ vagrant loginđể đăng nhập vào Vagrant Cloud.

vagrant-login

Ok, chẳng hạn bây giờ mình muốn người khác vào SSH trên máy ảo của mình thì sẽ cần gõ lệnh như sau:

vagrant share --ssh

Nó sẽ hỏi bạn thiết lập passpharse cho máy này, giống như kiểu password vậy đó, bạn hãy nhập mật khẩu tùy thích và nhớ là người đăng nhập phải biết mật khẩu này.

vagrant-share-ssh

Và sau đó là nó sẽ cho bạn địa chỉ và cái tên của máy ảo để người khác kết nối. Nhưng đối với SSH, người cần kết nối chỉ có thể kết nối nếu họ đã cài đặt Vagrant trên máy. Còn nếu máy ảo của bạn đã có cài đặt webserver thì có thể truy cập vào website thông qua địa chỉ nó cung cấp mà không cần nhập port :8080 vì nó đã tự forward từ 80 sang 8080.

vagrant-share-ssh-finish

Bước 2. Kết nối SSH vào máy ảo được chia sẻ

Khi chia sẻ, bạn sẽ nhận được một đường dẫn máy ảo ví dụ như http://sizzling-yak-5509.vagrantshare.com/, như vậy máy ảo của bạn sẽ có tên là sizzling-yak-5509 và chúng ta sẽ kết nối vào SSH trên máy ảo này với lệnh:

vagrant connect sizzling-yak-5509

Chia sẻ toàn bộ cổng trên máy ảo

Với lệnh vagrant share –ssh ở trên, bạn chỉ có thể chia sẻ máy ảo thông qua giao thức  SSH với cổng là 2222 mà thôi chứ không thể vào web với cổng HTTP được. Do vậy, nếu bạn muốn chia sẻ toàn bộ các cổng hiện có trên máy chủ thì có thể xóa tham số –ssh đi.

vagrant share

Lưu ý với kiểu share này, bạn phải cài đặt webserver trước và khởi động nó lên.

Lời kết

Tới đây thì bài cũng đã khá dài rồi và những gì mình đã trình bày trong bài này đã đủ giúp bạn xây dựng một máy ảo trên máy tính của mình để bạn có thể thực hành Học VPS căn bản để chạy website WordPress trên môi trường máy chủ. Ở bài kế tiếp, mình sẽ hướng dẫn bạn cách tự tạo box cho riêng mình để tái sử dụng mà không cần cài đặt lại và chia sẻ box đó lên thư viện của VagrantCloud để cho bạn bè cùng sử dụng.

Nếu có gì trục trặc, hãy cho mình biết rõ bạn đang gặp lỗi gì để mình có thể trợ giúp.

Bạn thấy bài viết này như thế nào?: 
Average: 10 (1 vote)