Virtual Box, Vagrant를 이용한 가상 머신 환경 만들기

Paul
13 min readAug 15, 2020

--

Photo by Christine Sandu on Unsplash

제가 대학교 다닐 때 윈도우 환경에 가상화 프로그램 설치 후 리눅스 설치하거나, 멀티 부팅으로 윈도 또는 리눅스 설치해서 개발을 했는데요. 설치도 쉽지 않고, 설치해도 잘 동작을 하지 않아서 삽질을 엄청 했던 것 같습니다.
요즘에는 오프소스 툴인 VirtaulBox(Oracle), Vagrant(HashCorp)만 있다면 CentOS, Ubuntu 및 다양한 환경을 단 몇 분 만에 가상머신 환경을 구성할 수 습니다.

왜 로컬 가상 환경이 필요한가?

  • “내 맥은 소중하니까” 개발코드 및 컴파일 환경을 제외하고 불필요한 프로그램을 설치할 필요가 없습니다.
  • 개발 테스트 환경을 코드로 관리 가능하며, 명령어 한 줄이며, 몇 분 만에 개발 코드가 돌아가는 서버 환경 구성이 가능합니다.
  • 다양한 오픈소스인 k8s, 머신러닝 같은 환경을 구성하고 테스트를 할 수 있습니다.

그 이외 많은 장점이 있지만, 개발 환경을 코드로 관리할 수 있다는 것은 매우 큰 장점인 것 같습니다.

VirtualBox 설치

아래의 링크에서 VirtualBox를 설치하세요.

Vagrant 설치

아래의 링크에서 Vagrant를 설치하세요.

VirtaulBox, Vagrant 버전에 조금 민감한 부분이 있는 것 같아서 모두 최신으로 설치하시길 바랍니다.

Vagrant 실행하기

vagrant 설치가 완료되었다면 Command 창을 띄우세요. vagrant — help 입력하시면 아래와 같이 명령어가 나옵니다.

명령어가 많이 있지만, 실제 업무에 사용하는 명령어는 몇 개 안됩니다. 더 자세한 내용은 아래의 링크를 참고 바랍니다.

vagrant 실행하기 위해서는 Vagrantfile 이 꼭 필요합니다. vagrant init 명령어를 실행하시면 Vagrantfile이 자동으로 생성이 됩니다.

Vagrantfile 파일을 열어보시면 엄청 긴 내용이 있는데, 실제로 필요한 내용은 별로 없고, 나중에 자신의 개발 환경에 맞게 수정해서 사용하시면 됩니다.

Vagrantfile

아래의 Vagrantfile에서 자주 사용되는 내용을 간추려서 작성을 했습니다.

  1. config.vm.synced_folder는 호스트 PC의 폴더와 가상 머신 환경에서 /vagrant 폴더로 마운트 됩니다.
  2. host.vm.box 는 가상머신 환경에 사용할 기본 이미지 이며, ubuntu 18.04 이미지 사용합니다. https://app.vagrantup.com/boxes/search 사이트에 가시면 다양한 이미지가 공개되어 있고, 필요한 이미지를 검색해서 사용하시면 됩니다.
  3. host.vm.network 는 가상머신에서 사용할 private ip 주소를 설정합니다.
  4. host.vm.disk는 가상 머신이 사용할 Disk 크기를 설정합니다.
  5. host.vm.provision는 가상머신이 실행되고 초기 provision를 하기 위한 shell 파일을 설정합니다.
  6. host.vm.provider 는 가상머신의 CPU, Memory 사용량을 할당하며, 호스트 PC와 가상머신 환경의 시간 동기화를 위한 설정합니다.

이외 더 많은 설정이 있으며, 아래의 링크를 참고 바랍니다.

bootstrap.sh

bootstrap.sh 파일은 가상머신 실행 후 해당 스크립트를 실행해서 가상머신의 환경을 설정합니다. 위의 내용은 패키지 다운로드 주소를 ftp.daum.net 주소로 설정을 합니다. 그 외 다양하게 개발 환경에 필요한 Redis, Memcached, Nginx, Apache 서버와 같은 패키지를 설치할 수 있습니다.

여러 개의 가상 머신 환경 생성 (Defining Multiple Machines)

Vagrantfile는 ruby 코드를 지원합니다. 따라서 간단하게 for 문을 통해서 여러 개의 가상 머신 환경을 한 번에 생성이 가능합니다.

Vagrant 실행하기

Vagrantfile, bootstrap.sh 파일을 동일 폴더에 생성 후 vagrant up를 실행됩니다. vagrant up의 추가 옵션을 보고 싶다면, vagrant up — help 하시면 됩니다.

$ tree
/
├── Vagrantfile
└── bootstrap.sh
$ vagrant up
Bringing machine 'ubuntu' up with 'virtualbox' provider...
==> ubuntu: Importing base box 'bento/ubuntu-18.04'...
==> ubuntu: Matching MAC address for NAT networking...
==> ubuntu: Checking if box 'bento/ubuntu-18.04' version '202003.31.0' is up to date...
==> ubuntu: A newer version of the box 'bento/ubuntu-18.04' for provider 'virtualbox' is
==> ubuntu: available! You currently have version '202003.31.0'. The latest is version
==> ubuntu: '202007.17.0'. Run `vagrant box update` to update.
==> ubuntu: Setting the name of the VM: vagrant_ubuntu_1596638676275_91625
==> ubuntu: Clearing any previously set network interfaces...
==> ubuntu: Preparing network interfaces based on configuration...
ubuntu: Adapter 1: nat
ubuntu: Adapter 2: hostonly
==> ubuntu: Forwarding ports...
ubuntu: 22 (guest) => 2222 (host) (adapter 1)
==> ubuntu: Running 'pre-boot' VM customizations...
==> ubuntu: Booting VM...
==> ubuntu: Waiting for machine to boot. This may take a few minutes...
ubuntu: SSH address: 127.0.0.1:2222
ubuntu: SSH username: vagrant
ubuntu: SSH auth method: private key
ubuntu: your host and reload your VM.
...
==> ubuntu: Running provisioner: shell...
ubuntu: Running: /var/folders/yj/b6b80ws56cdcf09zkqbjwk6m0000gn/T/vagrant-shell20200805-32520-18lxwtr.sh
ubuntu: Get:1 http://mirror.kakao.com/ubuntu bionic InRelease [242 kB]
...

가상머신에 SSH 접속하기

가상 머신 환경에 접속을 하기 위해서는 몇 가지 방법이 있지만 vagrant ssh 명령어를 사용하면 더 편리합니다. vagrant ssh 추가 옵션을 보고 싶다면 vagrant ssh — help를 입력하시면 됩니다.

$ vagrant ssh ubuntu
Welcome to Ubuntu 18.04.4 LTS (GNU/Linux 4.15.0-91-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
System information as of Wed Aug 5 14:49:11 UTC 2020System load: 0.17 Processes: 103
Usage of /: 2.5% of 61.80GB Users logged in: 0
Memory usage: 6% IP address for eth0: 10.0.2.15
Swap usage: 0% IP address for eth1: 192.168.2.10
* Are you ready for Kubernetes 1.19? It's nearly here! Try RC3 with
sudo snap install microk8s --channel=1.19/candidate --classic
https://www.microk8s.io/ has docs and details.117 packages can be updated.
80 updates are security updates.
This system is built by the Bento project by Chef Software
More information can be found at https://github.com/chef/bento
vagrant@ubuntu:~$
vagrant@ubuntu:~$

가상 머신 환경에 Nginx 서버 설치하기

가상 머신 환경에 Nginx를 설치하겠습니다. Ubuntu apt-get를 통하여 설치를 하겠습니다.

vagrant@ubuntu:~$ sudo su
root@ubuntu:/home/vagrant# apt-get install nginx

...
root@ubuntu:/home/vagrant# ps -ef | grep nginx
root 2706 1 0 02:45 ? 00:00:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data 2707 2706 0 02:45 ? 00:00:00 nginx: worker process
www-data 2708 2706 0 02:45 ? 00:00:00 nginx: worker process

Nginx 서버 설치가 완료된 후에 호스트 PC에서의 브라우저에서 http://192.168.2.10 (Vagrantfile의 Private IP 설정 값)으로 접속을 하시면 아래와 같이 초기 페이지를 볼 수 있습니다.

호스트와 가상 머신 환경에서의 파일 공유

호스트 PC에서 vagrantfile 있는 폴더를 가상 머신 환경의 /vagrant 폴더와 자동으로 마운트가 됩니다.

root@ubuntu:/vagrant# pwd
/vagrant
root@ubuntu:/vagrant# ls -al
total 12
drwxr-xr-x 1 vagrant vagrant 192 Aug 5 14:44 .
drwxr-xr-x 24 root root 4096 Aug 9 02:42 ..
-rwxr-xr-x 1 vagrant vagrant 133 Aug 5 14:39 bootstrap.sh
drwxr-xr-x 1 vagrant vagrant 256 Aug 5 14:37 .idea
drwxr-xr-x 1 vagrant vagrant 160 Aug 5 14:44 .vagrant
-rw-r--r-- 1 vagrant vagrant 839 Aug 5 14:40 Vagrantfile
root@ubuntu:/vagrant#

가상 머신 환경의 /vagrant 폴더로 이동해 보시면 호스트 머신에 있는 Vagrantfile, bootstrap.sh 파일을 보입니다. 호스트의 파일을 가상 머신 환경으로 복사를 하거나, 가상머신 환경의 파일을 호스트로 가지고 오실 때도 해당 폴더를 이용해서 공유를 하시면 됩니다.

가상머신 종료 및 삭제 하기

가상 머신 환경을 종료 및 삭제를 위하여 vagrant halt, vagrant destroy 명령어를 사용합니다.

vagrant@ubuntu:~$ exit
logout
Connection to 127.0.0.1 closed.
$ vagrant halt
==> ubuntu: Attempting graceful shutdown of VM...
$ vagrant destroy
ubuntu: Are you sure you want to destroy the 'ubuntu' VM? [y/N] y
==> ubuntu: Destroying VM and associated drives...

정리하며

지금까지 vagrant을 통한 가상 머신 환경 구성을 해 봤습니다. Vagrantfile만 있다면 가상 머신 환경을 쉽게 생성하고 쉽게 삭제가 가능합니다. 또한 개발 테스트 환경을 코드로 관리할 수 있다는 것은 장점을 가지고 있습니다.

vagrant 실행 명령어를 정리하면 아래와 같습니다.

  • vagrant init 명령어를 실행하여, Vagrantfile 생성
  • vagrant up [name|id] 명령어로 가상 머신 실행
  • vagrant ssh [name|id] 명령어로 가상 머신 환경(게스트 OS)에 접속
  • vagrant halt 명령어로 가상 머신 종료
  • vagrant destroy 명령어로 가상 머신 환경 삭제

다음에는 Vagrant, Ansible, Docker를 활용해서 더 편리하게 개발 테스트 환경을 구성하는 방법에 대해서 알아보도록 하겠습니다.

--

--