콘텐츠로 이동

Vagrant

개발 환경 관리 및 가상 머신 프로비저닝을 위한 포괄적인 HashiCorp Vagrant 명령어와 워크플로우.

설치 및 설정

명령어설명
vagrant versionVagrant 버전 표시
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 upVM 시작 및 프로비저닝
vagrant haltVM 종료
vagrant reloadVM 다시 시작
vagrant destroyVM 제거
vagrant suspendVM 일시 중단
vagrant resume일시 중단된 VM 재개

VM 상태 및 정보

명령어설명
vagrant statusVM 상태 표시
vagrant global-status모든 VM 상태 표시
vagrant global-status --prune잘못된 항목 정리하기

SSH 및 접근

SSH 작업

명령어설명
vagrant sshVM에 SSH 접속하기
vagrant ssh-configSSH 구성 표시
vagrant ssh -- -L 8080:localhost:80SSH 포트 포워딩

프로비저닝

프로비저닝 명령어

명령어설명
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와 메모리 할당