我日常在外面有远程桌面Windows的需求,用来学习和工作,用来运行某个指定的软件,还是要做一些跨平台软件的功能验证。因为自己有一台服务器,安装的是Ubuntu系统,又在系统里面安装了Docker,于是有了把Windows装进容器,然后进行远程桌面的想法。
一、环境准备
1.安装了 Docker 的操作系统(我使用 是Ubuntu,其他版本的Linux理论上也是一样的)
2.操作系统是支持 KVM技术,一般情况VPS是不支持的,通常需要独立的服务器。可以通过以下方式进行验证:
安装cpu-checker
sudo apt install cpu-checker -y
然后执行
sudo kvm-ok
如果返回如下内容,表示支持KVM
INFO: /dev/kvm exists
KVM acceleration can be used
二、开始安装Windows
我们这里基于开源项目 dockur/windows 的 Docker 镜像,详细的内容可以查看官方文档。
首先找一个你自己喜欢的目录,编写一个docker-compose.yml文件:
vim docker-compose.yml
将下面面的配置保存为 docker-compose.yml
,然后使用 docker compose up
启动服务。
services:
windows:
image: dockurr/windows
container_name: windows #容器名称
environment:
VERSION: "tiny11" #指定系统版本
DISK_SIZE: "256G" #指定磁盘大小
RAM_SIZE: "8G" #指定内存大小
CPU_CORES: "4" #指定CPU核心数
devices:
- /dev/kvm
cap_add:
- NET_ADMIN
ports:
- 8006:8006 #Web 浏览器中看到 Windows 安装屏幕
- 3389:3389/tcp #远程桌面端口
- 3389:3389/udp
stop_grace_period: 2m
docker compose up
当运行完成,一切就绪后,我们可以使用两个方式来访问这个运行在 Docker 中的 Windows。
三、Windows的使用
第一种方法,是使用浏览器访问容器所在主机的 IP地址:8006
下图为正在下载安装,安装完是Windows桌面。
第二种方法,是使用支持 RDP 远程访问功能的软件,在软件服务器地址和端口内容中分别填写 IP地址
和 3389
,在用户名栏填写 docker
,密码保持空白即可。
其他使用技巧
聊聊其他的使用技巧,其实就是抄官方文档。
更换 Windows 版本(不提前准备镜像)
如果你的网络环境非常棒,不需要提前下载安装镜像,或者直接使用云主机进行项目部署,那么可以考虑直接调整配置文件中的内容为合适的数值:
environment:
VERSION: "win11"
支持我们调整使用的值包含:win11
、win10
、ltsc10
、win81
、win7
、vista
、winxp
、2022
、2019
、2016
、2012
、2008
。
调整 Windows 容器资源配置
默认情况下,这个 Windows 容器会使用 vCPU x2、4GB 内存、64G 的磁盘空间,来满足 Win11 的最低安装需求。我们可以根据自己的实际需求,来动态的调整容器的硬件资源限制。
environment:
RAM_SIZE: "8G"
CPU_CORES: "4"
DISK_SIZE: "256G"
比如,在上面的配置中,我们调整 CPU 核心数到 4,内存到 8GB,磁盘到 256GB。
为容器分配独立的 IP 地址
默认情况下,Docker 会共享宿主机的 IP,如果我们想要让容器拥有独立的 IP 地址,需要先创建一个 macvlan
网络:
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
创建完网卡后,调整上面使用的容器配置,根据自己的需求指定容器 IP 即可:
services:
windows:
container_name: windows
..<snip>..
networks:
vlan:
ipv4_address: 192.168.0.100
networks:
vlan:
external: true
使用一整块磁盘
如果你的主机上有多块磁盘,或者想将某一块磁盘完整的分配给 Windows,可以采用下面的方法,其中 DEVICE
将作为你的主磁盘:
environment:
DEVICE: "/dev/sda"
DEVICE2: "/dev/sdb"
devices:
- /dev/sda
- /dev/sdb
在 Docker 中的 Windows 使用 USB 设备
我们首先需要使用 lsusb
来获取 USB 设备的 VendorID
和 ProductID
,然后将这些信息添加到配置中:
environment:
ARGUMENTS: "-device usb-host,vendorid=0x1234,productid=0x1234"
devices:
- /dev/bus/usb