Cấu hình virtual box cho phát triển phần mềm
How to get it ez to use vm as a "environment"
Chào mọi người, đây là bài viết đầu tiên của mình và hôm nay mình sẽ chia sẻ một số thứ liên quan tới việc cấu hình virtualbox sao cho thuận tiện trong việc code kiết các thứ trên vm. À hệ điều hành mình đang sử dụng là window trên máy host và ubuntu 22.04 cho máy vm. Việc cài một mớ thứ lên máy win và gặp lỗi xung đột package trong lúc code and run (ví dụ như python chẳng hạn) là thường thấy, và cả việc install/uninstall các phiên bản thường phiền phức nữa. Nên dùng virtualbox để cài đặt môi trường làm việc là đấng cứu tinh cho những vấn đề này. Và vấn đề cũng phát sinh khi mà run một web local trên vm thì lên trên máy window host chả thấy nó đâu =))). Lúc này thì lại cần chúng ta nhảy vào cấu hình lại network, port các thứ - điều mà mọi người ít khi để ý, nhất là trong thời đại vibe coding tràn lan thế này. Dài dòng đủ rồi, đi vào chuyện chính nào.
Hiểu "network" của virtualbox
Ở đây mình chỉ đang nói tới cách chúng ta có thể "port" một process ra ngoài máy window host. Và một VM được cài đặt trên virtualbox sẽ có một số network mode:
- NAT
- Bridge Adapter
- Host-only adapter
- NAT network
- NAT + Host-only
Tương ứng với những mode này, điều chúng ta cần biết khi mà muốn truy cập cái process (web) mà chúng ta đã start bên trong con máy VM virtualbox là cách mà mỗi mode sẽ hoạt động. Ví dụ như bạn có một web được start
http://localhost:4566. Vậy cần làm gì để có thể truy cập bên ngoài trình duyệt máy window host. Câu trả lời là tuỳ vào cách mà bạn sử dụng từng mode. - Với NAT và NAT network , bạn không thể truy cập trực tiếp qua IP
http://localhost:4566của VM, lúc này sẽ cần cấu hình thủ công thông qua port forwarding của virtualbox - Với NAT + Host-only, Bridge Adapter và Host-only Adapter thì mọi thứ đơn giản hơn khi chỉ cần truy cập theo đúng IP là được
Ví dụ:

Chi tiết hơn tí
Nếu VM đang sử dụng NAT
Bạn cần cấu hình port forwarding. Trong VirtualBox: VM → Settings → Network → Adapter 1 → Advanced → Port Forwarding
Sau đó, từ Windows, truy cập: http://localhost:4566
VirtualBox sẽ chuyển TCP connection từ Windows vào port 4566 của Ubuntu VM.
Nếu sử dụng Bridged Adapter hoặc Host-only
Bạn không cần VirtualBox port forwarding.
Ví dụ Ubuntu VM có IP 192.168.1.100, bạn truy cập từ Windows: http://192.168.1.100:4566
Nhưng có một điều kiện quan trọng: Docker phải publish port ra network interface của VM.
Ví dụ:
docker run -d --name floci -p 4566:4566 <floci-image>
Lệnh -p 4566:4566 mặc định publish trên các địa chỉ host thích hợp, thường là 0.0.0.0:4566
Nếu bạn chạy:
docker run -p 127.0.0.1:4566:4566 ...
thì chỉ VM truy cập được thông qua localhost của chính VM; Windows không thể truy cập trực tiếp qua IP của VM.
Bạn có thể kiểm tra:
docker ps && ss -lnt | grep 4566
Lưu ý: Firewall trong Ubuntu cũng có thể chặn kết nối từ Windows.
Cấu hình mình xài
Mình sử dụng 2 Network Adapters:
- Adapter 1 — NAT: Cho VM truy cập Internet, tải Docker images, cài packages.
- Adapter 2 — Host-only Adapter: Cho máy window host giao tiếp trực tiếp với các service trong VM. Với cách này, mình không cần tạo một port-forwarding rule mỗi khi triển khai thêm service mới
All rights reserved