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"
VM은 물리적인 장비가 아니라서 실제 랜선을 꽂을 수 없다. 그래서 호스트(내 PC)의 네트워크 통로를 빌려서 공유기에 연결하는데, 내 PC에 네트워크 연결이 여러 개(유선, Wi-Fi 등) 있을 수 있으므로 어떤 통로를 빌릴지 지정해야 한다. 이것이 bridge다.
# "유선(Ethernet) 통로를 빌려줘"
config.vm.network "public_network", bridge: "en0: Ethernet"
bridge를 지정하지 않으면 vagrant up 시 어떤 인터페이스를 사용할지 물어본다.
| Private Network | Public Network | |
|---|---|---|
| 비유 | 집 안 인터폰 | 방에 외부 전화번호 부여 |
| 외부 접근 | 불가 | 가능 |
| IP 할당 | 직접 지정 | 공유기가 DHCP로 할당 |
| bridge 필요 | 불필요 | 필요 (어떤 통로를 빌릴지) |
| 용도 | VM끼리 통신 | 외부에서 VM 접근 |
VM 내부에서 ip addr show를 실행하면 각 인터페이스를 확인할 수 있다. eth는 Ethernet의 줄임말로, 가상 네트워크 카드 하나하나를 의미한다. 번호는 인터페이스가 생성된 순서다.
| 인터페이스 | 역할 | 설정 출처 |
|---|---|---|
| lo | 루프백 (127.0.0.1) | 시스템 기본 |
| eth0 | VMware NAT — 인터넷, SSH 연결용 | VMware 자동 생성 |
| eth1 | Private Network | Vagrantfile 설정 (먼저 선언) |
| eth2 | Public Network (bridge) | Vagrantfile 설정 (나중 선언) |
Vagrantfile에서 네트워크 선언 순서를 바꾸면 eth1, eth2의 역할도 바뀐다.
Vagrant.configure("2") do |config|
config.vm.box = "bento/ubuntu-22.04"
# Add synced_folter
config.vm.synced_folder "./scripts", "/opt/scripts"
# Private network with static IP
config.vm.network "private_network", ip: "192.168.31.10"
# Public network (bridged), no static IP
config.vm.network "public_network", bridge: "en0: Ethernet" # Adjust bridged
config.vm.provider "vmware_desktop" do |wm|
wm.gui = true
wm.memory = 1024
wm.cpus = 2
end
end
시스템 전체에서 Vagrant가 관리하는 모든 VM의 상태를 보여준다. vagrant status는 현재 디렉토리의 VM만 보여주는 것과 다르다.
vagrant global-status
--prune 옵션을 붙이면 실제로 존재하지 않는 VM의 잔여 캐시를 정리해준다.
Vagrantfile을 수정했으면 vagrant reload로 반영해야 한다. 이미 running 상태인 VM은 vagrant up만으로는 변경사항이 적용되지 않는다.