如何在虚拟机VM上|Linux环境内安装windows

https://hub.docker.com/r/dockurr/windows

https://hub.docker.com/r/microsoft/windows-server/

打开上面链接,先读一遍内容,再去拉取镜像 :docker pull dockurr/windows

接着,在 Linux 系统中加载 KVM 模块

  1. 检查当前 KVM 支持

|-------------------|
| lsmod | grep kvm |

如果看到 kvm_intel 或 kvm_amd 表示已加载(根据 CPU 类型显示)

若无输出则表示未加载

  1. 如果是虚拟机里面的linux,还有执行以下处理,如果不是,则需要检查系统本身 BIOS 虚拟化设置

a)检查虚拟机设置

vmx.allowNested = "TRUE" # 在 .vmx 配置文件中手动添加

b)检查系统本身

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| sudo modprobe kvm # 加载基础 KVM 模块 sudo modprobe kvm_intel # Intel CPU 专用模块 # 或 sudo modprobe kvm_amd # AMD CPU 专用模块 #设置开机自动加载 # 创建模块配置文件 echo "kvm" | sudo tee /etc/modules-load.d/kvm.conf echo "kvm_intel" | sudo tee -a /etc/modules-load.d/kvm.conf # Intel # 或 echo "kvm_amd" | sudo tee -a /etc/modules-load.d/kvm.conf # AMD # 重新生成 initramfs(仅某些发行版需要) sudo update-initramfs -u |

  1. 验证嵌套虚拟化是否生效(可能仅适合虚拟机)

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| # 检查 CPU 虚拟化支持标志(应看到 vmx 或 svm) grep -E '(vmx|svm)' /proc/cpuinfo # 检查 KVM 模块是否加载(应显示 kvm_intel/kvm_amd 和 kvm) lsmod | grep kvm # 验证 /dev/kvm 设备存在 ls -l /dev/kvm |

  1. 安装kvm的相关依赖

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| # Ubuntu/Debian 系统 sudo apt update sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients virt-manager docker.io docker-compose # CentOS/RHEL 系统 sudo yum install -y qemu-kvm libvirt virt-manager docker docker-compose sudo systemctl enable --now libvirtd docker |

  1. 配置用户权限

|--------------------------------------------------------------------------------------|
| # 将当前用户加入 kvm 和 docker 组 sudo usermod -aG kvm,docker $USER newgrp kvm # 刷新组权限(或重新登录) |

  1. 启动 Docker Windows 容器

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| #创建/home/docker-windows/storage 用于映射主机与容器的目录 mkdir -p /home/docker-windows/storage 创建docker-compose.yml 文件 下面三选一,建议选第三种 |-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | services: windows: # 定义名为 windows 的服务 image: dockurr/windows # 使用 dockurrr/windows 镜像(专用于运行 Windows 的 Docker 镜像) container_name: windows # 指定容器名称 environment: VERSION: "11" # 指定要运行的 Windows 版本(11 表示 Windows 11) RAM_SIZE: "8G" # 分配内存(默认 4G) # 分配 CPU 核心数 devices: - /dev/kvm # 挂载 KVM 虚拟化设备(必需硬件加速) - /dev/net/tun # 挂载 TUN/TAP 设备(用于虚拟网络) cap_add: - NET_ADMIN # 授予容器网络管理权限 ports: - 8006:8006 # 映射 Web 控制台端口(用于访问 Windows 界面) - 3389:3389/tcp # 映射 RDP 远程桌面协议端口(TCP) - 3389:3389/udp # 映射 RDP 远程桌面协议端口(UDP) volumes: - /home/docker-windows/storage:/storage # 将/home/docker-windows/storage 目录文件夹挂载到容器 /storage 路径(持久化存储) restart: always # 容器退出时自动重启 stop_grace_period: 2m # 容器停止前等待 2 分钟(确保正常关闭) | | #如果上面的配置导致启动起来时没有下载剩余的依赖,就用默认的配置 services: windows: image: dockurr/windows container_name: windows environment: VERSION: "11" devices: - /dev/kvm - /dev/net/tun cap_add: - NET_ADMIN ports: - 8006:8006 - 3389:3389/tcp - 3389:3389/udp volumes: - ./windows:/storage restart: always stop_grace_period: 2m | | #亦或者(建议这种) docker run -it \ --name windows \ -p 8006:8006 \ -p 3389:3389/tcp \ -p 3389:3389/udp \ --device /dev/kvm \ --device /dev/net/tun \ --cap-add NET_ADMIN \ -v /home/docker-windows/storage:/storage \ --restart always \ --stop-timeout 120 \ -e VERSION="11" \ -e DISK_SIZE="256G" \ -e LANGUAGE="CN" \ -e RAM_SIZE="8G"\ -e CPU_CORES="4"\ dockurr/windows | |
| 授权当前用户用户组配置 sudo usermod -aG docker,kvm $USER newgrp docker # 立即生效组权限变更 # 启动容器(后台运行) docker-compose up -d |

建议使用第三种docker run -it.. 的方式(前面两种会报一些莫名其妙的问题,最好多快照一下,说不准遇到某些地方做错了要重来)

等待下载

在shell 的主机上打开这个地址,我的主机安装了vmware linux(192.168.4.9),所以使用这个的地址打开window的安装界面,进一步等待下载,完成后如图,便可完成,如果没有配置端口放开8006的,看下面第8点配置防火墙

至此,会导致之前linux里安装的东西,如数据库链接不上,似乎被劫持了(看第9点)

  1. 进入容器

|--------------------------------------------------------------------------------------------------------------|
| docker exec -it windows /bin/bash |

外面ping一下

容器内访问外部

  1. 配置防火墙

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| # 永久开放 8006/TCP 端口 sudo firewall-cmd --permanent --add-port=8006/tcp # 重新加载防火墙配置 sudo firewall-cmd --reload # 验证端口是否开放 sudo firewall-cmd --list-ports | grep 8006 |

  1. 因为前面出现网络问题,调整网络,以192.168.4网段为例(因为我最外面的是windows,我想通过最外面的windows访问里面容器windows,但生产环境应该不用配的,并且以下会导致宿主机linux无法与docker的windows互连)

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| #虚拟机linux 创建vlan docker network create -d macvlan \ --subnet=192.168.4.0/24 \ --gateway=192.168.4.1 \ -o parent=ens33 vlan # 修改docker-compose.yml配置 |--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | services: windows: image: dockurr/windows container_name: windows environment: VERSION: "11" devices: - /dev/kvm - /dev/net/tun cap_add: - NET_ADMIN ports: - 8006:8006 - 3389:3389/tcp - 3389:3389/udp volumes: - /home/docker-windows/storage:/storage networks: vlan: ipv4_address: 192.168.4.100 # 指定容器 IP 地址 networks: vlan: external: true | |

进入docker windows容器

最外面的windows 访问虚拟机里面的linux 的docker容器windows地址192.168.4.100

linux 开放 windows端口

|-----------------------------------------------------------------------------------------------------------------------------------------------------|
| # 永久开放端口 sudo firewall-cmd --permanent --add-port=3389/tcp sudo firewall-cmd --permanent --add-port=3389/udp # 重新加载防火墙配置 sudo firewall-cmd --reload |

但这样会有个问题docker的windows无法与linux 互连

链接:https://blog.oddbit.com/post/2018-03-12-using-docker-macvlan-networks/#host-access

解决办法:

停止容器,删除之前的配的vlan

docker network rm vlan

接着重新配置

步骤 1:创建带有 --aux-address 的 macvlan 网络

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| docker network create -d macvlan \ --subnet=192.168.4.0/24 \ --gateway=192.168.4.1 \ -o parent=ens33 \ --aux-address 'host=192.168.4.200' \ my_macvlan_network 解释: --subnet 和 --gateway:指定子网和网关。 -o parent=ens33:指定父接口(此处为 ens33)。 --aux-address 'host=192.168.4.200':为宿主机预留一个 IP 地址(192.168.4.200),防止 Docker 分配给容器。 |

验证网络配置

docker network inspect my_macvlan_network

步骤2:在宿主机上创建新的 macvlan 接口

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| #链接到父接口 ens33 并使用桥接模式。 sudo ip link add mynet-shim link ens33 type macvlan mode bridge #配置接口 IP 地址并启 sudo ip addr add 192.168.4.200/32 dev mynet-shim sudo ip link set mynet-shim up 解释: ip addr add:为 mynet-shim 接口分配预留的 IP 地址 192.168.4.200。 ip link set:启动该接口。 #验证接口状态 ip addr show mynet-shim #添加路由条目 sudo ip route add 192.168.4.0/24 dev mynet-shim #验证 ip route show | grep mynet-shim |

注意:因为改名了vlan->my_macvlan_network

所以docker-compose.yml 也要改一下

保存运行windows docker

docker-compose up --force-recreate -d

验证网络,可以看到整个网络互通了。

10 . 远程一下容器内的windows

可以用安装向日葵的方式,也可以采用windows的自带远程

至此结束

题外话: 以上方式最终是没用到生产环境上,用台主机安装windows 简直不要太方便。。。

以上内容仅供参考,如果过程中遇到问题,问我也没用,因为我也看不太懂了,这大概就是做开发经常遇到的无语情况吧。

相关推荐
序属秋秋秋2 小时前
《Linux系统编程之进程控制》【进程等待】
linux·c语言·c++·进程·系统编程·进程控制·进程等待
zfj3212 小时前
top 命令中的 wa (IO wait) 指标,理论上几乎完全是由磁盘IO(包括swap)引起的,而不是网络IO
linux·网络·top·iowait
fengye2071612 小时前
win10+VM17+虚拟机win10搭建(三)
windows
Xの哲學2 小时前
Linux网卡注册流程深度解析: 从硬件探测到网络栈
linux·服务器·网络·算法·边缘计算
不哦罗密经3 小时前
python相关
服务器·前端·python
数字化转型20253 小时前
SAP Signavio 在风机制造行业的深度应用研究
大数据·运维·人工智能
用户6135411460163 小时前
libicu-62.1-6.ky10.x86_64.rpm 安装步骤详解(麒麟V10系统)
linux
WordPress学习笔记3 小时前
wordpress根据分类ID调用分类名称和分类描述
运维·wordpress
qq_455760853 小时前
docker - 镜像、存储卷和网络深入理解
运维·docker·容器