使用 Docker 在 Windows 上搭建 Seafile 私有网盘
Seafile 的 官方文档 写得很详细,如果你使用的是 Linux 环境下的 docker,应该不存在任何问题。这片博文主要是讲 Windows Docker 下我遇到的 Seafile 私有网盘搭建过程中的问题和解决方法。
Docker-compose 配置
首先下载 docker-compose.yml 到本地你选定的文件夹,如 C:\seafile
中。按照官方文档,有几个地方需要更改:
- MySQL 默认的密码
- 持久化 MySQL 数据的文件映射(volumes)
- 持久化 Seafile 数据的文件映射(volumes)
Windows 下 docker-compose 的路径映射
Windows Docker Desktop 下,可以这样书写 volumes:
volumes:
- d:/seafile/mysql:/var/lib/mysql
如果你是在 WSL 下跑 Windows Docker,那么 /mnt/d
这样的路径是不能用的。因为实际上这是连接的远程 docker,不能用本地路径。
mariaDB 在 Windows 下无法映射
默认的 docker-compose.yml
中引用的是 mariaDB
,这个镜像在 Windows docker 下有点问题,无法正常进行文件映射。解决方法有两个:
- 不进行映射,使用 container 内置空间。不推荐,如果手滑
docker-compose down
了,数据就丢了。 - 使用 SQLite 替代 MariaDB,推荐。但很可惜我不知道怎么在 docker 下这么做,如果有知道的同学还请不吝赐教。
- 将 MariaDB 更换
MySQL
镜像,推荐。将docker-compose.yml
更改为如下即可。
db:
image: mysql:5.7
Windows 防火墙无法通过
有几种方法对 Seafile 的网页版服务进行访问:
- 使用本地 loopback(
127.0.0.1
)访问 - 使用局域网地址(
10.x.y.z
或192.168.x.y
)进行访问 - 使用公网地址进行访问
- 将上列 IP 绑定你的域名后进行访问。
因为我家里没有公网 IP,而且没有暴露在公网的需求,所以我采用域名绑定局域网地址的方式。将 seafile.204896.xyz
解析到 192.168.31.157
即可。在电脑上直接访问 seafile.204896.xyz
,可以正常访问。
但是在局域网另外的设备上却显示访问失败。经过排查,是 Windows 防火墙挡住了流量。最简单粗暴的方式是直接关掉防火墙,但是最好还是允许 docker 通过防火墙。
运行 netstat -a -b
命令,找到使用 80 端口的程序:
# netstat -a -b
协议 本地地址 外部地址 状态
TCP 0.0.0.0:80 HOME:0 LISTENING
[com.docker.backend.exe]
显然,docker 的服务文件名为 com.docker.backend.exe
,其路径在 C:\Program Files\Docker\Docker\resources\com.docker.backend.exe
,我们将其加入 Windows 防火墙的规则中即可。这样在局域网其他设备上就可以正常访问了。