เป้าหมาย Workshop: ใช้เครื่องคอมพิวเตอร์หนึ่งเครื่องสร้าง Ubuntu 24.04 Virtual Machine (VM) ด้วย VirtualBox และ Vagrant ตั้งค่าเครือข่าย ติดตั้ง Nginx อัตโนมัติ แล้วเปิดเว็บผ่านเบราว์เซอร์ของเครื่อง Host ที่ http://localhost:8080

บทความนี้เหมาะสำหรับผู้เรียน Software Engineering, DevOps, Cloud Computing และผู้เริ่มต้นดูแลระบบ Linux โดยเน้น เข้าใจหลักการ → ทำตามได้จริง → ตรวจสอบผล → ทดลองขยายระบบ

info-virtualization-workshop-ubuntu-virtual-machine-web-server-virtualbox-vagrant


#1. ผลลัพธ์ที่ผู้เรียนจะได้รับ

เมื่อจบ Workshop ผู้เรียนจะสามารถ:

  1. อธิบายความหมายของ Virtualization, Hypervisor, Host OS และ Guest OS
  2. เปรียบเทียบ Type 1 และ Type 2 Hypervisor รวมถึง VM กับ Container
  3. ตรวจสอบความพร้อมของเครื่องสำหรับ Hardware Virtualization
  4. สร้าง Ubuntu VM ผ่านไฟล์ Vagrantfile (Infrastructure as Code)
  5. ใช้ vagrant up, ssh, status, provision, reload, halt, snapshot และ destroy
  6. อธิบาย NAT, Port Forwarding, Private/Host-only Network และ Shared Folder
  7. ให้บริการเว็บด้วย Nginx และทดสอบผ่าน curl หรือเว็บเบราว์เซอร์
  8. แก้ปัญหาเบื้องต้นและจัดเตรียมผลการทดลองสำหรับส่งงาน

เวลาที่แนะนำ: 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: ดาวน์โหลดเครื่องมือ

ให้เลือกตัวติดตั้งตรงกับระบบปฏิบัติการและสถาปัตยกรรม 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:

http://localhost:8080

หรือทดสอบด้วย 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

#แบบฝึกหัด

  1. แก้ไขข้อความใน site/index.html บน Host เช่น เปลี่ยนหัวข้อเป็น Virtualization Workshop - Lab 2
  2. ตรวจสอบไฟล์ที่แชร์ใน Guest
vagrant ssh -c 'ls -l /srv/virtualization-site/index.html'
  1. คัดลอกไฟล์อัปเดตไปที่ Nginx โดยรัน Provisioning ซ้ำ
vagrant provision
  1. 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. ความปลอดภัยและแนวปฏิบัติที่ดี

  1. ใช้ Box จากผู้เผยแพร่ที่เชื่อถือได้ และตรวจสอบ Provider/Architecture/Checksum เมื่อมีข้อมูลให้ตรวจสอบ
  2. อย่าเปิด Bridged Network โดยไม่จำเป็น โดยเฉพาะ Box ที่ยังมีค่าบัญชีหรือบริการสำหรับทดสอบ
  3. จำกัด Port Forward ให้ผูกกับ localhost หากบริการต้องใช้เฉพาะ Host
  4. ไม่เก็บ Password, SSH Private Key, API Token ใน Vagrantfile ที่เผยแพร่สาธารณะ
  5. อย่า Commit .vagrant/ ลง Git ให้ใส่ใน .gitignore
  6. อัปเดต Guest OS และแพ็กเกจ โดยเข้าใจว่าการ Update สามารถทำให้ผล Lab ต่างจากตอนเผยแพร่ได้
  7. เก็บโค้ดและไฟล์งานบน Host หรือใน Git ก่อนรัน vagrant destroy
  8. อย่าใช้ตัวอย่าง 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

#คำถามท้ายบท

  1. Hypervisor แตกต่างจาก Vagrant อย่างไร?
  2. VM ต่างจาก Container ในแง่การใช้ Kernel อย่างไร?
  3. เหตุใด Host จึงเปิดเว็บผ่านพอร์ต 8080 ขณะที่ Nginx ทำงานบนพอร์ต 80?
  4. ทำไม NAT และ Host-only Network จึงใช้ร่วมกันได้?
  5. เมื่อแก้ไข site/index.html ทำไมเว็บอาจไม่เปลี่ยนทันที?
  6. คำสั่ง vagrant reload ต่างจาก vagrant provision อย่างไร?
  7. Snapshot ต่างจาก Backup อย่างไร?
  8. ถ้า 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. แหล่งอ้างอิง / เอกสารเพิ่มเติม

  1. HashiCorp. Vagrant Documentation.
  2. HashiCorp. Vagrant VirtualBox Provider.
  3. HashiCorp. Setup Project with Ubuntu 24.04.
  4. HashiCorp. Shell Provisioning.
  5. HashiCorp. Port Forwarding.
  6. HashiCorp. Synced Folders.
  7. HashiCorp. Vagrant Snapshots.
  8. HashiCorp. (17 ก.ย. 2026). HCP Vagrant deprecation: Important dates and migration guidance.
  9. Oracle. VirtualBox Documentation.
  10. Ubuntu. Ubuntu Server Documentation.