告别容器重启丢失!Dockur Windows持久化配置终极方案

【免费下载链接】windows Windows inside a Docker container. 【免费下载链接】windows 项目地址: https://gitcode.com/GitHub_Trending/wi/windows

你是否遇到过这样的困扰:在Dockur Windows容器中精心安装的软件和复杂的系统配置,在容器重启后全部化为乌有?本文将带你深入理解Docker容器存储机制,掌握三种持久化方案,彻底解决这一痛点。读完本文,你将能够:

  • 理解Dockur Windows容器的存储原理
  • 掌握数据卷挂载实现持久化的方法
  • 配置Samba共享实现文件双向同步
  • 使用自定义ISO实现预装软件的容器部署

容器存储机制解析

Docker容器默认采用临时文件系统,这意味着所有在容器运行时产生的数据和配置变更,在容器重启后都会丢失。Dockur Windows容器也不例外,但通过精心设计的存储方案,我们可以实现数据的持久化保存。

Dockur Windows项目的核心存储逻辑在src/install.sh中实现。该脚本通过STORAGE环境变量定义了容器的存储路径,并通过skipInstall()函数判断是否需要重新安装系统(L33)。当检测到已有系统文件时,会跳过安装过程,直接使用现有数据,这为我们实现持久化提供了基础。

# 关键持久化判断逻辑 [src/install.sh](https://link.gitcode.com/i/5431ce49958196cbc39c8d6e40cbca1b#L33)
[ -f "$boot" ] && hasDisk && return 0

方案一:数据卷挂载持久化

最直接有效的持久化方法是使用Docker的数据卷挂载功能,将容器内的关键目录映射到宿主机的物理磁盘。Dockur Windows容器的默认存储路径可以通过修改compose.yml文件实现持久化配置。

配置步骤

  1. 编辑compose.yml文件,添加volumes配置:
services:
  windows:
    image: dockurr/windows
    container_name: windows
    environment:
      VERSION: "11"
    devices:
      - /dev/kvm
    cap_add:
      - NET_ADMIN
    ports:
      - 8006:8006
      - 3389:3389/tcp
      - 3389:3389/udp
    volumes:
      - ./windows_data:/storage  # 添加此行实现存储持久化
    stop_grace_period: 2m
  1. 创建并初始化宿主机目录:
mkdir -p ./windows_data
chmod 777 ./windows_data
  1. 重启容器应用配置:
docker-compose down
docker-compose up -d

工作原理

通过将宿主机目录./windows_data挂载到容器内的/storage目录,所有写入/storage的数据都会被持久化保存到宿主机磁盘。src/define.sh中定义的STORAGE环境变量控制着容器的存储路径,默认值为/storage

方案二:Samba共享实现文件同步

对于需要频繁在宿主机和容器之间传输文件的场景,配置Samba共享是理想选择。Dockur Windows内置了Samba服务,只需简单配置即可启用。

启用Samba共享

  1. 默认情况下,Samba服务是启用的,相关配置在src/samba.sh中定义。关键配置如下:
# Samba服务默认启用 [src/samba.sh](https://link.gitcode.com/i/0f548a0e3af0c1813afb761121df4e10#L4)
: "${SAMBA:="Y"}"
  1. 如果需要手动启用,确保SAMBA环境变量设置为"Y",并在compose.yml中添加端口映射:
environment:
  - SAMBA=Y
ports:
  - 445:445  # Samba默认端口
  1. 容器启动后,Windows系统会自动识别到名为Data的共享文件夹,路径为\\host.lan\Data

共享目录使用

Samba共享的默认目录在src/samba.sh中定义,默认使用/data/storage/data作为共享根目录。你可以通过挂载自定义目录来修改共享路径:

volumes:
  - /path/on/host:/data  # 自定义共享目录

方案三:自定义ISO实现预装软件

对于需要批量部署相同配置的场景,创建包含预装软件和配置的自定义ISO是最高效的方案。Dockur Windows支持通过CUSTOM环境变量指定自定义ISO文件。

制作自定义ISO

  1. 准备基础Windows ISO文件和需要预装的软件安装包
  2. 使用工具如NTLite或DISM将软件集成到ISO中
  3. 将自定义ISO放置在容器可访问的路径
  4. compose.yml中配置:
environment:
  - CUSTOM=/custom.iso  # 容器内ISO路径
volumes:
  - /path/to/custom.iso:/custom.iso  # 挂载自定义ISO

自动安装配置

Dockur Windows通过answer file(无人值守安装文件)实现系统的自动配置。项目提供了多种Windows版本的answer file,位于assets/目录下,如assets/win11x64.xml

你可以通过修改这些XML文件来自定义系统配置,如设置分辨率、时区、用户账户等。src/install.sh中的updateXML()函数(L617)负责处理这些配置,将其注入到安装过程中。

三种方案对比与选择

方案优点缺点适用场景
数据卷挂载配置简单,性能好需提前规划挂载路径个人使用,简单持久化需求
Samba共享双向同步,使用方便依赖网络,速度较慢文件频繁交换,临时存储
自定义ISO配置统一,部署高效制作复杂,灵活性低批量部署,标准化环境

最佳实践与注意事项

  1. 多方案组合使用:可以同时启用数据卷挂载和Samba共享,数据卷用于核心系统持久化,Samba用于临时文件交换。

  2. 定期备份:即使使用了持久化方案,也建议定期备份挂载的宿主机目录,防止数据意外丢失。

  3. 注意存储路径权限:确保宿主机挂载目录有正确的权限,避免容器内无法写入数据,可参考src/samba.sh的权限设置:

chmod 777 "$dir"  # 确保目录可写 [src/samba.sh](https://link.gitcode.com/i/0f548a0e3af0c1813afb761121df4e10#L26)
  1. 版本兼容性:不同Windows版本的持久化路径可能略有差异,可通过src/define.sh中的printVersion()函数(L359)查看版本信息。

通过本文介绍的三种方案,你可以根据实际需求选择最适合的持久化策略,彻底告别Dockur Windows容器重启后配置丢失的烦恼。无论是个人使用还是企业级部署,这些方法都能帮助你构建稳定、高效的容器化Windows环境。

项目更多高级配置可参考官方文档:README.md,如有问题可访问项目社区寻求支持。

【免费下载链接】windows Windows inside a Docker container. 【免费下载链接】windows 项目地址: https://gitcode.com/GitHub_Trending/wi/windows

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐