# 在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目录，所以可以直接在本地进行管理。