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