가상머신 관리도구인 Vagrant를 통하여 Node.js + MongoDB 개발환경을 구축해 본다.
1. 설치
- VirtualBox 다운로드 및 설치
- Vagrant 다운로드 및 설치
- Vagrant 환경 설정
+ 프로젝트 디렉토리를 하나 만든다. 또는 기존 Project가 있으면 디렉토리로 이동한다. VirtualBox에 원하는 이미지를 다운로드하여 설치한다. 이미지는 Vagrant에서 패키징한 Box를 다운로드할 수 있는 별도 사이트를 제공한다
+ Box는 기본설정과 OS가 설치된 VM 템플릿 이미지이다
// 형식 : vagrant box add [title] [download-url]
$ vagrant box add centos64 http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130427.box
Downloading or copying the box...
+ 프로젝트를 초기화 한다
$ vagrant init centos64
// 결과 : 환경설정 파일 1개 생성됨
Vagrantfile
2. 가상머신 기동
- Vagrant 통해 가상머신 기동하기
// 기동
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
[default] Importing base box 'centos64'...
[default] Matching MAC address for NAT networking...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports...
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
[default] Preparing network interfaces based on configuration...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] Booting VM...
[default] Waiting for VM to boot. This can take a few minutes.
[default] VM booted and ready for use!
[default] Mounting shared folders...
[default] -- /vagrant
// VirtualBox VM이 자동으로 수행된 것을 볼 수 있다
// VM 들어가기 : 같은 디렉토리면 ssh를 n개까지 open 가능
// ssh를 통하여 별도의 VM 으로 들어갈 수가 있는 것이다.
// 단, vagrant init [title] 된 Vagrantfile 파일이 같은 디렉토리에 있어야 함
$ vagrant ssh
Welcome to your Vagrant-built virtual machine.
[vagrant@localhost ~]$
// 정지
$ vagrant halt
3. Node.js & MongoDB, etc 개발환경 구축하기
- 제일 먼저 yum update 수행, 프로젝트 파일과 관계없는 운영 미들웨어 및 데이터베이스 설정이다.
+ 컴파일해서 설치함
+ yeoman, grunt, bower 설치 : sudo npm install -g yo grunt-cli bower
+ yeoman generator 설치 : sudo npm install -g generator-webapp
- Sails.js Framework 기반 개발을 위하여 설치
+ sudo npm install -g sails@0.8.9
+ 버전 지정안하면 최신 버전인 0.9.5 설치됨
4. 애플리케이션 활용하기
- 개발환경을 구축하고 자신의 로컬머신에 있는 프로젝트 파일을 VM에도 설치해야 하는가?
재배포 필요없이 로컬에 있는 파일을 VM에 sync folder 기능을 이용하여 Share 할 수 있다
- 프로젝트 파일 공유 : Vagrantfile 내역 (참조)
// 형식
config.vm.synced_folder "[내 로컬머신의 디렉토리 절대경로]", "[VM에 로딩할 절대경로와 가상디렉토리명 지정]"
// 설정 예
config.vm.synced_folder "/Users/development/smart-solutions/SmartStatistics", "/home/vagrant/SmartStatistics"
// VM reloading 및 결과
/Users/development/smart-solutions/SmartStatistics> vagrant reload
[default] Attempting graceful shutdown of VM...
[default] Setting the name of the VM...
.. 중략 ..
[default] Mounting shared folders...
[default] -- /vagrant
[default] -- /home/vagrant/SmartStatistics
/Users/development/smart-solutions/SmartStatistics> vagrant ssh
Last login: Mon Aug 12 08:09:35 2013 from 10.0.2.2
Welcome to your Vagrant-built virtual machine.
[vagrant@localhost ~]$ sudo iptables -F
[vagrant@localhost ~]$ cd SmartStatistics/
[vagrant@localhost SmartStatistics]$ pwd
/home/vagrant/SmartStatistics
- 로컬과 VM의 파일을 서로 Share하였고 서버를 뛰우면 VM에서도 동일 Port로 뜰 것이다. 예) Sails는 default 1337 port를 사용한다
VM은 1337 port 를 사용하고 로컬 머신은 1338 port를 사용해서 port forwarding을 한다.
즉, 로컬 머신의 브라우져에서 http://localhost:1338 호출하면 VM의 1337 port를 통하여 서비스가 이루어진다(Port Forwarding)
- 포트 충돌 해결 : Vagrantfile 내역 (참조)
// 형식
config.vm.network :forwarded_port, guest: [VM에서 사용할 port번호], host: [내 로컬머신에서 사용할 port 번호]
// 설정 예
config.vm.network :forwarded_port, guest: 1337, host: 1338
// VM reloading 및 결과
/Users/development/smart-solutions/SmartStatistics> vagrant reload
[default] Attempting graceful shutdown of VM...
[default] Setting the name of the VM...
[default] Forwarding ports...
.. 중략 ..
[default] -- 22 => 2222 (adapter 1)
[default] -- 1337 => 1338 (adapter 1)
[default] Booting VM...
[default] Mounting shared folders...
[default] -- /vagrant
[default] -- /home/vagrant/SmartStatistics
- vagrant VM
[vagrant@localhost SmartStatistics]$ netstat -na | grep 1337
tcp 0 0 0.0.0.0:1337 0.0.0.0:* LISTEN
- local my machine
/Users/development/smart-solutions/SmartStatistics> netstat -na|grep 1338
tcp4 0 0 *.1338 *.* LISTEN
- 테스트 수행 : port forwarding이 안될 경우 "sudo iptables -F" 를 통하여 강제 재설정을 해준다. 그리고 다시 curl 수행하여 체크
// curl 이용하여 호출을 했는데 결과값이 나오지 않으면 iptables 에 대한 설정을 해준다
/Users/development/smart-solutions/SmartStatistics> curl -v http://localhost:1338/
* About to connect() to localhost port 1338 (#0)
* Trying ::1...
* Connection refused
* Trying 127.0.0.1...
* connected
* Connected to localhost (127.0.0.1) port 1338 (#0)
// vagrant ssh (port forwarding이 안될 경우)
// 하기 명령을 .bash_profile 에 넣어서 자동화 한다
/Users/development/smart-solutions/SmartStatistics> vagrant ssh
Last login: Mon Aug 12 08:09:35 2013 from 10.0.2.2
Welcome to your Vagrant-built virtual machine.
[vagrant@localhost ~]$ sudo iptables -F
- 로컬 머신의 브라우져에서 호출 : "http://localhost:1338"
5. Package 만들기
- 기존에 쓰던 VM 이미지를 Vagrant의 Box로 만들어서 개발환경을 미리 패키징할 수 있다
// 형식 : vagrant package --base <target> --output <output>.box
6. Provisioning 하기
- Vagrant up 수행시 최초 실행되는 매크로 관리 도구인 Chef를 사용한다
- Chef Solo Provisioning 을 하면 Chef Server가 필요없이 사용할 수 있다
- Opscode Cookbooks 에서 원하는 receipe 를 내려받아서 설정해 놓으면 자동 실행된다
<참조>
- SKPlanet의 Vagrant 설치 및 자료