info2-workshop-vagrant-virtualbox-ubuntu-vm-nginx-web-server

เครื่องมือ: Vagrant, Oracle VirtualBox, Ubuntu 24.04 LTS, Nginx, Bash, Terminal/PowerShell
เป้าหมาย: สร้าง Ubuntu VM แบบอัตโนมัติและเข้าเว็บไซต์ที่ http://127.0.0.1:8080 บนเครื่อง Host ได้

หมายเหตุเกี่ยวกับภาพ: ไฟล์ Infographic แนบอยู่ใน ZIP ชุด Workshop ที่มาพร้อมบทความนี้ เมื่อแยกไฟล์ ZIP ให้รักษาโครงสร้างโฟลเดอร์ images/ เพื่อแสดงภาพใน Markdown ได้

#1. ทำไมต้องใช้ Vagrant ร่วมกับ VirtualBox?

เมื่อพัฒนาและทดสอบซอฟต์แวร์บนระบบ Linux ผู้เรียนอาจต้องติดตั้ง Ubuntu สร้างบัญชี ตั้งค่าเครือข่าย และติดตั้งซอฟต์แวร์ซ้ำหลายครั้ง หากใช้ VirtualBox ผ่าน GUI เพียงอย่างเดียว ทุกขั้นตอนอาจต้องทำด้วยมือ จนได้สภาพแวดล้อมที่ไม่เหมือนกันในแต่ละเครื่อง

VirtualBox คือซอฟต์แวร์ Virtualization ที่สร้างและรัน Virtual Machine (VM) โดยจัดสรร CPU, RAM, Disk และ Network ของ Guest บน Host

Vagrant คือเครื่องมือ CLI สำหรับอธิบายและควบคุมสภาพแวดล้อมการพัฒนาผ่านไฟล์ Vagrantfile สามารถสั่งสร้าง เปิด หยุด และลบ VM รวมทั้งติดตั้งซอฟต์แวร์ภายในเครื่องได้อัตโนมัติ

การทำงานร่วมกันช่วยให้สภาพแวดล้อมเป็น reproducible development environment หรือสภาพแวดล้อมที่สร้างซ้ำได้ และเป็นตัวอย่างพื้นฐานของแนวทาง Infrastructure as Code (IaC) ในระดับเครื่องพัฒนา

#องค์ประกอบสำคัญ

องค์ประกอบ ความหมาย ตัวอย่างใน Workshop
Host คอมพิวเตอร์จริงที่รันเครื่องมือ Windows / macOS / Linux
Guest VM ระบบปฏิบัติการในเครื่องเสมือน Ubuntu 24.04 LTS
Provider โปรแกรมที่ Vagrant ใช้สร้าง VM virtualbox
Vagrant Box อิมเมจพื้นฐานพร้อมข้อมูลการทำงาน bento/ubuntu-24.04
Vagrantfile ไฟล์ตั้งค่า VM ในรูปแบบ Ruby DSL CPU, RAM, Port, Folder
Provisioner ติดตั้งและกำหนดค่าซอฟต์แวร์ scripts/provision.sh
Port Forwarding เชื่อมต่อพอร์ต Host ไปยัง Guest 127.0.0.1:8080 → Guest 80
Synced Folder แชร์ไฟล์ระหว่าง Host กับ Guest site/ ↔ /srv/vagrant-site

#สถาปัตยกรรมของ Workshop

flowchart TD
    CONFIG["Vagrantfile"] --> CLI["Vagrant CLI"]
    CLI --> PROVIDER["VirtualBox Provider"]
    PROVIDER --> VM["Ubuntu 24.04 VM"]
    BOX["Ubuntu 24.04 Base Box"] --> VM
    CLI --> PROVISION["Shell Provisioning"]
    PROVISION --> NGINX["Nginx Web Server - Guest Port 80"]
    VM --> NGINX
    HOSTFILES["Host: site/index.html"] -->|Synced Folder| GUESTFILES["Guest: /srv/vagrant-site"]
    GUESTFILES --> NGINX
    BROWSER["Host Browser: 127.0.0.1:8080"] -->|Port Forwarding| NGINX

#2. สิ่งที่ผู้เรียนจะทำได้

หลังจบ Workshop ผู้เรียนควรสามารถ:

  1. อธิบายบทบาทของ VirtualBox, Vagrant, Vagrant Box และ Vagrantfile ได้
  2. ตรวจสอบเวอร์ชันและความเข้ากันได้ของ Vagrant/VirtualBox
  3. สร้าง Ubuntu VM ด้วย vagrant up และเชื่อมต่อด้วย vagrant ssh
  4. กำหนด CPU, RAM และชื่อ VM จาก Vagrantfile
  5. ติดตั้ง Nginx ด้วย Shell Provisioning แบบอัตโนมัติ
  6. ตั้งค่า Port Forwarding และ Synced Folder เพื่อพัฒนาเว็บไซต์จาก Host
  7. ตรวจสอบผลลัพธ์ แก้ไขข้อผิดพลาด และล้างทรัพยากรได้อย่างปลอดภัย

#3. เตรียมเครื่องก่อนเริ่ม Workshop

#3.1 สเปกที่แนะนำ

รายการ คำแนะนำ
CPU Intel/AMD ที่รองรับ VT-x/AMD-V; เปิด Hardware Virtualization ใน BIOS/UEFI
RAM ของ Host แนะนำ 8 GB ขึ้นไป
RAM ของ VM 2,048 MB (2 GB)
vCPU ของ VM 2 vCPU
พื้นที่ว่าง ประมาณ 10–20 GB หรือมากกว่านั้นตามขนาด Box และการติดตั้ง
Network ต้องเชื่อมต่ออินเทอร์เน็ตครั้งแรกเพื่อดาวน์โหลด Box และติดตั้ง Nginx
OS เครื่อง Host Windows, macOS หรือ Linux รุ่นที่ผู้ผลิตเครื่องมือรองรับ

ความเข้ากันได้ของเวอร์ชัน: เอกสาร HashiCorp ระบุว่า Vagrant VirtualBox Provider รองรับ VirtualBox 7.2.x โดยการรองรับ VirtualBox 7.2 ถูกเพิ่มใน Vagrant 2.4.9 หากใช้ VirtualBox 7.2 ควรใช้ Vagrant 2.4.9 หรือใหม่กว่าและตรวจสอบเอกสารอีกครั้งก่อนอบรม

ข้อจำกัดของสถาปัตยกรรม: บทความใช้ Box bento/ubuntu-24.04 ที่ต้องเลือก build ให้ตรงกับสถาปัตยกรรมและ Provider ของเครื่อง หากใช้ Apple Silicon/ARM64 ต้องตรวจสอบว่า Box มี virtualbox + arm64 จริง อย่าใช้ Box x86_64 บน ARM โดยสมมติว่าจะรันได้อัตโนมัติ

#3.2 ติดตั้ง VirtualBox และ Vagrant

ดาวน์โหลดจากผู้ผลิตโดยตรง:

สำหรับ Windows 10/11 ให้ติดตั้ง VirtualBox แล้วจึงติดตั้ง Vagrant จากนั้นเปิด PowerShell/Windows Terminal ใหม่ หากมีข้อขัดแย้งกับ Hyper-V, WSL2 หรือ Docker Desktop ให้ตรวจสอบ Error และเอกสารเวอร์ชันที่ใช้ก่อนเปลี่ยนการตั้งค่าระบบ

สำหรับ Linux/macOS ให้ติดตั้งตามแพ็กเกจที่ผู้พัฒนารองรับสำหรับ Host OS และ CPU Architecture นั้น ๆ

ตรวจสอบหลังติดตั้ง:

vagrant --version
VBoxManage --version

ทั้งสองคำสั่งควรแสดงข้อมูลเวอร์ชันโดยไม่แจ้งว่าไม่พบคำสั่ง หาก VBoxManage ใช้ไม่ได้บน Windows ให้ตรวจสอบ PATH และโฟลเดอร์ติดตั้ง VirtualBox ก่อน

#4. Workshop A — สร้าง Ubuntu VM เครื่องแรก

#ขั้นตอน 1: สร้างโฟลเดอร์โปรเจกต์

mkdir vagrant-first-vm
cd vagrant-first-vm

#ขั้นตอน 2: สร้าง Vagrantfile เริ่มต้น

vagrant init bento/ubuntu-24.04

แก้ไฟล์ Vagrantfile ให้เป็นตัวอย่างขั้นต่ำดังนี้:

Vagrant.configure("2") do |config|
  config.vm.box = "bento/ubuntu-24.04"
  config.vm.box_architecture = :auto

  config.vm.provider "virtualbox" do |vb|
    vb.memory = 2048
    vb.cpus = 2
  end
end

:auto ให้ Vagrant เลือก Box Architecture ตาม Host; ทั้งนี้ Registry ต้องมี Box ตรงกับสถาปัตยกรรมและ Provider ด้วย

#ขั้นตอน 3: ตรวจสอบและเปิด VM

vagrant validate
vagrant up --provider=virtualbox

เมื่อรันครั้งแรก Vagrant จะค้นหาหรือดาวน์โหลด Box สร้าง VM ผ่าน VirtualBox แล้วรอจน SSH พร้อมใช้งาน

#ขั้นตอน 4: SSH เข้า Ubuntu

vagrant status
vagrant ssh

ภายใน VM ทดลอง:

cat /etc/os-release
hostname
ip -br address
free -h
exit

exit ใช้ออกจาก SSH กลับ Host โดยไม่ปิด VM

#ขั้นตอน 5: ปิดเครื่องทดลอง

vagrant halt

หากต้องการเปิดใหม่ใช้ vagrant up ส่วนการลบ VM ใช้ vagrant destroy หลังแน่ใจว่าไม่ต้องเก็บข้อมูลในดิสก์เสมือน

ต่อไปนี้เป็น Workshop B อีกโปรเจกต์หนึ่ง ไม่ควรนำไฟล์จาก Workshop B ไปวางทับ Vagrantfile ของ Workshop A โดยไม่ได้ตั้งใจ

#5. Workshop B — สร้าง Ubuntu + Nginx แบบอัตโนมัติ

Workshop นี้ใช้ชุดไฟล์ที่แจกมาพร้อมบทความ สามารถสร้างด้วยตัวเองตามตัวอย่างด้านล่าง หรือแตกไฟล์ ZIP แล้วสั่ง vagrant up ได้เลย

#5.1 โครงสร้างโปรเจกต์

vagrant-virtualbox-nginx-workshop/
├── Vagrantfile
├── scripts/
│   └── provision.sh
├── site/
│   └── index.html
├── images/
│   └── vagrant-virtualbox-infographic.png
├── .gitignore
├── README.md
└── article.md

ข้อสำคัญ: เปิด Terminal ที่โฟลเดอร์ vagrant-virtualbox-nginx-workshop/ ซึ่งมีไฟล์ Vagrantfile อยู่ ไม่ใช่ที่โฟลเดอร์ scripts/

#5.2 เขียน Vagrantfile

# Vagrant + VirtualBox Workshop — Ubuntu 24.04 + Nginx
Vagrant.configure("2") do |config|
  config.vm.box = "bento/ubuntu-24.04"
  config.vm.box_architecture = :auto
  config.vm.hostname = "nginx-lab"

  # Host localhost:8080 forwards to guest port 80
  config.vm.network "forwarded_port", guest: 80, host: 8080,
    host_ip: "127.0.0.1", auto_correct: false

  # Edit files on Host and read the same files in Guest
  config.vm.synced_folder "./site", "/srv/vagrant-site", create: true

  config.vm.provider "virtualbox" do |vb|
    vb.name = "vagrant-nginx-workshop"
    vb.memory = 2048
    vb.cpus = 2
  end

  config.vm.provision "shell", path: "scripts/provision.sh"
end

อ่านค่าคอนฟิก:

  • config.vm.box คือชื่อ Base Box ที่ Vagrant จะใช้สร้าง VM
  • config.vm.box_architecture ให้เลือกสถาปัตยกรรมที่เหมาะสมกับ Host
  • config.vm.hostname กำหนด Hostname ภายใน Ubuntu
  • forwarded_port ส่งพอร์ต 8080 ของ Host ไป 80 ภายใน Guest
  • host_ip: "127.0.0.1" จำกัดการเข้าถึงเว็บทดลองเฉพาะเครื่อง Host ช่วยลดการเปิดเผยพอร์ตให้เครื่องอื่นบน LAN
  • synced_folder แชร์โฟลเดอร์ site/ ไปเป็น /srv/vagrant-site
  • vb.memory / vb.cpus จัดสรร RAM และ vCPU
  • config.vm.provision ระบุสคริปต์สำหรับติดตั้งและกำหนดค่า Nginx

#5.3 เขียน scripts/provision.sh

สร้างโฟลเดอร์ scripts/ แล้วเขียนไฟล์ provision.sh ดังนี้:

#!/usr/bin/env bash
set -euo pipefail

export DEBIAN_FRONTEND=noninteractive

printf '\n[1/4] Updating package index...\n'
apt-get update

printf '\n[2/4] Installing Nginx and curl...\n'
apt-get install -y nginx curl

printf '\n[3/4] Configuring Nginx document root...\n'
cat > /etc/nginx/sites-available/default <<'NGINX'
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    root /srv/vagrant-site;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}
NGINX

nginx -t
systemctl enable --now nginx
systemctl restart nginx

printf '\n[4/4] Verifying the HTTP response...\n'
curl --fail --silent --show-error -I http://127.0.0.1/
printf '\nNginx provisioned successfully. Visit http://127.0.0.1:8080 on the host.\n'

สคริปต์นี้ทำงานบน Ubuntu Guest ด้วยสิทธิ์ root ซึ่งเป็นค่าเริ่มต้นของ Shell Provisioner สำหรับ Guest แบบ POSIX จึงสามารถใช้ apt-get, เขียนไฟล์ใน /etc/nginx และเรียก systemctl ได้

คำสั่งที่สำคัญ: set -euo pipefail ช่วยให้สคริปต์หยุดเมื่อตรวจพบข้อผิดพลาดตามเงื่อนไขของ Bash ขณะที่ nginx -t ตรวจไวยากรณ์คอนฟิกก่อนรีสตาร์ตบริการ

#5.4 เขียน site/index.html

สร้างโฟลเดอร์ site/ และไฟล์ index.html:

<!doctype html>
<html lang="th">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Vagrant + VirtualBox Workshop</title>
</head>
<body>
  <h1>Vagrant + VirtualBox ทำงานสำเร็จ!</h1>
  <p>เว็บไซต์จาก Ubuntu 24.04 + Nginx Web Server</p>
  <p>แก้ไขไฟล์ site/index.html บน Host แล้วรีเฟรชเว็บได้ทันที</p>
</body>
</html>

ใน ZIP จะมีเวอร์ชันที่จัดรูปแบบด้วย CSS ให้แล้ว

#5.5 เริ่ม VM และติดตั้ง Nginx

เมื่ออยู่ในโฟลเดอร์ Workshop B ให้รัน:

vagrant validate
vagrant up --provider=virtualbox
vagrant status

ผลที่คาดหวัง: Vagrant สร้าง Ubuntu VM สำเร็จ แชร์โฟลเดอร์ site/ เข้าสู่ Guest ติดตั้ง Nginx และเริ่มเว็บเซิร์ฟเวอร์สำเร็จ หาก Nginx ไม่ทำงานให้ดู Error ของ Provisioner ใน Terminal

#5.6 ตรวจสอบจากภายใน Ubuntu

vagrant ssh

ภายใน Guest:

hostname
ls -la /srv/vagrant-site
sudo nginx -t
sudo systemctl is-active nginx
curl -I http://127.0.0.1/
exit

ผลที่ควรได้คือ nginx: configuration file ... test is successful, สถานะ active และ HTTP Response เช่น HTTP/1.1 200 OK

#5.7 ตรวจสอบจาก Host ผ่านเบราว์เซอร์

เปิด URL บน Windows/macOS/Linux Host:

http://127.0.0.1:8080

หรือทดสอบจาก Terminal ของ Host:

curl -I http://127.0.0.1:8080/

Windows PowerShell: หากคำสั่ง curl ถูก alias ไปยังคำสั่งอื่น ให้ใช้ curl.exe -I http://127.0.0.1:8080/

อธิบายผล: พอร์ต 8080 อยู่บนเครื่อง Host ส่วนพอร์ต 80 อยู่บน Ubuntu Guest และ Vagrant/VirtualBox จัดการ Port Forwarding ให้

#6. Workshop C — ทดลอง Synced Folder แบบแก้เว็บสด

#6.1 แก้ไข HTML บน Host

ใช้ VS Code หรือ Text Editor เปิด site/index.html แล้วเปลี่ยนข้อความหัวข้อ เช่น:

<h1>สวัสดีจาก Vagrant Workshop รุ่นที่ 2</h1>

บันทึกไฟล์ แล้วกด Refresh หน้าเว็บ http://127.0.0.1:8080

ผลที่คาดหวัง: ข้อความเปลี่ยนโดยไม่ต้องใช้ vagrant provision เพราะ Nginx อ่านไฟล์จาก Synced Folder ที่แชร์ระหว่าง Host และ Guest

#6.2 ตรวจสอบไฟล์จาก Guest

vagrant ssh
ls -l /srv/vagrant-site/index.html
cat /srv/vagrant-site/index.html
exit

ถ้าพบ Error การ Mount Shared Folder ให้ตรวจสอบ VirtualBox Guest Additions และสิทธิ์โฟลเดอร์บน Host เพราะการใช้ VirtualBox Shared Folder ขึ้นกับความเข้ากันได้ของ Host, Guest และ Guest Additions

#7. Workshop D — การจัดการ Lifecycle ของ VM

คำสั่ง การทำงาน
vagrant validate ตรวจ Vagrantfile
vagrant up --provider=virtualbox สร้าง/เปิด VM
vagrant status ดูสถานะ VM ในโปรเจกต์
vagrant global-status ดูเครื่อง Vagrant ที่บันทึกไว้ใน Host
vagrant ssh SSH เข้า VM
vagrant ssh-config แสดงค่าการเชื่อมต่อ SSH
vagrant provision รัน Provisioner ซ้ำบน VM ที่เปิดอยู่
vagrant reload รีสตาร์ตและโหลดการตั้งค่า VM ที่เปลี่ยน
vagrant reload --provision รีสตาร์ตและรัน Provisioner ซ้ำ
vagrant halt ปิด VM โดยเก็บดิสก์ไว้
vagrant suspend พัก VM พร้อมสถานะในหน่วยความจำ
vagrant resume กลับมาทำงานจากสถานะพัก
vagrant destroy ลบ VM และดิสก์ของ VM; ต้องระวังข้อมูลสูญหาย
vagrant box list ดู Base Box ที่มีอยู่ในเครื่อง

#ตัวอย่างทดสอบการสร้างซ้ำ

vagrant halt
vagrant up
vagrant provision

เปิดเว็บและตรวจสอบอีกครั้งว่า Nginx ยังทำงาน และไฟล์ที่แชร์จาก Host ยังคงเข้าถึงได้

สำหรับการล้าง Lab:

vagrant destroy

vagrant destroy จะขอยืนยันก่อนลบเครื่อง และข้อมูลที่เก็บอยู่ เฉพาะในดิสก์ Guest อาจสูญหาย ไฟล์โปรเจกต์บน Host (เช่น Vagrantfile, site/index.html) ยังคงอยู่ตามปกติ

#8. Workshop เสริม — Private Network และ Multi-machine

#8.1 เพิ่ม Private Network

กรณีต้องการสื่อสารโดยตรงระหว่าง Host กับ Guest สามารถเพิ่มใน Vagrantfile ได้ เช่น:

config.vm.network "private_network", ip: "192.168.56.10"

หลังแก้ไขให้ใช้:

vagrant reload

ค่า IP เป็นตัวอย่างเท่านั้น ต้องไม่ชนกับเครือข่ายของเครื่องจริงหรือ Host-only Network ของ VirtualBox และอาจต้องกำหนดค่าระบบเพิ่มเติมตาม Host OS

#8.2 สร้าง VM สองเครื่อง (ตัวอย่าง แยกจาก Lab หลัก)

สร้างโฟลเดอร์โปรเจกต์ใหม่และใช้ Vagrantfile ต่อไปนี้หากต้องการฝึก Multi-machine:

Vagrant.configure("2") do |config|
  config.vm.box = "bento/ubuntu-24.04"
  config.vm.box_architecture = :auto

  config.vm.define "web" do |web|
    web.vm.hostname = "web"
    web.vm.network "private_network", ip: "192.168.56.11"
  end

  config.vm.define "db" do |db|
    db.vm.hostname = "db"
    db.vm.network "private_network", ip: "192.168.56.12"
  end
end

คำสั่งที่ใช้:

vagrant up --provider=virtualbox
vagrant ssh web
vagrant ssh db
vagrant status

หมายเหตุ: ตัวอย่างนี้สร้าง VM เปล่าสองเครื่องเพื่อทดลองเครือข่าย ยังไม่ได้ติดตั้ง Web Server หรือ Database และต้องใช้ RAM เพิ่มจาก Lab หลัก

#9. Troubleshooting — ปัญหาที่พบได้บ่อย

ปัญหา / อาการ สาเหตุที่เป็นไปได้ แนวทางตรวจสอบ
vagrant ไม่ใช่คำสั่งที่รู้จัก Vagrant ไม่อยู่ใน PATH ติดตั้งใหม่/เปิด Terminal ใหม่ แล้วตรวจ vagrant --version
ไม่พบ VirtualBox Provider ไม่มี VirtualBox หรือ Vagrant รองรับเวอร์ชันนั้นไม่ได้ ตรวจ VBoxManage --version, รุ่น Vagrant และเอกสาร Compatibility
VM ไม่เริ่ม; VT-x/AMD-V unavailable Hardware Virtualization หรือ Hypervisor Conflict ตรวจ BIOS/UEFI และ Hyper-V/WSL2/Docker Desktop โดยไม่ปิดฟีเจอร์ความปลอดภัยโดยไม่จำเป็น
Box ไม่รองรับ Provider Box ไม่มี build สำหรับ virtualbox ตรวจ Provider, เวอร์ชัน Box และ Architecture
SSH timeout Guest ไม่บูต, RAM ไม่พอ หรือ Networking มีปัญหา ตรวจสถานะ/Console VM, vagrant status และ Boot Log
Host port 8080 ถูกใช้อยู่ มีโปรแกรมอื่นใช้พอร์ตเดียวกัน เปลี่ยน host: 8080 เป็น 8081 แล้ว vagrant reload
Nginx ไม่ทำงาน Provision ล้มเหลวหรือ Nginx config ผิด vagrant ssh → sudo nginx -t และ sudo systemctl status nginx
403 หรือ 404 จาก Nginx Path หรือสิทธิ์การอ่านไฟล์เว็บผิด ตรวจ /srv/vagrant-site/index.html และ nginx -t
Synced Folder Mount Error Guest Additions/Shared Folders ไม่เข้ากัน ตรวจเวอร์ชันและสิทธิ์ Host/Guest และ Log ของ vagrant up
แก้ script แล้วไม่ทำงาน Provisioner ไม่รันซ้ำอัตโนมัติทุกครั้ง สั่ง vagrant provision

#บันทึกเฉพาะ Windows

เมื่อใช้ VirtualBox ร่วมกับ Hyper-V หรือ WSL2 ประสิทธิภาพหรือความเข้ากันได้อาจแตกต่างกันตาม Windows/VirtualBox รุ่นจริง ควรตรวจข้อมูลใน Error ก่อนปรับ Windows Features เพราะการปิด Hyper-V อาจส่งผลต่อ WSL2, Docker Desktop และเครื่องมือ Virtualization อื่น

#10. เรื่องสำคัญในปี 2569 — HCP Vagrant Registry กำลังยุติบริการ

HashiCorp ประกาศเลิกให้บริการ HCP Vagrant Registry โดยมีวันสำคัญดังนี้:

  • 1 ตุลาคม 2569: ไม่สามารถสร้าง Box/Registry ใหม่บนบริการเดิมได้
  • 2 พฤศจิกายน 2569: สิ้นสุดการดูแลและบำรุงรักษา
  • 31 ธันวาคม 2569: ยุติการให้บริการ Registry เดิม

Vagrant CLI ไม่ได้ถูกประกาศยุติพร้อม Registry แต่การดาวน์โหลด Box จาก Registry เดิมหลังวันปิดบริการจะไม่สามารถพึ่งพาได้ ดังนั้นผู้สอนที่วางแผนใช้เอกสารนี้ในปี 2570 ควรจัดเก็บ Box ในแหล่งที่เชื่อถือได้และควบคุมได้ (เช่น Repository/Artifact Storage ของสถาบัน) พร้อมตรวจ SHA-256 และทดสอบเวอร์ชันจริงล่วงหน้า

ตัวอย่างเมื่อต้องการนำ ไฟล์ .box ที่ได้มาจากแหล่งเชื่อถือได้ มาเพิ่มด้วยตัวเอง:

vagrant box add ./ubuntu-24.04-virtualbox.box --name local/ubuntu-24.04 --provider virtualbox
vagrant box list

แล้วแก้บรรทัดใน Vagrantfile:

config.vm.box = "local/ubuntu-24.04"

เส้นทางไฟล์ข้างต้นเป็นเพียงตัวอย่างเท่านั้น ไม่มีไฟล์ .box อยู่ในชุด ZIP ผู้ใช้งานต้องดาวน์โหลดหรือจัดเตรียม Box ที่ถูกต้องตาม Provider/Architecture และตรวจสอบที่มาเอง หากต้องการเผยแพร่ Workshop ให้นักเรียนจำนวนมาก ควรใช้ Artifact Storage และไฟล์ Metadata ที่ควบคุมเวอร์ชันแทนการพึ่งพา Registry ที่กำลังยุติบริการ

#11. แบบฝึกหัดท้าย Workshop

งาน สิ่งที่ต้องส่ง คะแนน
ติดตั้งเครื่องมือ ภาพ/ผลคำสั่ง vagrant --version และ VBoxManage --version 15
สร้าง Ubuntu VM ผล vagrant status และ cat /etc/os-release 20
Provision Nginx ผล nginx -t และ systemctl is-active nginx 20
Port Forwarding ภาพหน้าเว็บ http://127.0.0.1:8080 20
Synced Folder แก้ site/index.html แล้วแสดงผลบนเว็บโดยไม่ Provision ซ้ำ 15
Lifecycle แสดงคำสั่ง vagrant halt และ vagrant up พร้อมอธิบายความแตกต่างจาก destroy 10
รวม 100

#คำถามเพื่ออภิปราย

  1. Vagrant ต่างจากการสร้าง VM ผ่าน VirtualBox GUI อย่างไร?
  2. เหตุใดไฟล์ Vagrantfile และ provision.sh จึงเหมาะกับการเก็บใน Git?
  3. Port Forwarding และ Private Network ต่างกันอย่างไร?
  4. เหตุใดใน Lab นี้จึงเลือก host_ip: "127.0.0.1"?
  5. vagrant reload และ vagrant provision ใช้ในสถานการณ์ใด?
  6. หากต้องใช้ Workshop ในห้องเรียน 40 เครื่องในปี 2570 ควรจัดการ Box และการแจกจ่ายไฟล์อย่างไร?

#12. แนวทางต่อยอดสำหรับ DevOps / Software Engineering

เมื่อทำ Workshop นี้สำเร็จ สามารถต่อยอดเป็นการติดตั้ง Docker Engine บน Ubuntu VM, การสร้าง VM หลายเครื่องสำหรับ Web/Database, ใช้ Ansible แทน Shell Provisioner, การทดลอง Kubernetes แบบ Multi-node ใน Lab, หรือการทดสอบ CI/CD ที่ต้องสร้าง Environment ตามความต้องการของแต่ละโปรเจกต์

สำหรับเครื่อง Host ที่มี RAM ไม่มาก ควรเริ่มจาก VM เดียวก่อน และประเมินทรัพยากรเมื่อเพิ่มจำนวน VM

#13. สรุป

VirtualBox มีหน้าที่สร้างและรัน VM ส่วน Vagrant ช่วยทำให้การสร้างและควบคุม VM เป็นกระบวนการที่กำหนดด้วยไฟล์และรันซ้ำได้ การใช้ร่วมกันใน Workshop นี้ทำให้ผู้เรียนฝึกการสร้าง Ubuntu, SSH, Provisioning, File Sharing และ Network Configuration ผ่าน Command Line ได้จริง โดยไม่ต้องตั้งค่าทุกอย่างผ่าน GUI

ขอบเขตการตรวจสอบ: ไฟล์ Vagrantfile และ Shell Script ในชุดประกอบบทความได้รับการตรวจไวยากรณ์ (ruby -c, bash -n) แต่ไม่ได้ทดลองเปิด VM จริงในสภาพแวดล้อมที่สร้างบทความนี้ ผู้สอนควรทดสอบบน Host OS, VirtualBox, Vagrant และ Box เวอร์ชันที่ใช้ในห้องเรียนก่อนนำไปสอน

#เอกสารอ้างอิง

  1. HashiCorp — Vagrant Installation
  2. HashiCorp — VirtualBox Provider
  3. HashiCorp — Vagrant Getting Started
  4. HashiCorp — VirtualBox Configuration
  5. HashiCorp — Forwarded Ports
  6. HashiCorp — Shell Provisioning
  7. HashiCorp — Synced Folders
  8. HashiCorp — Vagrant Box CLI
  9. HashiCorp — HCP Vagrant Deprecation, September 17, 2026
  10. Oracle — VirtualBox Downloads

บทความ Workshop ภาษาไทยสำหรับการศึกษาและฝึกปฏิบัติ Linux, Virtualization และ DevOps