개발 환경 관리 및 가상 머신 프로비저닝을 위한 포괄적인 HashiCorp Vagrant 명령어와 워크플로우.
설치 및 설정
| 명령어 | 설명 |
|---|
vagrant version | Vagrant 버전 표시 |
vagrant -h | 도움말 정보 표시 |
vagrant init | 새로운 Vagrantfile 초기화 |
vagrant init ubuntu/jammy64 | 특정 박스로 초기화 |
박스 관리
박스 작업
| 명령어 | 설명 |
|---|
vagrant box list | 설치된 박스 목록 |
vagrant box add ubuntu/jammy64 | 상자 추가 |
vagrant box add --name mybox /path/to/box.box | 로컬 박스 추가 |
vagrant box remove ubuntu/jammy64 | 상자 제거 |
vagrant box update | 모든 상자 업데이트 |
vagrant box update --box ubuntu/jammy64 | 특정 박스 업데이트 |
박스 정보
| 명령어 | 설명 |
|---|
vagrant box outdated | 오래된 상자 확인 |
vagrant box prune | 오래된 박스 버전 제거 |
vagrant box repackage ubuntu/jammy64 | 상자 재포장 |
VM 라이프사이클 관리
기본 작업
| 명령어 | 설명 |
|---|
vagrant up | VM 시작 및 프로비저닝 |
vagrant halt | VM 종료 |
vagrant reload | VM 다시 시작 |
vagrant destroy | VM 제거 |
vagrant suspend | VM 일시 중단 |
vagrant resume | 일시 중단된 VM 재개 |
VM 상태 및 정보
| 명령어 | 설명 |
|---|
vagrant status | VM 상태 표시 |
vagrant global-status | 모든 VM 상태 표시 |
vagrant global-status --prune | 잘못된 항목 정리하기 |
SSH 및 접근
SSH 작업
| 명령어 | 설명 |
|---|
vagrant ssh | VM에 SSH 접속하기 |
vagrant ssh-config | SSH 구성 표시 |
vagrant ssh -- -L 8080:localhost:80 | SSH 포트 포워딩 |
프로비저닝
프로비저닝 명령어
| 명령어 | 설명 |
|---|
vagrant provision | 프로비저너 실행 |
vagrant provision --provision-with shell | 특정 프로비저너 실행 |
vagrant up --provision | 시작 및 프로비저닝 |
vagrant reload --provision | 다시 시작 및 프로비저닝 |
다중 머신 환경
다중 머신 명령어
| 명령어 | 설명 |
|---|
vagrant up web | 특정 머신 시작하기 |
vagrant ssh web | 특정 머신에 SSH 연결 |
vagrant halt db | 특정 기계 중지 |
vagrant destroy --force | 확인 없이 모두 제거 |
스냅샷
스냅샷 관리
| 명령어 | 설명 |
|---|
vagrant snapshot save snapshot_name | 스냅샷 저장 |
vagrant snapshot list | 스냅샷 목록 |
vagrant snapshot restore snapshot_name | 스냅샷 복원 |
vagrant snapshot delete snapshot_name | 스냅샷 삭제 |
플러그인 관리
플러그인 작업
| 명령어 | 설명 |
|---|
vagrant plugin list | 설치된 플러그인 목록 |
vagrant plugin install vagrant-vbguest | 플러그인 설치 |
vagrant plugin uninstall vagrant-vbguest | 플러그인 제거 |
vagrant plugin update | 모든 플러그인 업데이트 |
Vagrantfile 예시
기본 Vagrantfile
Vagrant.configure("2") do|config|
config.vm.box = "ubuntu/jammy64"
config.vm.hostname = "myserver"
# Network configuration
config.vm.network "private_network", ip: "192.168.56.10"
config.vm.network "forwarded_port", guest: 80, host: 8080
# Provider configuration
config.vm.provider "virtualbox" do|vb|
vb.memory = "2048"
vb.cpus = 2
vb.name = "MyVM"
end
# Provisioning
config.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install -y nginx
systemctl enable nginx
systemctl start nginx
SHELL
end
다중 머신 설정
Vagrant.configure("2") do|config|
# Web server
config.vm.define "web" do|web|
web.vm.box = "ubuntu/jammy64"
web.vm.hostname = "web"
web.vm.network "private_network", ip: "192.168.56.10"
web.vm.provider "virtualbox" do|vb|
vb.memory = "1024"
vb.cpus = 1
end
web.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install -y nginx
SHELL
end
# Database server
config.vm.define "db" do|db|
db.vm.box = "ubuntu/jammy64"
db.vm.hostname = "database"
db.vm.network "private_network", ip: "192.168.56.11"
db.vm.provider "virtualbox" do|vb|
vb.memory = "2048"
vb.cpus = 2
end
db.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install -y mysql-server
SHELL
end
end
고급 설정
Vagrant.configure("2") do|config|
config.vm.box = "ubuntu/jammy64"
config.vm.box_version = "20230607.0.0"
# Synced folders
config.vm.synced_folder ".", "/vagrant", disabled: true
config.vm.synced_folder "./app", "/var/www/html",
owner: "www-data", group: "www-data"
# Network configuration
config.vm.network "private_network",
ip: "192.168.56.10",
netmask: "255.255.255.0"
config.vm.network "public_network",
bridge: "en0: Wi-Fi (AirPort)"
# Port forwarding
config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.network "forwarded_port", guest: 443, host: 8443
# Provider-specific configuration
config.vm.provider "virtualbox" do|vb|
vb.gui = false
vb.memory = "4096"
vb.cpus = 4
vb.name = "Development Server"
# VirtualBox specific settings
vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
vb.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
end
# Multiple provisioners
config.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get upgrade -y
SHELL
config.vm.provision "file",
source: "./configs/nginx.conf",
destination: "/tmp/nginx.conf"
config.vm.provision "shell", path: "scripts/setup.sh"
config.vm.provision "ansible" do|ansible|
ansible.playbook = "playbook.yml"
ansible.inventory_path = "inventory"
end
end
프로비저닝 방법
쉘 프로비저닝
# Inline shell commands
config.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install -y docker.io
usermod -aG docker vagrant
SHELL
# External script
config.vm.provision "shell", path: "scripts/bootstrap.sh"
# Privileged and non-privileged
config.vm.provision "shell", privileged: false, inline: <<-SHELL
echo "Running as vagrant user"
SHELL
# Environment variables
config.vm.provision "shell", env: \\\\{"DEBIAN_FRONTEND" => "noninteractive"\\\\}, inline: <<-SHELL
apt-get install -y mysql-server
SHELL
파일 프로비저닝
config.vm.provision "file",
source: "~/.ssh/id_rsa.pub",
destination: "~/.ssh/authorized_keys"
config.vm.provision "file",
source: "./configs/",
destination: "/tmp/configs"
Ansible 프로비저닝
config.vm.provision "ansible" do|ansible|
ansible.playbook = "site.yml"
ansible.inventory_path = "inventory/vagrant"
ansible.limit = "all"
ansible.verbose = "v"
ansible.extra_vars = \\\\{
nginx_port: 80,
database_name: "myapp"
\\\\}
end
Docker 프로비저닝
config.vm.provision "docker" do|d|
d.pull_images "nginx"
d.pull_images "mysql:8.0"
d.run "nginx",
args: "-p 80:80 -v /vagrant/html:/usr/share/nginx/html"
d.run "mysql",
args: "-e MYSQL_ROOT_PASSWORD=secret -p 3306:3306"
end
네트워크 설정
프라이빗 네트워크
# Static IP
config.vm.network "private_network", ip: "192.168.56.10"
# DHCP
config.vm.network "private_network", type: "dhcp"
# Multiple interfaces
config.vm.network "private_network", ip: "192.168.56.10"
config.vm.network "private_network", ip: "10.0.0.10"
퍼블릭 네트워크
Would you like me to continue with the remaining sections? I noticed that some sections (3-20) are currently empty. If you have specific content for those sections, please provide them and I’ll translate accordingly.```ruby
Bridge to default interface
config.vm.network “public_network”
Bridge to specific interface
config.vm.network “public_network”, bridge: “en0: Wi-Fi (AirPort)“
Static IP on public network
config.vm.network “public_network”, ip: “192.168.1.100”
### 포트 포워딩
```ruby
# Basic port forwarding
config.vm.network "forwarded_port", guest: 80, host: 8080
# Multiple ports
config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.network "forwarded_port", guest: 443, host: 8443
config.vm.network "forwarded_port", guest: 3306, host: 3306
# Auto-correct port conflicts
config.vm.network "forwarded_port", guest: 80, host: 8080, auto_correct: true
프로바이더 구성
VirtualBox 프로바이더
config.vm.provider "virtualbox" do|vb|
vb.gui = true
vb.memory = "4096"
vb.cpus = 4
vb.name = "MyVM"
# Advanced settings
vb.customize ["modifyvm", :id, "--vram", "128"]
vb.customize ["modifyvm", :id, "--accelerate3d", "on"]
vb.customize ["modifyvm", :id, "--clipboard", "bidirectional"]
end
VMware 프로바이더
config.vm.provider "vmware_desktop" do|vmware|
vmware.vmx["memsize"] = "4096"
vmware.vmx["numvcpus"] = "4"
vmware.vmx["displayName"] = "MyVM"
end
Hyper-V 프로바이더
config.vm.provider "hyperv" do|hv|
hv.memory = 4096
hv.cpus = 4
hv.vmname = "MyVM"
end
동기화된 폴더
기본 동기화된 폴더
# Default synced folder (disabled)
config.vm.synced_folder ".", "/vagrant", disabled: true
# Custom synced folder
config.vm.synced_folder "./src", "/var/www/html"
# With options
config.vm.synced_folder "./app", "/var/www/html",
owner: "www-data",
group: "www-data",
mount_options: ["dmode=775,fmode=664"]
NFS 동기화된 폴더
config.vm.synced_folder "./", "/vagrant",
type: "nfs",
nfs_udp: false,
nfs_version: 4
SMB 동기화된 폴더 (Windows)
config.vm.synced_folder "./", "/vagrant",
type: "smb",
smb_username: "username",
smb_password: "password"
모범 사례
성능 최적화vagrant ssh-config리소스 할당: 적절한 CPU와 메모리 할당