Vagrant allows you to easily manage and control multiple virtual machines. It is built on top of VirtualBox and VMWare and it provides many exciting capabilities. You can create isolated development environments, experiment with new products and technologies, install new versions of existing packages, create your own private data center on your laptop and run different operating systems. All that is available in an easy to manage and totally safe silo that can't interfere with your main activities and operating system. In this article I'll show you how to set up Vagrant and start exploring the wealth of opportunities it affords.
Download the free VirtualBox for your operating system from here:
After download, just run the binary and install it.
Download Vagrant itself from here:
Again, just run the binary to install it.
Vagrant is a command-line based tool. Once installation is out of the way drop, into your command line prompt and create a new directory (I called mine 'playground').
Once you're inside the playground directory type:
vagrant init ubuntu/trusty64
You should see the following text:
A 'Vagrantfile' has been placed in this directory. You are now
ready to 'vagrant up' your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
'vagrantup.com' for more information on using Vagrant.
The generated 'Vagrantfile' is a Ruby file that controls your one or more virtual machines. It is a pretty big file with lots of commented out options. We will ignore it for a moment and just jump with both feet and type:
This will cause Vagrant to download a prepared virtual box with the 64-bit Ubuntu 14.04 (trusty) release. It will take a while and spit a bunch of mumbo jumbo to your screen, so let's take the time to discuss how to treat your VM.
You may think about the VM as a completely separate server running somewhere. This is a totally valid view and it means that you will interact with the VM through a network interface.
An alternative view is to consider it as a close neighbor with whom you want to exchange information. You will use a synced folder to read and write files on the VM as if they were local files. The fact that the VM really is located on the same machine helps the illusion as there is not a lot of latency as when dealing with a machine that is actually remote.
You can, of course, use both synched folders and still SSH into your VM. There are other options that blur the borders such as port mapping.
Here is a stripped down version of the Vagrantfile with some of the most important options:
Vagrant.configure(2) do |config|
config.vm.box = "ubuntu/trusty64"
config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.network "private_network", ip: "192.168.33.33"
config.vm.synced_folder "../data", "/vagrant_data"
machine.vm.hostname = "gigi.playground.local"
The syntax is Ruby, which gives you a lot of flexibility if you want to add conditionals and loops.
I'm Going In…
You can connect to your running VM by typing:
This will launch an SSH session and let you fiddle with your VM interactively.
Once, inside your VM you can pretty much do anything you want: run commands, create users, create files and directories, etc. You are logged in as the 'vagrant' user, which has sudo privileges, so you has full control over the VM.
Exchanging Data with Your VM
Vagrant automatically maps the folder on the host machine that contains the Vagrantfile to the /vagrant directory inside the guest machine. This lets you edit files in your favorite editor on the host machine and have it available in the guest or alternatively have the guest write some output file to the /vagrant directory and browse the synced folder on the host.
Mapping Guest Ports
Often you would run some application that communicates through a port. The most common one is a web server. Vagrant allows you to forward guest ports to the host machine. For example in the configuration above the guest port 80 is mapped to the host 8080 port. What that means is that whatever service is running on port 80 in the guest can be accessed as localhost:8080 in the host machine. Let's see a demonstration. First, I'll put a simple index.html file in the ~/playground directory on the host that is synced with the /vagrant directory on the guest
<h1>Vagrant is awesome!</h1>
Then, after I SSH into the guest machine, I'll run a little web server in the /vagrant dir:
vagrant@vagrant-ubuntu-trusty-64:/vagrant$ sudo python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 ...
This one-liner Python HTTP server simply serves any static file in its working directory. Now, since port 80 is mapped to the host's 8080 port you can browse to localhost:8080 and view the awesomeness that is Vagrant:
Connecting to the VM Through the Network
You can also connect to the VM through its IP address as if it's a really separate server. This is very useful when testing distributed systems and using a Vagrant VM to simulate a remote server. In this case, the programs that usually connect to the remote server are configured with the VM IP address or hostname. Prior to Vagrant 1.7 there was a single private key that could be used for all machines. This was a serious security problem when people exposed their virtual machine over public networks and anyone could SSH in and get root access. Starting with version 1.7 Vagrant generates a fresh key pair for each machine. To find out where the private key for your machine is run this command:
Here is how you can SSH directly to the VM:
ssh -o UserKnownHostsFile=/dev/null -o CheckHostIP=no -o StrictHostKeyChecking=no -i ~/playground/.vagrant/machines/default/virtualbox/private_key firstname.lastname@example.org
Managing Your Virtual Box
Vagrant provides many commands to manage boxes. You can halt, resume, suspend, stop and even destroy a box. The reload command is good when you make changes to the Vagrantfile. You are always in control. The status command will give you a sense of the current state of your virtual machines (especially useful when managing multiple ones). The global-status command will show all the VMs including those defined in other directories in their own Vagrantfile.
Vagrant gives you an easy to use computer within computer. You can manage a fleet of VMs for diverse purposes and the Vagrantfile is your interface for specifying how the VM should behave. Have fun exploring Vagrant. I just scratched the surface here.
Explore Advanced Vagrant Features