- 1. ผลลัพธ์ที่ผู้เรียนจะได้รับ
- 2. พื้นฐาน Virtualization
- 3. ออกแบบระบบที่จะทดลอง
- 4. ติดตั้ง VirtualBox และ Vagrant
- 5. สร้างโครงสร้างโปรเจกต์
- 6. เขียน Vagrantfile เพื่อสร้าง VM
- 7. สร้างหน้าเว็บสำหรับการทดลอง
- 8. ทำ Automatic Provisioning ด้วย Shell Script
- 9. เริ่มต้นเครื่อง Virtual Machine
- 10. ทดสอบการเข้าถึงผ่าน Host
- 11. ฝึกใช้งาน Synced Folder และ Provisioning ซ้ำ
- 12. คำสั่ง Vagrant ที่ควรรู้
- 13. ทดลอง Snapshot และการคืนค่า
- 14. แบบฝึกหัดเพิ่มเติมสำหรับห้องปฏิบัติการ
- 15. Troubleshooting: ปัญหาที่พบบ่อย
- 16. สำคัญ: การใช้งาน Vagrant Box หลังปี 2026
- 17. ความปลอดภัยและแนวปฏิบัติที่ดี
- 18. เกณฑ์ประเมินผล Workshop
- 19. สรุป
- 20. แหล่งอ้างอิง / เอกสารเพิ่มเติม
เป้าหมาย Workshop: ใช้เครื่องคอมพิวเตอร์หนึ่งเครื่องสร้าง Ubuntu 24.04 Virtual Machine (VM) ด้วย VirtualBox และ Vagrant ตั้งค่าเครือข่าย ติดตั้ง Nginx อัตโนมัติ แล้วเปิดเว็บผ่านเบราว์เซอร์ของเครื่อง Host ที่
http://localhost:8080
บทความนี้เหมาะสำหรับผู้เรียน Software Engineering, DevOps, Cloud Computing และผู้เริ่มต้นดูแลระบบ Linux โดยเน้น เข้าใจหลักการ → ทำตามได้จริง → ตรวจสอบผล → ทดลองขยายระบบ

#1. ผลลัพธ์ที่ผู้เรียนจะได้รับ
เมื่อจบ Workshop ผู้เรียนจะสามารถ:
- อธิบายความหมายของ Virtualization, Hypervisor, Host OS และ Guest OS
- เปรียบเทียบ Type 1 และ Type 2 Hypervisor รวมถึง VM กับ Container
- ตรวจสอบความพร้อมของเครื่องสำหรับ Hardware Virtualization
- สร้าง Ubuntu VM ผ่านไฟล์
Vagrantfile(Infrastructure as Code) - ใช้
vagrant up,ssh,status,provision,reload,halt,snapshotและdestroy - อธิบาย NAT, Port Forwarding, Private/Host-only Network และ Shared Folder
- ให้บริการเว็บด้วย Nginx และทดสอบผ่าน
curlหรือเว็บเบราว์เซอร์ - แก้ปัญหาเบื้องต้นและจัดเตรียมผลการทดลองสำหรับส่งงาน
เวลาที่แนะนำ: 90–150 นาที สำหรับภาคปฏิบัติ ทั้งนี้ขึ้นอยู่กับความเร็วอินเทอร์เน็ตและประสิทธิภาพเครื่อง
#สิ่งที่ต้องเตรียม
| รายการ | คำแนะนำ |
|---|---|
| Host OS | Windows 10/11 หรือ Linux หรือ macOS ที่ VirtualBox รองรับ |
| CPU | รองรับ Intel VT-x / AMD-V หรือสถาปัตยกรรมที่ VirtualBox รองรับ |
| RAM | อย่างน้อย 8 GB สำหรับการทดลอง 1 VM; 16 GB จะสะดวกกว่า |
| พื้นที่ว่าง | แนะนำอย่างน้อย 15–20 GB |
| เครื่องมือ | VirtualBox, Vagrant, Terminal/PowerShell, เว็บเบราว์เซอร์ |
| เครือข่าย | อินเทอร์เน็ตสำหรับดาวน์โหลด Box และแพ็กเกจ Ubuntu |
| Guest OS | Ubuntu 24.04 LTS ผ่าน bento/ubuntu-24.04 |
ตัวเลข RAM/Storage เป็น ขนาดแนะนำสำหรับการเรียน ไม่ใช่ข้อกำหนดขั้นต่ำอย่างเป็นทางการของ VirtualBox หรือ Ubuntu ภายใน VM จะจัดสรร RAM 2 GB และ 2 vCPU
#2. พื้นฐาน Virtualization
Virtualization (การจำลองเสมือน) คือเทคนิคแยกการใช้งานทรัพยากรประมวลผลออกจากเครื่องจริง เพื่อให้มีสภาพแวดล้อมเสมือนหลายชุดที่จัดการแยกจากกันได้ ตัวอย่างที่พบได้บ่อยที่สุดคือ Virtual Machine ซึ่งจำลองฮาร์ดแวร์ที่จำเป็นให้ระบบปฏิบัติการ Guest ทำงาน
ตัวอย่างการแบ่งหน้าที่:
- Host: คอมพิวเตอร์จริงที่รัน VirtualBox
- Hypervisor: ซอฟต์แวร์ระดับ Virtualization ที่จัดการทรัพยากรและการประมวลผลของ VM
- Guest / VM: Ubuntu ที่ทำงานแยกจาก Host
- Vagrant: เครื่องมือสั่งสร้างและจัดการ VM ผ่านไฟล์กำหนดค่า ไม่ใช่ Hypervisor
- Box: อิมเมจหรือแพ็กเกจพื้นฐานของ VM ที่เตรียมมาสำหรับ Provider เช่น VirtualBox
#2.1 ภาพรวมสถาปัตยกรรม
flowchart TB H[Physical Computer: CPU / RAM / SSD / NIC] O[Host Operating System] V[VirtualBox: Hosted Hypervisor] A[Ubuntu VM: Linux + Nginx] B[Other VM: Linux / Windows] C[Vagrant CLI + Vagrantfile] H --> O --> V V --> A V --> B C -. "สั่งและกำหนดค่า VM" .-> V
Hypervisor Type 1 ทำงานในระดับโครงสร้างพื้นฐานใกล้กับฮาร์ดแวร์ เช่น VMware ESXi และ Microsoft Hyper-V ส่วน Type 2 ทำงานบน Host OS เช่น VirtualBox และ VMware Workstation การจัดกลุ่ม KVM มีรายละเอียดเฉพาะ เพราะเป็นส่วนหนึ่งของ Linux Kernel และมักจัดเป็น Type 1 ตามนิยามอุตสาหกรรม
#2.2 VM ต่างจาก Container อย่างไร?
| ประเด็น | Virtual Machine | Container |
|---|---|---|
| ระดับการจำลอง | จำลองเครื่องและทรัพยากรฮาร์ดแวร์ | แยกกระบวนการ/แอปพลิเคชัน |
| ระบบปฏิบัติการ | Guest OS ของตนเอง | ใช้ Kernel ร่วมกับ Host ตามสถาปัตยกรรม Container |
| ทรัพยากร | โดยทั่วไปใช้มากกว่า | โดยทั่วไปใช้ทรัพยากรน้อยกว่า |
| การเริ่มต้น | มักช้ากว่า Container | มักเริ่มได้เร็วกว่า |
| กรณีใช้ | OS ที่ต่างกัน, Infrastructure Lab, Isolation | Microservices, CI/CD, Deploy แอปพลิเคชัน |
ข้อควรระวัง: บน macOS/Windows บางระบบ Container Runtime ใช้ Linux VM อยู่เบื้องหลัง จึงไม่ใช่กฎตายตัวว่า Container ทำงานโดยไม่ใช้ VM เสมอไป
#3. ออกแบบระบบที่จะทดลอง
Workshop ใช้โครงสร้างดังนี้
เครื่อง Host (Windows / Linux / macOS)
┌──────────────────────────────────────┐
│ เว็บเบราว์เซอร์ │
│ http://localhost:8080 │
│ │ │
│ │ Port Forward │
│ ▼ │
│ VirtualBox │
│ ┌─────────────────────┐ │
│ │ Ubuntu 24.04 VM │ │
│ │ 2 vCPU / RAM 2 GB │ │
│ │ Nginx: port 80 │ │
│ │ 192.168.56.10 │ │
│ └─────────────────────┘ │
│ ▲ │
│ │ │
│ Vagrant + Vagrantfile │
└──────────────────────────────────────┘
#แผน IP/Port
| รายการ | ค่า |
|---|---|
| Host | เครื่องผู้เรียน |
| Guest | Ubuntu VM |
| NAT | VirtualBox Network Adapter หลัก สำหรับออกอินเทอร์เน็ต |
| Host-only/Private IP | 192.168.56.10 |
| Web Port ใน Guest | 80/tcp |
| Web Port บน Host | 127.0.0.1:8080 |
| SSH | ใช้ vagrant ssh ให้ Vagrant จัดการการเชื่อมต่อ |
เหตุผลที่กำหนด host_ip: "127.0.0.1": เพื่อจำกัดเว็บที่ Forward Port ให้รับจากเครื่อง Host เอง ไม่เปิดพอร์ตดังกล่าวให้เครื่องอื่นใน LAN โดยไม่ตั้งใจ อย่างไรก็ตาม IP ฝั่ง Host-only (192.168.56.10) เป็นอีกเส้นทางหนึ่ง จึงควรตรวจสอบเครือข่ายและ Firewall ก่อนนำไปใช้กับข้อมูลจริง
#4. ติดตั้ง VirtualBox และ Vagrant
#Step 1: ดาวน์โหลดเครื่องมือ
- Oracle VirtualBox: https://www.virtualbox.org/wiki/Downloads
- HashiCorp Vagrant: https://developer.hashicorp.com/vagrant/install
- Vagrant Documentation: https://developer.hashicorp.com/vagrant/docs
ให้เลือกตัวติดตั้งตรงกับระบบปฏิบัติการและสถาปัตยกรรม CPU ของ Host ติดตั้ง VirtualBox ก่อน แล้วจึงติดตั้ง Vagrant หลังติดตั้งอาจต้องเปิด Terminal ใหม่หรือรีสตาร์ตเครื่องตามที่ตัวติดตั้งแจ้ง
ณ วันที่จัดทำ เอกสาร HashiCorp ระบุว่า Vagrant VirtualBox Provider รองรับ VirtualBox สาย 7.0, 7.1 และ 7.2 ให้ตรวจสอบคู่เวอร์ชันอีกครั้งเมื่อใช้เอกสารนี้ในอนาคต เอกสาร Provider
#Step 2: ตรวจสอบการติดตั้ง
เปิด PowerShell (Windows) หรือ Terminal (macOS/Linux) แล้วสั่ง:
vagrant --version
VBoxManage --version
หากคำสั่ง VBoxManage ไม่พบใน Windows ให้ปิด PowerShell แล้วเปิดใหม่ หรือตรวจสอบว่าตำแหน่งติดตั้ง VirtualBox อยู่ใน PATH (ค่าเริ่มต้นมักอยู่ที่ C:\Program Files\Oracle\VirtualBox)
#Step 3: ตรวจสอบ Hardware Virtualization
Windows: เปิด Task Manager → Performance → CPU → ดูช่อง Virtualization ว่า Enabled หรือไม่
Linux (บนเครื่อง Host ที่ใช้ x86):
grep -E 'vmx|svm' /proc/cpuinfo | head
หากไม่พบคุณสมบัติที่ต้องใช้ ให้ตรวจสอบ BIOS/UEFI สำหรับ Intel VT-x หรือ AMD-V/SVM อย่างระมัดระวัง (ชื่อเมนูแตกต่างกันตามผู้ผลิต)
ผู้ใช้ Windows + WSL2 / Hyper-V อาจพบพฤติกรรมของ VirtualBox แตกต่างตามเวอร์ชันและการตั้งค่า Windows Hypervisor โปรดตรวจสอบข้อความผิดพลาดและคู่มือ VirtualBox ก่อนปรับฟีเจอร์ระบบ ไม่ควรปิดฟีเจอร์รักษาความปลอดภัยของ Windows โดยไม่ประเมินผลกระทบ
#5. สร้างโครงสร้างโปรเจกต์
สร้างโฟลเดอร์ชื่อ virtualization-workshop ในตำแหน่งที่ใช้งานสะดวก เช่น D:\labs\ หรือโฟลเดอร์ Home
virtualization-workshop/
├── Vagrantfile
├── provision.sh
├── site/
│ └── index.html
├── assets/
│ └── virtualization-infographic.png
├── .gitignore
└── README.md
สร้างโฟลเดอร์ด้วยคำสั่งที่ตรงกับ Shell ของตนเอง
PowerShell (Windows):
New-Item -ItemType Directory -Force -Path virtualization-workshop, virtualization-workshop/site
Set-Location virtualization-workshop
Bash (Linux/macOS):
mkdir -p virtualization-workshop/site
cd virtualization-workshop
จากนั้นเปิด VS Code หรือโปรแกรมแก้ไขข้อความเพื่อสร้างไฟล์ในหัวข้อถัดไป ไม่จำเป็นต้องใช้ vagrant init เมื่อสร้าง Vagrantfile เอง
#6. เขียน Vagrantfile เพื่อสร้าง VM
สร้างไฟล์ชื่อ Vagrantfile (ไม่มีนามสกุล) และวางโค้ดต่อไปนี้:
# Virtualization Workshop: Ubuntu 24.04 + Nginx
Vagrant.configure("2") do |config|
# Base image / Guest OS
config.vm.box = "bento/ubuntu-24.04"
config.vm.hostname = "virt-lab"
# Host 127.0.0.1:8080 -> Guest :80
config.vm.network "forwarded_port", guest: 80, host: 8080,
host_ip: "127.0.0.1"
# IP ที่ Host จะเข้าถึง VM ผ่าน Host-only network
config.vm.network "private_network", ip: "192.168.56.10"
# โฟลเดอร์บน Host -> โฟลเดอร์ใน Guest
config.vm.synced_folder "./site", "/srv/virtualization-site", create: true
config.vm.provider "virtualbox" do |vb|
vb.name = "virtualization-ubuntu-lab"
vb.memory = 2048
vb.cpus = 2
end
# ติดตั้งแพ็กเกจและเตรียมเว็บเซิร์ฟเวอร์อัตโนมัติ
config.vm.provision "shell", path: "provision.sh"
end
อธิบายคำสั่งหลัก:
| ตัวแปร/คำสั่ง | ความหมาย |
|---|---|
config.vm.box |
เลือก Ubuntu 24.04 Base Box |
config.vm.hostname |
ชื่อ Hostname ภายใน VM |
forwarded_port |
ส่งคำขอจาก Host port 8080 ไปยัง Guest port 80 |
host_ip |
จำกัดการเข้าถึง Port Forward บน localhost |
private_network |
สร้างเครือข่ายส่วนตัวระหว่าง Host และ VM |
synced_folder |
แชร์โฟลเดอร์ site ให้ Guest อ่านได้ |
vb.memory |
จัดสรรหน่วยความจำ 2,048 MB |
vb.cpus |
จัดสรร 2 vCPU |
config.vm.provision |
เรียก Shell Script เพื่อติดตั้งและตั้งค่าระบบ |
ข้อควรรู้:
bento/ubuntu-24.04เป็นชื่อ Box ที่ HashiCorp ใช้ในบทเรียนทางการด้วย และเป็น Box ภายนอกระบบ Ubuntu เอง ควรตรวจสอบผู้เผยแพร่ Provider และ CPU Architecture ก่อนใช้กับงานจริง บนเครื่อง ARM/Apple Silicon ให้เลือก Box และ VirtualBox ที่รองรับ ARM อย่างตรงกัน; การรองรับขึ้นกับชุดเวอร์ชันจริง
#6.1 ทำไมจึงใช้ Vagrantfile?
ถ้าสร้าง VM ด้วย GUI ทุกครั้ง ผู้เรียนต้องทำซ้ำหลายขั้นตอน แต่ Vagrantfile ทำหน้าที่เป็น โค้ดสำหรับกำหนดสภาพแวดล้อม ซึ่งสามารถจัดเก็บใน Git และตรวจสอบย้อนกลับได้ แนวคิดนี้เกี่ยวข้องกับ Infrastructure as Code (IaC) แม้ Vagrant จะมุ่งจัดการสภาพแวดล้อมมากกว่าการทำ Cloud Provisioning แบบ Terraform
#7. สร้างหน้าเว็บสำหรับการทดลอง
สร้างไฟล์ site/index.html:
<!doctype html>
<html lang="th">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Virtualization Workshop</title>
<style>
body { font-family: system-ui, sans-serif; background: #eff6ff; color: #123364; }
main { max-width: 650px; margin: 70px auto; padding: 35px; background: white; border-radius: 18px; }
</style>
</head>
<body>
<main>
<h1>Virtualization Workshop</h1>
<p>Web Server ทำงานบน Ubuntu Virtual Machine</p>
<p>จัดการผ่าน Vagrant และ VirtualBox</p>
</main>
</body>
</html>
ไฟล์ HTML ในชุดโปรเจกต์ดาวน์โหลดมีการตกแต่งเพิ่มเติม แต่ใช้หลักการเดียวกัน
#8. ทำ Automatic Provisioning ด้วย Shell Script
สร้างไฟล์ provision.sh:
#!/usr/bin/env bash
set -euo pipefail
export DEBIAN_FRONTEND=noninteractive
apt-get update
apt-get install -y nginx curl
# คัดลอกหน้าเว็บจาก Synced Folder ไปยัง Document Root
install -m 0644 /srv/virtualization-site/index.html /var/www/html/index.html
systemctl enable --now nginx
nginx -t
# ตรวจสอบว่า Nginx ให้บริการหน้าเว็บที่เตรียมไว้ได้จริง
curl --fail --silent http://127.0.0.1/ | grep -q 'Virtualization Workshop'
echo 'Provision completed: Nginx is serving the workshop page.'
set -euo pipefail ช่วยให้สคริปต์หยุดเมื่อเกิดข้อผิดพลาดสำคัญ แทนที่จะข้ามปัญหาและรายงานว่าติดตั้งสำเร็จ ผู้เรียนสามารถทดลองรัน Provisioning ซ้ำได้ด้วย vagrant provision
Script นี้รันด้วยสิทธิ์ Root ผ่าน Vagrant Shell Provisioner ตามค่าเริ่มต้นของ Linux Guest ดังนั้นจึงไม่ต้องใส่
sudoหน้าคำสั่งapt-getและsystemctlในสคริปต์
#9. เริ่มต้นเครื่อง Virtual Machine
เปิด PowerShell/Terminal ในโฟลเดอร์เดียวกับ Vagrantfile แล้วรัน:
vagrant up --provider=virtualbox
ครั้งแรก Vagrant จะดาวน์โหลด Base Box ถ้ายังไม่มี จากนั้นสร้าง VM ตั้งค่าเครือข่าย แชร์โฟลเดอร์ และรัน provision.sh ระหว่างขั้นตอนอาจใช้เวลานานกว่าครั้งถัดไป
ตรวจสอบสถานะ:
vagrant status
ตัวอย่างสถานะที่คาดหวัง:
Current machine states:
default running (virtualbox)
สำคัญ: ชื่อ VM ใน VirtualBox Manager จะเป็น
virtualization-ubuntu-labแต่ชื่อเครื่องใน Vagrant CLI ยังอาจแสดงเป็นdefaultซึ่งเป็นคนละส่วนของการตั้งค่า
#9.1 เข้าสู่ Ubuntu VM
vagrant ssh
หลังเชื่อมต่อให้รัน ภายใน Guest:
hostname
cat /etc/os-release
uname -r
nproc
free -h
lsblk
ip -brief address
ตรวจสอบ Nginx:
sudo systemctl status nginx --no-pager
curl -I http://127.0.0.1
หาก curl -I แสดง HTTP/1.1 200 OK (หรือรหัส 200 ที่เทียบเท่ากัน) แสดงว่าเว็บเซิร์ฟเวอร์กำลังตอบสนองบน VM
กลับสู่ Host ด้วยคำสั่ง:
exit
#10. ทดสอบการเข้าถึงผ่าน Host
เปิดเว็บเบราว์เซอร์ บนเครื่อง Host:
หรือทดสอบด้วย Terminal/PowerShell:
curl http://127.0.0.1:8080
บน Windows PowerShell รุ่นที่ curl เป็น Alias ของ Invoke-WebRequest ให้ใช้ curl.exe ถ้าต้องการไวยากรณ์ curl แบบตรงตัว:
curl.exe -I http://127.0.0.1:8080
ผลลัพธ์ที่คาดหวัง: เห็นหน้าเว็บหัวข้อ Virtualization Workshop ที่ Host แม้จริง ๆ แล้ว Nginx กำลังทำงานอยู่ภายใน Guest VM
#10.1 ตรวจสอบ Host-only Network
จาก Host (บนเครือข่ายที่ตั้งค่าได้ปกติ):
ping 192.168.56.10
pingอาจไม่ตอบเนื่องจาก Firewall หรือการตั้งค่าเครือข่าย แม้ Nginx และ Port Forward ยังทำงานได้ ให้ใช้curlเพื่อตรวจสอบบริการ HTTP ร่วมด้วย
หาก Private IP ใช้งานได้ ลองเปิดเว็บ:
http://192.168.56.10
กรณีไม่เปิดได้ ให้ตรวจสอบว่า Guest มี IP นี้จริงด้วย vagrant ssh แล้ว ip -brief address และตรวจสอบ Network Adapter ใน VirtualBox Manager
#10.2 สรุป NAT / Bridged / Host-only
| Network Mode | ลักษณะ | ควรใช้เมื่อ |
|---|---|---|
| NAT | Guest ออกอินเทอร์เน็ตผ่าน Host; เข้าจาก Host ผ่าน Forwarding ตามที่กำหนด | ดาวน์โหลดแพ็กเกจและสื่อสารออกภายนอก |
| Host-only | เครือข่ายเฉพาะ Host กับ VM (และ VM ที่ต่อเครือข่ายเดียวกัน) | Lab ภายในเครื่องและการทดสอบ |
| Bridged | Guest เชื่อมกับเครือข่ายภายนอกในลักษณะอุปกรณ์ร่วมวง LAN | ต้องการให้เครื่องอื่นใน LAN ติดต่อ VM โดยตรง |
Security: ตัวอย่างนี้ตั้งใจใช้ NAT + Host-only ไม่ใช้ Bridged เพื่อลดโอกาสเปิดบริการทดสอบออกสู่เครือข่ายโดยไม่จำเป็น
#11. ฝึกใช้งาน Synced Folder และ Provisioning ซ้ำ
ใน Vagrantfile เรากำหนด:
config.vm.synced_folder "./site", "/srv/virtualization-site", create: true
จึงแมปไฟล์ระหว่าง Host และ Guest ดังนี้:
Host: virtualization-workshop/site/index.html
↕ แชร์โฟลเดอร์
Guest: /srv/virtualization-site/index.html
↓ Provision Script คัดลอกไฟล์
Guest: /var/www/html/index.html
↓
Nginx HTTP :80
#แบบฝึกหัด
- แก้ไขข้อความใน
site/index.htmlบน Host เช่น เปลี่ยนหัวข้อเป็นVirtualization Workshop - Lab 2 - ตรวจสอบไฟล์ที่แชร์ใน Guest
vagrant ssh -c 'ls -l /srv/virtualization-site/index.html'
- คัดลอกไฟล์อัปเดตไปที่ Nginx โดยรัน Provisioning ซ้ำ
vagrant provision
- Refresh
http://localhost:8080และตรวจสอบว่าข้อความเปลี่ยน
ทำไมต้อง
vagrant provisionใหม่? เพราะตัวอย่างนี้ให้ Nginx อ่านไฟล์ที่/var/www/html/index.htmlซึ่งเป็น สำเนา จาก Synced Folder ไม่ได้ชี้ไปยัง Shared Folder โดยตรง การแก้ไขไฟล์บน Host จึงยังไม่ถูกแสดงจนกว่าจะ Provision ซ้ำ วิธีนี้ตั้งใจสอนความแตกต่างระหว่าง File Synchronization กับ Deployment/Provisioning
#12. คำสั่ง Vagrant ที่ควรรู้
ให้รันคำสั่งเหล่านี้จาก เครื่อง Host ในโฟลเดอร์ Workshop
| คำสั่ง | หน้าที่ |
|---|---|
vagrant up |
สร้าง/เปิด VM |
vagrant status |
ดูสถานะ VM |
vagrant ssh |
SSH เข้า Guest |
vagrant ssh -c 'uname -a' |
รันคำสั่งใน Guest แล้วกลับออก |
vagrant provision |
เรียก Provisioning ซ้ำ |
vagrant reload |
Restart VM และโหลดค่าการตั้งค่าที่เปลี่ยน |
vagrant reload --provision |
Reload พร้อมรัน Provisioning |
vagrant halt |
ปิด VM อย่างปกติ |
vagrant suspend |
พัก VM |
vagrant resume |
ทำงานต่อหลัง Suspend |
vagrant destroy |
ลบ VM (ข้อมูลใน VM อาจสูญหาย) |
vagrant box list |
ดู Base Box ที่ติดตั้งในเครื่อง |
vagrant global-status |
ดู VM ที่ Vagrant รู้จักหลายโปรเจกต์ |
ระวัง: vagrant destroy ลบเครื่องเสมือนและข้อมูลภายใน Guest disk ไม่ใช่คำสั่งปิดเครื่องธรรมดา ไฟล์ในโฟลเดอร์โปรเจกต์บน Host โดยปกติยังคงอยู่
#13. ทดลอง Snapshot และการคืนค่า
Snapshot ใช้บันทึกสถานะของ VM เพื่อย้อนกลับไปยังจุดก่อนทดลองได้ เหมาะสำหรับ Lab ที่ต้องติดตั้งโปรแกรมหรือแก้ไข Configuration แล้วต้องการคืนสภาพ
#Step 1: บันทึก Snapshot
vagrant snapshot save before-change
vagrant snapshot list
#Step 2: ทำการเปลี่ยนแปลงใน Guest
vagrant ssh
sudo systemctl stop nginx
sudo systemctl is-active nginx
exit
เว็บที่ Host ควรหยุดตอบสนองหรือแสดงข้อผิดพลาดการเชื่อมต่อ
#Step 3: Restore Snapshot
vagrant snapshot restore before-change
vagrant ssh -c 'systemctl is-active nginx'
ผลที่คาดหวังคือบริการกลับสู่สถานะที่ Snapshot บันทึกไว้ หาก Snapshot ถูกถ่ายขณะ Nginx ทำงาน ควรเห็น active จากการตรวจสอบ
Snapshot ไม่ใช่ระบบ Backup ที่ทดแทนกันได้ทั้งหมด และไม่ได้หมายความว่าจะย้อนเวอร์ชันไฟล์ทุกไฟล์ใน Shared Folder บน Host ด้วย ควรเก็บไฟล์ต้นฉบับใน Git แยกต่างหาก
#14. แบบฝึกหัดเพิ่มเติมสำหรับห้องปฏิบัติการ
#Lab A: ปรับ CPU/RAM
แก้ใน Vagrantfile:
vb.memory = 3072
vb.cpus = 2
จากนั้น:
vagrant reload
vagrant ssh -c 'free -h'
อธิบายว่าเหตุใด RAM ที่ Guest มองเห็นอาจไม่ตรงกับตัวเลขที่ตั้งไว้ทุก MB (ระบบปฏิบัติการมีการสงวนพื้นที่หน่วยความจำและมีวิธีรายงานต่างกัน)
#Lab B: เปลี่ยนพอร์ต
เปลี่ยนพอร์ต Host จาก 8080 เป็น 8081:
config.vm.network "forwarded_port", guest: 80, host: 8081,
host_ip: "127.0.0.1"
จากนั้น:
vagrant reload
ทดสอบ http://127.0.0.1:8081 และอธิบายความหมายของ Host Port กับ Guest Port
#Lab C: ทดลอง Service Isolation
ใช้เครื่อง VM เป็นสภาพแวดล้อมทดสอบโดยไม่ติดตั้ง Nginx ลงบนเครื่อง Host แล้วเปรียบเทียบผลของ vagrant halt ต่อการเปิดเว็บบน Host รวมถึงทรัพยากร CPU/RAM ก่อนและหลังปิด VM
#Lab D: Challenge (ระดับกลาง)
ให้ผู้เรียนสร้างโปรเจกต์ 2 VM แยกเป็น web และ db เชื่อมต่อกันด้วย Private Network แล้วออกแบบให้ web ติดต่อ db ได้เท่านั้นจาก IP ภายในที่กำหนด ตัวอย่างนี้เป็น โจทย์ขยาย ที่ต้องเขียน Vagrantfile เพิ่มและวางแผนไม่ให้ IP/พอร์ตชนกับ Workshop หลัก
สิ่งที่ควรส่ง: ภาพหน้าจอ Vagrant Status, หน้าเว็บ, ผล ip -brief address, การทดสอบ Port Forward และสรุปบทเรียน 1 หน้า
#15. Troubleshooting: ปัญหาที่พบบ่อย
| อาการ | สาเหตุที่เป็นไปได้ | แนวทางตรวจสอบ |
|---|---|---|
vagrant: command not found |
ยังไม่ติดตั้ง / PATH ไม่ถูกต้อง | เปิด Terminal ใหม่และตรวจสอบตัวติดตั้ง |
VBoxManage ไม่พบ |
VirtualBox ยังไม่ติดตั้ง / PATH | ตรวจสอบการติดตั้ง VirtualBox และเวอร์ชัน |
| VM Boot ไม่ขึ้น | VT-x/AMD-V, Hypervisor, Memory ไม่พร้อม | ตรวจสอบ CPU Virtualization, Log ของ VirtualBox, RAM |
Box ... could not be found |
Registry, ชื่อ Box, Provider, Architecture ไม่ตรง | ตรวจสอบว่า Box รองรับ virtualbox และสถาปัตยกรรม Host |
port 8080 ... collision |
โปรแกรมอื่นใช้พอร์ต 8080 | เปลี่ยน Host Port หรือปิดโปรแกรมที่ชนอย่างเหมาะสม |
Nginx ไม่ติดตั้ง |
ดาวน์โหลดแพ็กเกจไม่ได้ | ทดสอบ vagrant ssh, DNS, apt-get update และอินเทอร์เน็ต |
| Shared Folder Mount Failed | Guest Additions/Kernel Module ไม่เข้ากัน | ตรวจสอบ Log การแชร์โฟลเดอร์และความเข้ากันได้ของ Guest Additions |
ping 192.168.56.10 ไม่ตอบ |
IP ชน, Firewall, Host-only Adapter | ดู ip -brief address และ VirtualBox Network |
| หน้าเว็บไม่อัปเดตหลังแก้ HTML | Nginx ใช้สำเนาไฟล์ใน /var/www/html |
รัน vagrant provision |
| SSH ไม่สำเร็จ | VM ยังไม่พร้อมหรือเครือข่ายไม่สำเร็จ | vagrant status, vagrant up, ดู Log การ Boot |
#ตัวอย่างคำสั่งตรวจสอบแบบเป็นขั้นตอน
รันบน Host:
vagrant status
vagrant ssh -c 'sudo systemctl is-active nginx'
vagrant ssh -c 'curl -I http://127.0.0.1/'
รันบน Guest หลัง vagrant ssh:
ip -brief address
sudo ss -lntp | grep ':80'
sudo journalctl -u nginx -n 30 --no-pager
sudo nginx -t
หาก Network Host-only เกิด IP ซ้ำ ให้เลือก IP ที่ไม่ชนกับเครือข่ายหรือ VM อื่นและ vagrant reload หากการแชร์โฟลเดอร์ล้มเหลว ให้ตรวจสอบเวอร์ชัน VirtualBox และ Guest Additions ก่อน อย่าปิด Firewall หรือฟีเจอร์ความปลอดภัยถาวรเพียงเพื่อให้ Lab ผ่าน
#16. สำคัญ: การใช้งาน Vagrant Box หลังปี 2026
#16.1 สิ่งที่กำลังเปลี่ยน
HashiCorp ประกาศว่า HCP Vagrant Registry ซึ่งให้บริการจัดเก็บ/แจกจ่าย Box จะหยุดการดำเนินงาน 31 ธันวาคม 2026 แต่ Vagrant CLI ยังใช้งานต่อได้ จึงควรแยกความเข้าใจระหว่างตัวเครื่องมือกับบริการ Registry
ผลต่อ Workshop นี้: การเขียน config.vm.box = "bento/ubuntu-24.04" อาจใช้ไม่ได้หากเครื่องยังไม่มี Box และไม่มี Registry ให้ดาวน์โหลดหลังวันที่ยุติบริการ ให้ผู้สอนเตรียม Box ที่เชื่อถือได้ในไฟล์ .box หรือกำหนด URL ของ Box Repository ใหม่ล่วงหน้า
#16.2 แนวทางใช้ Local Box
เมื่อได้รับไฟล์ Box สำหรับ VirtualBox และสถาปัตยกรรมที่ถูกต้องจากแหล่งที่เชื่อถือได้ เช่น ubuntu2404-virtualbox.box ให้รันบน Host:
vagrant box add --name workshop/ubuntu2404 /path/to/ubuntu2404-virtualbox.box
vagrant box list
Windows: แทน
/path/to/...ด้วย Path ของไฟล์จริง เช่นD:\boxes\ubuntu2404-virtualbox.boxและใส่เครื่องหมายคำพูดครอบ Path หากมีช่องว่าง
จากนั้นเปลี่ยน Vagrantfile ให้ใช้:
config.vm.box = "workshop/ubuntu2404"
และเริ่มเครื่อง:
vagrant up --provider=virtualbox
เงื่อนไข: ไฟล์ .box ต้องเตรียมในรูปแบบ Vagrant สำหรับ VirtualBox โดยตรง มี Guest OS/SSH ที่ใช้ได้ และเหมาะกับสถาปัตยกรรมเครื่อง การดาวน์โหลด ISO ของ Ubuntu มาเปลี่ยนนามสกุลเป็น .box ใช้แทนกันไม่ได้
หากมี Box ติดตั้งอยู่แล้วในเครื่อง: สามารถดูชื่อ/เวอร์ชันด้วย vagrant box list และใช้ vagrant box repackage NAME PROVIDER VERSION เพื่อจัดทำไฟล์แจกจ่ายในชั้นเรียน โดยต้องตรวจสอบสิทธิ์/เงื่อนไขการเผยแพร่ของ Box นั้น
เอกสารทางการ: HCP Vagrant Deprecation, Local Vagrant Box
#17. ความปลอดภัยและแนวปฏิบัติที่ดี
- ใช้ Box จากผู้เผยแพร่ที่เชื่อถือได้ และตรวจสอบ Provider/Architecture/Checksum เมื่อมีข้อมูลให้ตรวจสอบ
- อย่าเปิด Bridged Network โดยไม่จำเป็น โดยเฉพาะ Box ที่ยังมีค่าบัญชีหรือบริการสำหรับทดสอบ
- จำกัด Port Forward ให้ผูกกับ localhost หากบริการต้องใช้เฉพาะ Host
- ไม่เก็บ Password, SSH Private Key, API Token ใน Vagrantfile ที่เผยแพร่สาธารณะ
- อย่า Commit
.vagrant/ลง Git ให้ใส่ใน.gitignore - อัปเดต Guest OS และแพ็กเกจ โดยเข้าใจว่าการ Update สามารถทำให้ผล Lab ต่างจากตอนเผยแพร่ได้
- เก็บโค้ดและไฟล์งานบน Host หรือใน Git ก่อนรัน
vagrant destroy - อย่าใช้ตัวอย่าง Web Server นี้เป็น Production โดยไม่มี Hardening, TLS, Firewall และการจัดการ Log/Update ที่เหมาะสม
ตัวอย่าง .gitignore:
.vagrant/
*.log
#18. เกณฑ์ประเมินผล Workshop
| หัวข้อประเมิน | คะแนน |
|---|---|
| อธิบายองค์ประกอบ Host / Guest / Hypervisor ได้ | 15 |
| ติดตั้งและสร้าง Ubuntu VM สำเร็จ | 20 |
| เข้าถึง VM ผ่าน SSH และแสดงข้อมูลระบบได้ | 15 |
| ตั้งค่า Nginx และเปิดเว็บผ่าน Port Forward ได้ | 20 |
| อธิบายเครือข่ายและ Synced Folder พร้อมทดสอบได้ | 15 |
| ทดลองแก้ไขเว็บและ Provision ซ้ำได้ | 10 |
| สรุปปัญหาและแนวทางแก้ไข | 5 |
| รวม | 100 |
#คำถามท้ายบท
- Hypervisor แตกต่างจาก Vagrant อย่างไร?
- VM ต่างจาก Container ในแง่การใช้ Kernel อย่างไร?
- เหตุใด Host จึงเปิดเว็บผ่านพอร์ต 8080 ขณะที่ Nginx ทำงานบนพอร์ต 80?
- ทำไม NAT และ Host-only Network จึงใช้ร่วมกันได้?
- เมื่อแก้ไข
site/index.htmlทำไมเว็บอาจไม่เปลี่ยนทันที? - คำสั่ง
vagrant reloadต่างจากvagrant provisionอย่างไร? - Snapshot ต่างจาก Backup อย่างไร?
- ถ้า Vagrant Public Registry หยุดให้บริการ จะยังสร้าง VM ด้วย Vagrant ได้อย่างไร?
#19. สรุป
Virtualization เป็นรากฐานสำคัญของ Infrastructure, Cloud Computing, Software Testing และ DevOps เพราะทำให้สามารถจำลองระบบปฏิบัติการและบริการต่าง ๆ บนคอมพิวเตอร์เครื่องเดียวได้อย่างเป็นระบบ
ใน Workshop นี้ ผู้เรียนได้ฝึกกระบวนการสำคัญตั้งแต่ นิยามโครงสร้างพื้นฐานด้วย Vagrantfile → สร้าง Ubuntu VM → ตั้งค่า Network → Provision Nginx → ตรวจสอบ Web Service → Snapshot/Restore ซึ่งเป็นขั้นพื้นฐานก่อนต่อยอดสู่การสร้าง Lab แบบหลาย VM, Kubernetes Cluster บน VM หรือระบบ CI/CD Infrastructure
กิจกรรมต่อยอด: สร้าง 2 VM (
webและdb) พร้อม Network Diagram และกำหนดขั้นตอน Provisioning แยกกัน เพื่อทำความเข้าใจ Distributed Systems และ Network Isolation
#20. แหล่งอ้างอิง / เอกสารเพิ่มเติม
- HashiCorp. Vagrant Documentation.
- HashiCorp. Vagrant VirtualBox Provider.
- HashiCorp. Setup Project with Ubuntu 24.04.
- HashiCorp. Shell Provisioning.
- HashiCorp. Port Forwarding.
- HashiCorp. Synced Folders.
- HashiCorp. Vagrant Snapshots.
- HashiCorp. (17 ก.ย. 2026). HCP Vagrant deprecation: Important dates and migration guidance.
- Oracle. VirtualBox Documentation.
- Ubuntu. Ubuntu Server Documentation.