🚀 使用 Docker Compose 部署 WebDAV(多实例版)
🚀 使用 Docker Compose 部署 WebDAV
WebDAV(Web-based Distributed Authoring and Versioning)是一种基于 HTTP 协议的通信协议,它在标准 HTTP 方法之上扩展了额外的功能,使应用程序可以直接对 Web 服务器进行读写操作。它支持文件锁定、解锁,甚至版本控制,在广域网文件共享方面具有天然优势,移动端文件管理 APP 也大多支持此协议。
📦 项目简介
WebDAV 的核心特点可以概括为下表:
| 特点类别 | 具体说明 |
|---|---|
| 协议优势 | 基于 HTTP/HTTPS,易于穿越防火墙,适合广域网文件共享。支持文件直接读写、锁定(Locking)及解锁(Unlock),可有效防止编辑冲突。 |
| 跨平台性 | 被多种操作系统(Windows、Linux、macOS)和移动端(Android、iOS)的文件管理器或专用APP(如 RaiDrive、ES 文件浏览器)良好支持。 |
| 部署简便性 | 通过 Docker 容器化部署,环境统一,配置简单,避免了复杂的原生软件安装和编译过程。 |
使用场景 * 个人文件同步与备份:在不同设备(如个人电脑、NAS、手机)之间同步和备份重要文件、照片、文档等。 * 团队文件共享与协作:作为团队内部文件共享和协作的工具,设置不同权限的目录供成员访问。 * 应用程序数据存储:为某些支持 WebDAV 的应用程序(如笔记软件 Joplin、备份工具 Kopia)提供远程存储位置。
📦 项目简介2
WebDAV(Web-based Distributed Authoring and Versioning)是一种基于 HTTP 协议的 文件管理标准协议,核心功能是实现跨设备、跨平台的文件远程访问与管理(如上传、下载、修改、删除文件),可替代 FTP 服务,适配 Windows、macOS、Linux、手机等所有支持 HTTP 的设备。
本次部署为 3 个独立 WebDAV 实例,每个实例对应不同端口(81/82/83)、存储目录与访问密码,实现 “文件隔离管理”(如实例 1 存文档、实例 2 存备份、实例 3 存媒体文件),基于 bytemark/webdav 轻量镜像,资源占用低且配置简单。
核心特点
- 多实例隔离:3 个实例独立运行,端口、存储目录、密码互不干扰,适合分类管理不同类型文件;
- 安全认证:采用
Digest认证(比Basic认证更安全,密码传输加密),避免明文泄露风险; - 权限可控:通过
PUID/PGID统一用户权限,确保容器内文件与本地目录权限一致,避免 “无法读写” 问题; - 跨平台兼容:支持所有主流系统(Windows 映射网络驱动器、macOS 连接服务器、手机文件管理器访问);
- 数据持久化:文件存储在本地硬盘(如
/mnt/10t/file),容器删除后数据不丢失,支持大容量硬盘挂载; - 轻量高效:单个实例内存占用 < 50MB,1 核 1GB 服务器可轻松运行 3 个实例,无性能压力;
- 标准协议:基于 HTTP 协议,无需额外安装客户端,系统原生支持访问。
📋 部署前准备
1.环境要求
确保你的服务器已安装 Docker 和 Docker Compose。你可以通过在终端执行 docker -v 和 docker compose version 来验证。
2.资源检查
* 端口:确认计划使用的端口(如配置中的 81, 82, 83)未被其他程序占用。
* 磁盘空间与权限:确保挂载目录(如示例中的 /mnt/10t/file/webdav/1, /mnt/10t/file/webdav/2, /mnt/10t/file/media)有足够空间,并且当前用户对这些目录有读写权限。权限问题可能导致容器无法启动或无法删除文件。
⚙️ 配置 Docker Compose
1.创建项目目录
创建一个目录(如 webdav)用于存放所有相关文件,并进入该目录。
mkdir -p /path/to/your/webdav && cd /path/to/your/webdav
2.创建 docker-compose.yml 文件
将用户提供的配置内容保存到新创建的 docker-compose.yml 文件中。此配置定义了三个 WebDAV 服务实例,它们共享相似的配置但使用不同的端口和存储路径。
#version: '3'
services:
# 实例1:端口81,存储目录/mnt/10t/file/webdav/1,密码aaaaa
webdav1:
image: bytemark/webdav # 轻量 WebDAV 官方镜像,体积约 50MB
restart: always # 容器退出后自动重启,保障服务稳定
ports:
- "81:80" # 端口映射:主机81 → 容器80(容器内默认HTTP端口)
environment:
#给相同的权限来通用 避免权限组不同无法创建删除文件名
PUID: 1000 # 本地用户ID,需与存储目录所有者ID一致(避免权限问题) #这边1000后权限就是82:82了
PGID: 1000 # 本地用户组ID,与PUID对应
TZ: Asia/Shanghai # 时区同步,确保日志时间正确
#AUTH_TYPE: Basic # Basic确保kopia能用。pass,直接改用机械盘路径了。
AUTH_TYPE: Digest # 认证方式:Digest(安全,密码加密传输),不建议改为Basic
USERNAME: user # 访问用户名(可自定义,如 webdav_user1)
PASSWORD: aaaaa # 访问密码(必须修改!默认aaa安全性低,建议含字母+数字)
#LOCATION: /webdav
volumes:
# 数据持久化:本地目录 ↔ 容器内文件存储目录
- /mnt/10t/file/webdav/1:/var/lib/dav/data
#- /home/compose/user.passwd:/user.passwd
# 实例2:端口82,存储目录/mnt/10t/file/webdav/2,密码usera
webdav2: # 修正:删除原配置中"webdav2"后的空格(yaml语法不允许)
image: bytemark/webdav
restart: always
ports:
- "82:80"
environment:
PUID: 1000
PGID: 1000
TZ: Asia/Shanghai
AUTH_TYPE: Digest
USERNAME: usera # 可与实例1不同用户名(如 webdav_user2)
PASSWORD: usera # 必须修改!建议改为强密码(如 WebDAV@2024)
#LOCATION: /webdav
volumes:
- /mnt/10t/file/webdav/2:/var/lib/dav/data
#- /home/compose/user.passwd:/user.passwd
# 实例3:端口83,存储目录/mnt/10t/file/media,密码aaaaa
webdav3 :
image: bytemark/webdav
restart: always
ports:
- "83:80"
environment:
PUID: 1000 # 原配置注释的82需删除,统一用1000避免权限混乱
PGID: 1000
TZ: Asia/Shanghai
#AUTH_TYPE: Basic
AUTH_TYPE: Digest
USERNAME: user # 可自定义(如 webdav_media)
PASSWORD: aaaaa # 必须修改!与实例1密码可相同或不同
#LOCATION: /webdav
volumes:
- /mnt/10t/file/media:/var/lib/dav/data
#- /home/compose/user.passwd:/user.passwd
3.关键配置说明
* 镜像:bytemark/webdav 是一个流行且维护良好的 WebDAV 服务器 Docker 镜像。
* 数据持久化:volumes 部分将容器内的 /var/lib/dav/data 目录(WebDAV 的默认共享根目录)挂载到宿主机的指定路径,确保数据在容器重启后不会丢失。
* 认证方式:AUTH_TYPE 支持 Digest(摘要认证,更安全)和 Basic(基本认证,传输明文密码,安全性较低)。某些客户端(如用户提到的 Kopia)可能需要特定的认证方式,请根据客户端要求进行选择。强烈建议在生产环境中使用强密码并考虑启用 HTTPS。
* 用户与权限:PUID 和 PGID 用于指定容器内进程运行的用户和组ID,这会影响容器在宿主机上创建文件的属主。确保它们与宿主机上挂载目录的权限相匹配,以避免权限问题。如果遇到文件无法删除的问题,可能需要检查并调整挂载目录的权限,或者确保 PUID/PGID 有足够权限。
🚀 启动与验证
1.启动服务
在 docker-compose.yml 文件所在目录下,执行以下命令来后台启动所有服务:
docker-compose up -d
2.检查服务状态 使用以下命令查看容器是否正常运行:
docker-compose ps
如果所有服务的 State 栏均显示为 Up,则表明容器已成功启动。
3.查看日志 如果某个服务启动异常,可以通过日志来排查问题:
docker-compose logs webdav1 # 查看特定服务日志
docker-compose logs # 查看所有服务日志
4.验证服务
您可以通过以下几种方式验证 WebDAV 服务是否正常工作:
* 浏览器访问:在浏览器中输入 http://你的服务器IP:81(或其他映射端口),如果看到 WebDAV 目录列表(可能需要浏览器支持 WebDAV)或认证对话框,说明服务已运行。
* 命令行测试:使用 curl 命令进行测试:
curl -X PROPFIND http://你的服务器IP:81 -u "user:aaaaa"
* 客户端连接:使用 WebDAV 客户端(如下文所述)尝试连接。
(2)验证 WebDAV 服务可用性(3 种方法)
方法 1:curl 命令测试(适合服务器端快速验证)
# 测试实例1(端口81,替换用户名/密码为实际配置)
curl -u user:你的密码 http://localhost:81
# 预期输出:<html><head><title>WebDAV Directory Listing</title>...</head></html>(目录列表页面)
方法 2:浏览器访问(直观验证)
- 打开浏览器,输入
http://服务器IP:81(如局域网http://192.168.1.100:81); - 弹出认证窗口,输入配置的
USERNAME和PASSWORD; - 登录后显示目录列表(为空,因未上传文件),说明服务正常;
- 重复测试
http://服务器IP:82和http://服务器IP:83,确认三个实例均可用。
方法 3:Windows 映射网络驱动器(实用场景)
- 打开 “此电脑”→ 右键 “映射网络驱动器”;
- “文件夹” 输入
http://服务器IP:81,勾选 “使用其他凭据连接”; - 输入
USERNAME和PASSWORD,点击 “确定”; - 成功映射后,“此电脑” 会新增一个 “网络驱动器”,双击可像本地文件夹一样上传 / 下载文件。
🔧 基础配置与使用
-
连接 WebDAV 服务器
- Windows 系统:可以使用 RaiDrive 这款工具。安装后,添加一个 WebDAV 驱动器,填写服务器地址、端口、用户名和密码即可挂载为网络驱动器。
- Linux 系统:大多数文件管理器(如 Nautilus、Dolphin)支持通过 "添加网络位置" 或类似功能连接 WebDAV 服务器。
- Android 移动端:可以使用 ES 文件浏览器、FE文件管理器 等 APP 添加 WebDAV 存储位置。
-
认证类型选择
- 您的配置中使用了
AUTH_TYPE: Digest。如果某些客户端(如用户注释中提到的 Kopia)要求使用Basic认证,您需要将配置中的AUTH_TYPE改为Basic。请注意,Basic 认证在网络传输中是明文的,如果使用 Basic 认证,强烈建议通过 HTTPS(例如使用 Nginx 反向代理并配置 SSL 证书)来保障安全。
- 您的配置中使用了
-
多实例管理
- 您的配置部署了三个 WebDAV 实例。它们可以分别用于不同的目的(例如,为不同用户、不同项目或不同应用程序提供隔离的文件共享空间)。管理时,记得通过不同的端口(81, 82, 83)来访问和操作它们。
🔧 基础配置与使用2
WebDAV 核心使用场景是 “跨设备文件访问”,以下介绍主流系统的连接方法与基础管理操作:
1. 各系统客户端连接方法
(1)Windows 系统
- 映射网络驱动器:参考上文 “验证方法 3”,适合长期使用;
- 临时访问:打开 “文件资源管理器”→ 地址栏输入
http://服务器IP:81,输入账号密码即可。
(2)macOS 系统
- 打开 “访达”→ 顶部菜单 “前往”→“连接服务器”;
- 输入
http://服务器IP:81,点击 “连接”; - 选择 “注册用户”,输入
USERNAME和PASSWORD,点击 “连接”; - 成功后,访达左侧 “位置” 会显示 WebDAV 目录,可直接拖拽文件操作。
(3)Linux 系统
- 命令行访问:使用
davfs2工具挂载(需先安装:sudo apt install davfs2):
# 创建挂载点
mkdir -p ~/webdav1
# 挂载 WebDAV 实例1
sudo mount -t davfs http://服务器IP:81 ~/webdav1
# 输入账号密码,挂载后可通过 ~/webdav1 访问
- 图形化访问:文件管理器地址栏输入
dav://服务器IP:81,输入账号密码即可。
(4)手机端(Android/iOS)
- Android:使用 “ES 文件浏览器”→ 点击 “网络”→“WebDAV”→ 输入服务器地址、端口、账号密码;
- iOS:使用 “文件” APP→ 右上角 “...”→“连接服务器”→ 输入
http://服务器IP:81和账号密码。
2. 基础文件管理操作
- 上传文件:直接将本地文件拖拽到 WebDAV 目录(或右键 “复制”→“粘贴”);
- 下载文件:右键点击 WebDAV 中的文件,选择 “复制到” 本地目录;
- 创建文件夹:右键空白处→“新建”→“文件夹”,命名后可分类存储文件;
- 删除文件:右键文件→“删除”,会直接删除服务器上的文件(建议提前备份重要文件)。
3. 修改实例配置(如账号密码)
若需修改某实例的用户名 / 密码,步骤如下:
1.编辑 docker-compose.yml,找到对应实例(如 webdav1),修改 USERNAME 或 PASSWORD;
2.重启该实例(无需停止其他实例):
# 重启 webdav1 实例(修改后生效)
docker compose restart webdav1
3.重新连接客户端时,需更新账号密码(如 Windows 映射需先断开再重新连接)。
🔄 维护与管理
1.更新服务
当有新的 bytemark/webdav 镜像发布时,可以按以下步骤更新:
# 进入 docker-compose.yml 所在目录
cd /path/to/your/webdav
# 拉取最新的镜像
docker-compose pull
# 重新创建并启动容器
docker-compose up -d
# 清理无用的旧镜像
docker image prune
2.数据备份
* WebDAV 的所有数据都保存在您挂载的宿主机目录(例如 /mnt/10t/file/webdav/1 等)下。
* 定期备份这些目录即可备份所有共享文件。
3.服务卸载 如需停止并移除所有 WebDAV 容器,在项目目录下执行:
docker-compose down
如果希望彻底删除所有数据(包括共享的文件),在上述命令后手动删除宿主机上挂载的目录即可。
🐛 常见问题排查
| 问题现象 | 可能原因与解决方案 |
|---|---|
| 容器启动失败 | 1. 检查 docker-compose.yml 文件语法是否正确(如缩进、冒号后空格)。2. 执行 docker-compose logs <服务名> 查看具体错误日志。 |
| 无法连接 WebDAV 服务器 | 1. 确认服务器防火墙/安全组是否开放了所使用的端口(81, 82, 83)。 2. 检查 docker-compose ps 确认对应容器状态是否为 Up。 |
| 认证失败 | 1. 确认用户名和密码与配置中设置的完全一致,注意大小写。 2. 检查 AUTH_TYPE(Digest/Basic)是否与客户端支持的类型匹配。某些客户端可能只支持其中一种。 |
| 可以列出文件但无法上传/删除/修改 | 1. 这是常见的权限问题。检查宿主机上挂载目录的权限,确保 Docker 容器内的进程(由 PUID/PGID 指定)有读写权限。2. 可以尝试进入容器内部,手动检查并修改 /var/lib/dav/data 目录的权限:docker-compose exec webdav1 bash chown -R www-data:www-data /var/lib/dav/data (注意:镜像内部的实际用户可能并非 www-data,此命令仅供参考,更推荐确保宿主机目录权限正确)。 |
| 部分客户端连接不正常 | 1. 某些客户端可能对 WebDAV 协议的支持有特殊性。尝试更换其他客户端进行测试。 2. 如果使用 HTTPS,请确保证书有效且客户端信任该证书。 |
希望这篇教程能帮助你顺利搭建并管理你的 WebDAV 文件共享服务!如果在部署和使用过程中遇到更多问题,Docker 和 WebDAV 相关的社区论坛是寻求帮助的好去处。
🐛 常见问题排查2
1. 连接失败(提示 “无法访问此网站”)
-
原因 1:服务器端口未开放或实例未启动。解决:
- 检查实例状态:
docker compose ps,确保对应实例State为Up; - 检查端口开放:
sudo ufw status,确认 81/82/83 端口已允许。 -
原因 2:服务器 IP 错误或网络不通。解决:
-
验证服务器 IP 可达:
ping 服务器IP(手机端需在同一局域网或服务器有公网 IP); - 公网访问需确认服务器有公网 IP 且端口已映射(云服务器无需额外配置,家庭宽带需端口转发)。
- 检查实例状态:
2. 认证失败(提示 “用户名或密码错误”)
-
原因 1:输入的账号密码与配置不一致。解决:
- 核对
docker-compose.yml中对应实例的USERNAME和PASSWORD; - 注意区分大小写(如
User与user不同),密码避免空格或特殊字符(如!@#需确认客户端是否支持)。 - 原因 2:
AUTH_TYPE不兼容(如客户端不支持 Digest 认证)。解决:临时将对应实例的AUTH_TYPE改为Basic(仅测试用,测试后改回 Digest),重启实例后重试。
- 核对
3. 无法上传 / 删除文件(提示 “权限不足”)
-
原因 1:本地存储目录权限与
PUID/PGID不匹配。解决:- 查看当前用户 PUID:
id -u(如输出 1001); - 修改
docker-compose.yml中对应实例的PUID和PGID为 1001; - 重新设置目录权限:
sudo chown -R 1001:1001 /mnt/10t/file/webdav/1,重启实例。 - 原因 2:文件大小超过限制(默认无限制,若有反向代理需检查代理配置)。解决:若使用 Nginx 反向代理 WebDAV,需在 Nginx 配置中添加
client_max_body_size 10G;(允许 10GB 大文件上传)。
- 查看当前用户 PUID:
4. 连接后频繁断开(稳定性问题)
-
原因 1:网络不稳定(如 Wi-Fi 信号弱、公网延迟高)。解决:
- 局域网优先:尽量在同一局域网使用,避免跨网络高延迟;
- 有线网络:服务器与客户端优先使用网线连接,减少无线波动。
- 原因 2:容器内存不足(极端情况)。解决:检查服务器内存使用:
free -m,若内存不足(剩余 < 100MB),需关闭其他无用服务或升级服务器内存。
通过以上步骤,新手可成功部署 WebDAV 多实例并实现跨设备文件管理。WebDAV 适合个人家庭 “文件共享中心” 或小型团队 “轻量文件服务器”,后续可结合 Nginx 反向代理添加 HTTPS 加密(提升安全性),具体可参考 WebDAV 官方文档 或 Nginx 反向代理教程。