note/tech/在linux中使用docker运行windows.md
2025-11-19 10:16:05 +08:00

143 lines
4.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 在linux中使用docker运行windows
## 为什么要在linux中运行windows
作为一个linuxer我其实已经多年没有正儿八经的使用windows了。但是
首先讲一下为什么要跑windows。原因是贵司打印机实在太老linux下搞了半天没找到相应的驱动只能用windows的驱动来使用这台打印机。
除了这个原因还有其他的比如在使用wps 高级版的时候有时会用到pdf编辑等高级功能。这些功能在linux版本的wps会员版中是没有的。当然还有使用adobe系列软件、其他视频编辑软件时偶尔也会用到windows版本。因为linux下的这些专业软件实在不太行。
## 为什么要用docker跑windows
其实在linux下跑windows有很多方法我的电脑还装着双系统。在linux下可以跑虚拟机vmware、virtualbox等。但是试试看就知道跑这些非常的耗资源而且虚拟机的性能也非常不可靠。
而docker则是非常的轻量级的虚拟化技术可以让你在linux系统中运行windows的应用。
## 如何安装docker下的windows
### 如何安装docker
这个省略吧!网上一搜一大把!
### 如何安装docker下的windows
使用这个镜像dockurr/windows
#### 使用之前请先检测cpu是否支持虚拟化kvm。大部分现在的电脑都是支持的。
- cpu是否支持kvm
```sh
egrep -c '(vmx|svm)' /proc/cpuinfo
```
如果返回数字大于0则表示支持kvm。
- 验证是否加载了kvm模块
```sh
lsmod | grep kvm
```
如果没有加载kvm模块则需要加载
```sh
modprobe kvm
```
- 检查/dev/kvm是否存在
```sh
ls -l /dev/kvm
```
如果没有这个文件,则需要创建:
```sh
mknod /dev/kvm c 10 232
```
#### 下载镜像dockurr/windows
```sh
docker pull dockurr/windows
```
#### 运行镜像
```sh
docker run -d \
--name windows \
-e RAM_SIZE="4G" \
-e CPU_CORES="4" \
-e VERSION="win10" \
-v /windows/docker/storage:/storage \
--device /dev/dri \
--device /dev/kvm \
--cap-add NET_ADMIN \
-p 8006:8006 \
-p 3389:3389/tcp \
-p 3389:3389/udp \
--stop-timeout 2m \
--restart on-failure \
dockurr/windows
```
#### 使用docker-compose
也可以使用docker-compose来运行镜像如果用这个来运行则可省略以上[下载镜像]和[运行镜像]两步。
把以下代码复制新建一个docker-compose.yaml文件然后执行`docker compose up -d ` :
```yaml
version: "3"
services:
windows:
image: dockurr/windows
container_name: windows
environment:
RAM_SIZE: "4G"
CPU_CORES: "4"
VERSION: "win10"
volumes:
- /windows/docker/storage:/storage
devices:
- /dev/dri
- /dev/kvm
cap_add:
- NET_ADMIN
ports:
- 8006:8006
- 3389:3389/tcp
- 3389:3389/udp
stop_grace_period: 2m
restart: on-failure
```
解释一下上面的代码:
- `image: dockurr/windows`:指定镜像
- `container_name: windows`:指定容器名
- `environment`设置环境变量这里设置了内存和cpu核数,VERSION是指需要运行windows的版本。在docker作者主页有详细解释。
- `volumes`:挂载目录,这里挂载了/windows/docker/storage目录到容器的/storage目录
- `devices`:指定设备,这里指定了/dev/dri和/dev/kvm设备
- `cap_add`添加权限这里添加了NET_ADMIN权限
- `ports`端口映射这里映射了8006端口到容器的8006端口8006端口是web访问的端口运行后可以使用浏览器直接运行windows(http://localhost:8006)。3389端口到容器的3389端口。3389端口是远程桌面协议RDP的端口需要映射出来。
- `stop_grace_period`设置停止超时时间这里设置了2分钟
- `restart`:设置重启策略,这里设置了在失败时重启
## 如何使用windows
### 浏览器使用
这也是最方便的使用方法。
启动容器后使用浏览器访问http://localhost:8006进入windows的桌面。
### rdp连接
由于开启了rdp远程桌面端口映射所以可以直接使用远程桌面连接到容器。
推荐这种方式,体验更好,也不卡顿。
linux下远程桌面软件推荐开源的freerdp。自行搜索安装。
然后运行:
```sh
xfreerdp3 /u:docker /p: /v:localhost /scale:180 /size:2560x1440
```
解释一下:
- `/u:docker`:用户名,这个是默认的
- `/p:`:密码,这个是空的
- `/v:localhost`远程计算机的ip地址这里是本机
- `/scale:180`:缩放比例,可以根据需要设置
- `/size:2560x1440`:分辨率,可以根据需要设置
然后就可以进入windows桌面了。
## 本地化管理
由于docker映射到了storage目录所以可以直接在本地进行管理。