Lời nói đầu

Trong thực tế các doanh nghiệp yêu cầu bảo mật cao, có nhóm nhân sự không được phép kết nối internet trực tiếp, vậy lúc này làm sao khi nhân sự muốn làm tác vụ cần internet? Những giải pháp cấp thiết bị sẽ là bài toán đáng cân nhắc, thay vậy việc sử dụng Docker để tạo nhanh chóng một máy ảo Windows và truy cập trực tiếp bằng private IP của doanh nghiệp là điều hợp lý.

Hay có team QA nhờ bạn spin up nhanh một Windows Server 2022 để test automation và task chỉ cần một môi trường Windows để dùng vài tiếng, mà nhiều khi bạn phải đánh đổi hàng giờ cài đặthàng chục GB ổ cứng, hoặc chi phí sử dụng VPS/Cloud.

Hoặc đơn giản hơn, nếu bạn đã từng muốn có ngay một chiếc Windows để test App, chạy thử phần mềm, dựng lab học, hoặc demo cho khách… nhưng rồi bị mất thời gian như tải ISO, Setup, chờ đợi,… và trong đầu nảy ra suy nghĩ giờ mà có one-click hay gõ vài command là sẽ có ngay hạ tầng nhỉ?

Lợi ích khi sử dụng Windows trên Docker

  1. Triển khai cực nhanh – chỉ cần một vài setup ban đầu và lệnh Docker là có ngay môi trường Windows, không mất hàng giờ cài đặt như VM.
  2. Tự động hóa dễ dàng – có thể tích hợp vào CI/CD, pipeline, script để spin up/xóa Windows bất kỳ lúc nào.
  3. Tiết kiệm tài nguyên – nhẹ hơn máy ảo truyền thống, không “ăn” RAM/CPU quá nhiều.
  4. Khởi tạo lại dễ dàng – môi trường có thể tạo – xóa – tạo lại nhiều lần mà không để lại “rác”.
  5. Đa dạng version – chạy song song Windows 7, 10, 11, Windows Server… chỉ bằng việc đổi VERSION.
  6. Tiết kiệm chi phí – không cần thuê VPS hay cloud đắt đỏ, chạy ngay trên máy hoặc hạ tầng có sẵn.
  7. Chia sẻ dễ dàng – bind volume để chia sẻ file giữa host ↔ Windows chỉ trong vài giây.
  8. Linh hoạt trong bảo mật – phù hợp với doanh nghiệp hạn chế truy cập internet, có thể dựng sẵn image nội bộ cho nhân sự sử dụng.
  9. Truy cập tiện lợi – dùng web viewer để theo dõi cài đặt, hoặc RDP full trải nghiệm như PC thật.
  10. Phù hợp nhiều đối tượng – DevOps, QA, tester, sinh viên, security team, tất cả đều có thể tận dụng.

Chuẩn bị môi trường

Tùy vào hạ tầng và bài toán của bạn, dưới đây là cấu hình đề xuất nếu như bạn muốn làm Lab để nắm bắt được kiến thức, server Ubuntu được cài trên VMware với phần cứng máy chủ cần hỗ trợ công nghệ ảo hóa (Virtualization).

Hệ điều hànhCPURAMỔ cứng
Ubuntu Server4 Core8 GB40 GB

Bật tính năng ảo hóa sâu

Tùy vào môi trường bạn sử dụng (VMware, Esxi, Proxmox, Hyper-V,…) bật nested virtualization cho VM (Nếu là máy chủ vật lý thì bỏ qua).

Bước 1. Đảm bảo đã tắt VM

Bước 2: Cấu hình bật Nested VT-x/EPT

  • vSphere/ESXi:
    • Chuột phải VM → Edit Settings → VM Options → Advanced → Configuration Parameters…
    • Thêm (hoặc sửa) khóa: vhv.enable = "TRUE"
    • CPU: bảo đảm “Hardware virtualization” được bật (Expose hardware assisted virtualization to the guest OS). Với UI mới: CPU → Advanced → tick “Expose virtualization extensions to the guest OS”.
    • Nếu có mục CPU/MMU Virtualization, chọn “Intel VT-x/EPT”.
  • VMware Workstation / Fusion:
    • Chuột phải VM → Settings → Processors → Chọn “Virtualize Intel VT-x/EPT or AMD-V/RVI”.
    • (Tuỳ chọn) Chọn “Virtualize CPU performance counters”.

Bước 3: Bật lại VM, kiểm tra guest đã thấy VT-x

grep -m1 -o 'vmx' /proc/cpuinfo || echo "NO_VMX"

kết quả chính xác vmx.

Cách kiểm tra hệ thống có hỗ trợ KVM không?

sudo apt install cpu-checker
sudo kvm-ok

Nếu không hỗ trợ, hãy bật Intel VT-x hoặc AMD SVM trong BIOS.

Cài gói và bật module KVM/TUN

sudo apt update

sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils \
  linux-modules-extra-$(uname -r)

sudo modprobe kvm
sudo modprobe tun

Kiểm tra:

# lsmod | grep -E 'kvm|kvm_intel|tun'
kvm_intel             487424  0
kvm                  1409024  1 kvm_intel
irqbypass              12288  1 kvm

# ls -l /dev/kvm /dev/net/tun
crw-rw---- 1 root kvm  10, 232 Sep  1 09:27 /dev/kvm
crw-rw-rw- 1 root root 10, 200 Sep  1 09:27 /dev/net/tun

Trong trường hợp nếu /dev/net/tun chưa có:

sudo mkdir -p /dev/net
sudo mknod /dev/net/tun c 10 200
sudo chmod 0666 /dev/net/tun

Cấp quyền truy cập cho KVM

Đảm bảo nhóm kvm có quyền và Docker root có thể dùng được

sudo chgrp kvm /dev/kvm
sudo chmod 660 /dev/kvm

(Tùy chọn) nếu bạn chạy Docker rootless hay user khác:

sudo setfacl -m u:root:rw,g:kvm:rw /dev/kvm

Cài đặt Window container trên Docker

Dùng Docker CLI

docker run -d --name windows \
  --privileged \
  --security-opt apparmor=unconfined \
  --security-opt seccomp=unconfined \
  --device=/dev/kvm --device=/dev/net/tun \
  --cap-add=NET_ADMIN \
  -p 8006:8006 -p 3389:3389/tcp -p 3389:3389/udp \
  -v $PWD/windows:/storage \
  -e VERSION=11 -e CPU_CORES=4 -e RAM_SIZE=6G -e DISK_SIZE=20G \
  dockurr/windows

Dùng Docker Compose

services:
  windows:
    image: dockurr/windows
    container_name: windows
    privileged: true
    security_opt:
      - apparmor=unconfined
      - seccomp=unconfined
    cap_add:
      - NET_ADMIN
    devices:
      - /dev/kvm
      - /dev/net/tun
    ports:
      - "8006:8006"
      - "3389:3389/tcp"
      - "3389:3389/udp"
    volumes:
      - ./windows:/storage
    environment:
      VERSION: "11"
      CPU_CORES: "4"
      RAM_SIZE: "6G"
      DISK_SIZE: "20G"
    restart: always
    stop_grace_period: 2m

Dùng Kubernetes

kubectl apply -f https://raw.githubusercontent.com/dockur/windows/refs/heads/master/kubernetes.yml

Khởi chạy container Windows

docker compose up -d

Kiểm tra logs sẽ thấy kết quả như sau:

Truy cập trên trình duyệt với địa chỉ http://IP_SERVER:8006 sẽ thấy windows trên docker đang được khởi tạo

Khởi tạo thành công Windows chạy trên Docker đã chính thức hoạt động

(Tùy chọn) Bạn có thể setting để thiết lập lại kích thước màn hình để xem rõ nét hơn

Bây giờ bạn hoàn toàn có thể truy cập internet và sử dụng tùy mục đích

Các tùy chỉnh cấu hình và mở rộng

Thay đổi phiên bản Windows

Thêm biến môi trường VERSION trong docker-compose.yml:

environment:
  VERSION: "11"
Giá trịPhiên bản WindowsDung lượng Image
11Windows 11 Pro5.4 GB
11lWindows 11 LTSC4.7 GB
11eWindows 11 Enterprise4.0 GB
10Windows 10 Pro5.7 GB
10lWindows 10 LTSC4.6 GB
10eWindows 10 Enterprise5.2 GB
8eWindows 8.1 Enterprise3.7 GB
7uWindows 7 Ultimate3.1 GB
vuWindows Vista Ultimate3.0 GB
xpWindows XP Professional0.6 GB
2kWindows 2000 Professional0.4 GB
2025Windows Server 20255.6 GB
2022Windows Server 20224.7 GB
2019Windows Server 20195.3 GB
2016Windows Server 20166.5 GB
2012Windows Server 20124.3 GB
2008Windows Server 20083.0 GB
2003Windows Server 20030.6 GB

Cấu hình CPU & RAM

Mặc định: 2 CPU & 4GB RAM. Để thay đổi:

environment:
  CPU_CORES: "4"
  RAM_SIZE: "8G"

Tạo người dùng và mật khẩu

environment:
  USERNAME: "devops"
  PASSWORD: "password"

Tài khoản mặc định: Docker/admin.

Chọn ngôn ngữ Windows

environment:
  LANGUAGE: "Vietnamese"

Hiện tại Windows trên docker hỗ trợ nhiều ngôn ngữ: English, Chinese, Japanese, Korean, French, German, Russian, Spanish, Portuguese, Thai, Turkish, Vietnamese,…

Thay đổi dung lượng Disk

Thêm biến DISK_SIZE:

environment:
  DISK_SIZE: "20G"

Thay đổi nguồn ISO

Trong doanh nghiệp thường sẽ ưu tiên sử dụng các nguồn từ nội bộ cung cấp để đảm bảo sự tối ưu và bảo mật nên bạn có thể tham khảo 2 cách dưới đây để dùng nguồn ISO khác.

1. Sử dụng link đến ISO

Trong VERSION thay vì chỉ định như trên bạn có thể sử dụng trực tiếp link đến file ISO, link này có thể là ISO được upload lên nền tảng lưu trữ nội bộ, dưới đây là ví dụ cụ thể cách sử dụng:

services:
  windows:
    image: dockurr/windows
    container_name: windows
    privileged: true
    security_opt:
      - apparmor=unconfined
      - seccomp=unconfined
    cap_add:
      - NET_ADMIN
    devices:
      - /dev/kvm
      - /dev/net/tun
    ports:
      - "8006:8006"
      - "3389:3389/tcp"
      - "3389:3389/udp"
    volumes:
      - ./windows:/storage
    environment:
      VERSION: "https://archive.org/download/win-server-2012R2-eva-multi-lang/9600.17050.WINBLUE_REFRESH.140317-1640_X64FRE_SERVER_EVAL_EN-US-IR3_SSS_X64FREE_EN-US_DV9.ISO"
      CPU_CORES: "4"
      RAM_SIZE: "6G"
      DISK_SIZE: "20G"
    restart: always
    stop_grace_period: 2m

Kết quả tương tự sẽ thấy ở màn hình khởi tạo ISO được download

2. Mount bằng file ISO vào container

Thay vì đặt URL trong biến VERSION, bạn sẽ bind-mount ISO vào container. Docker image dockur/windows mặc định sẽ tự ưu tiên file /boot.iso nếu nó tồn tại, do đó ta chỉ cần bind đường dẫn ISO vào đúng vị trí đó và lúc này sẽ không sử dụng ENV VERSION như sau:

services:
  windows:
    image: dockurr/windows
    container_name: windows
    privileged: true
    security_opt:
      - apparmor=unconfined
      - seccomp=unconfined
    cap_add:
      - NET_ADMIN
    devices:
      - /dev/kvm
      - /dev/net/tun
    ports:
      - "8006:8006"
      - "3389:3389/tcp"
      - "3389:3389/udp"
    volumes:
      - ./windows:/storage
      - /home/devopsvietnamresearch/iso/en_windows_server_2012_r2.iso:/boot.iso
    environment:
      CPU_CORES: "4"
      RAM_SIZE: "6G"
      DISK_SIZE: "20G"
    restart: always
    stop_grace_period: 2m

Chia sẻ file với máy host

Trong window, mở File Explorer → Network → click vào host.lan. Trong docker-compose.yml:

volumes:
  - ./example:/data

Folder ./example trên host sẽ xuất hiện trong Windows tại \\host.lan\Data.

Chọn cài đặt thủ công

Khuyến nghị bạn nên sử dụng chế độ cài đặt tự động vì nó sẽ tự cấu hình nhiều thiết lập giúp tránh lỗi phổ biến khi chạy Windows trong môi trường ảo hóa.

Tuy nhiên, nếu bạn vẫn muốn tự cài đặt thủ công và chấp nhận rủi ro, hãy thêm biến môi trường sau vào file docker-compose.yml:

environment:
  MANUAL: "Y"

Cách thêm nhiều ổ đĩa

Để tạo thêm các ổ đĩa bổ sung, sửa docker-compose.yml như sau:

environment:
  DISK2_SIZE: "32G"
  DISK3_SIZE: "64G"
volumes:
  - ./example2:/storage2
  - ./example3:/storage3

Cách gắn ổ đĩa vật lý vào container

Bạn có thể pass-through ổ đĩa vật lý hoặc phân vùng trực tiếp cho container bằng cách thêm vào docker-compose.yml:

devices:
  - /dev/sdb:/disk1
  - /dev/sdc1:/disk2

Cách gắn USB vào container

Để pass-through một thiết bị USB:

  1. Dùng lệnh lsusb để lấy vendor ID và product ID của thiết bị.
  2. Thêm các thông tin này vào file docker-compose.yml:
environment:
  ARGUMENTS: "-device usb-host,vendorid=0x1234,productid=0x1234"
devices:
  - /dev/bus/usb

Lưu ý: Nếu USB là ổ đĩa ngoàihãy kết nối sau khi quá trình cài đặt Windows hoàn tất. Nếu cắm trước, thứ tự ổ đĩa có thể bị thay đổi, gây lỗi khi cài.

Cấu hình mạng cho Windows container

Cách gán địa chỉ IP tĩnh

Mặc định, container Windows sử dụng bridge network, tức là dùng chung IP với host. Nếu bạn muốn cấp riêng một địa chỉ IP cho container, hãy tạo mạng macvlan như sau:

docker network create -d macvlan \
    --subnet=192.168.0.0/24 \
    --gateway=192.168.0.1 \
    --ip-range=192.168.0.100/28 \
    -o parent=eth0 vlan

Lưu ý: Hãy điều chỉnh subnetgateway và parent cho phù hợp với mạng nội bộ của bạn.

Sau khi tạo network, sửa file docker-compose.yml như sau:

services:
  windows:
    container_name: windows
    ...
    networks:
      vlan:
        ipv4_address: 192.168.0.100

networks:
  vlan:
    external: true

Ưu điểm: Khi dùng macvlan, bạn không cần mở port thủ công nữa, vì container sẽ được cấp IP riêng biệt.

Lưu ý: Theo thiết kế của macvlan, Docker host không thể giao tiếp trực tiếp với container qua IP đó. Nếu cần, bạn phải cấu hình macvlan thứ hai để khắc phục.

Cách để tự nhận DHCP từ router

Sau khi cấu hình macvlan, bạn có thể để Windows nhận IP động từ router/DHCP server, giống như một máy tính thật.

Thêm các dòng sau vào docker-compose.yml:

environment:
  DHCP: "Y"
devices:
  - /dev/vhost-net
device_cgroup_rules:
  - 'c *:* rwm'

Cách kết nối Container qua RDP

Trình web viewer chỉ nên dùng trong quá trình cài đặt vì chất lượng hình ảnh thấp, không hỗ trợ âm thanh và không hỗ trợ copy/paste.

Để có trải nghiệm tốt hơn, hãy sử dụng Remote Desktop (RDP) của Microsoft để kết nối trực tiếp đến IP của container bằng thông tin đăng nhập mặc định:

  • Username: Docker
  • Password: admin

Các lựa chọn client RDP:

Kết luận

Với Docker, việc triển khai Windows không còn là một quá trình phức tạp và tốn thời gian nữa. Chỉ với một vài dòng lệnh, bạn có thể tạo ra môi trường Windows hoàn chỉnh, linh hoạt và dễ dàng tùy chỉnh theo nhu cầu.

Từ developer cần test nhanh ứng dụng, QA muốn kiểm thử đa phiên bản, đến DevOps cần tích hợp Windows vào pipeline, tất cả đều có thể tận dụng giải pháp này để tiết kiệm thời gian, giảm chi phí và tối ưu tài nguyên. Đây không chỉ là cách cài Windows nhanh hơn, mà còn là một bước tiến để bạn làm việc hiệu quả và chủ động hơn trong mọi tình huống.

Leave a Reply

This site uses cookies to offer you a better browsing experience. By browsing this website, you agree to our use of cookies.