Vagrantfile은 Ruby 문법으로 작성된다. 기본 구조는 다음과 같다.
Vagrant.configure("2") do |config|
config.vm.box = "bento/ubuntu-22.04"
end
Vagrant.configure("2") — 설정 API 버전. "2"는 Vagrant 1.1 이상의 현재 표준이다.do |config| — Ruby의 블록 문법으로, Vagrant 설정 객체를 config라는 이름으로 받는다.config.vm.box — 어떤 OS 이미지를 사용할지 지정. Docker의 image 개념과 유사하다.모든 box가 모든 provider를 지원하는 것은 아니다. 예를 들어 ubuntu/jammy64는 VirtualBox 전용이다. VMware Fusion을 사용하는 경우 bento/ubuntu-22.04처럼 VMware를 지원하는 box를 선택해야 한다.
provider 블록 안에서 설정한다.
config.vm.provider "vmware_desktop" do |wm|
wm.gui = true
wm.memory = 1024
wm.cpus = 2
end
free -m 명령으로 확인하면 1024MB보다 약간 적게(~961MB) 표시되는데, OS 커널이 부팅 시 일부 메모리를 예약하기 때문이다. 정상적인 동작이다.
free -m 출력에 Swap이 함께 표시된다. Swap은 디스크를 임시 메모리처럼 사용하는 공간이다.
Vagrant에서 VM 네트워크는 크게 Private Network와 Public Network로 나뉜다.
config.vm.network "private_network", ip: "192.168.31.10"
고정 IP를 지정하거나, type: "dhcp"로 자동 할당할 수 있다.
config.vm.network "public_network", bridge: "en0: Ethernet"
bridge — 호스트의 물리 네트워크 인터페이스 중 어떤 것을 통해 나갈지 지정VM 내부에서 ip addr show를 실행하면 각 인터페이스를 확인할 수 있다.
| 인터페이스 | 역할 | 설정 출처 |
|---|---|---|
| lo | 루프백 (127.0.0.1) | 시스템 기본 |
| eth0 | VMware NAT — 인터넷, SSH 연결용 | VMware 자동 생성 |
| eth1 | Private Network | Vagrantfile 설정 |
| eth2 | Public Network (bridge) | Vagrantfile 설정 |
시스템 전체에서 Vagrant가 관리하는 모든 VM의 상태를 보여준다. vagrant status는 현재 디렉토리의 VM만 보여주는 것과 다르다.
vagrant global-status
--prune 옵션을 붙이면 실제로 존재하지 않는 VM의 잔여 캐시를 정리해준다.
Vagrantfile을 수정했으면 vagrant reload로 반영해야 한다. 이미 running 상태인 VM은 vagrant up만으로는 변경사항이 적용되지 않는다.