我正在寻找一种远离其运行的服务器的持久 Docker 存储选项。
我知道我可以使用命名卷和本地存储驱动程序挂载 CIFS 共享,但这些卷似乎只是绑定挂载,并且不受 docker 管理,因此您必须处理随之而来的用户权限问题。
理想情况下,这应该来自 docker-compose.yml。
我愿意接受任何可以在本地运行的目标,我可能会从我的 Windows 桌面运行它,但可以设置 iscsi 目标或任何真正需要的东西。目的是集中数据,以便更容易备份,这样我就可以专注于数据持久性,而不必担心虚拟机本身。我希望做到这一点,而不会因为仅使用命名的本地卷而使事情变得复杂。
提前感谢您提供的任何帮助!
答案1
好吧,所以我最终意识到,这对我来说不起作用并且破坏了我的容器的原因是因为容器包含 mongodb,而 mongodb 无法在这样的挂载上工作,为此有一个 Github 问题。
因此,下面的方法对我来说是可行的,因为它在本地运行大部分内容,但将备份文件夹安装到共享存储,这并不理想,因为我必须恢复备份,但也足够好,因为这对我的用例来说是一个简单的过程。
volumes:
unifi:
unifi_backup:
driver_opts:
type: cifs
o: "username=DockerMounts,password=SuperSecurePassword,uid=1000,gid=1000"
device: "//192.168.0.2/FastDockerVolumes/unifi/backup"
答案2
我最初直接在我的撰写文件中指定了 CIFS 卷,但后来意识到,在大多数情况下,由于您需要手动删除任何要重新配置的卷,因此最好使用外部定义的卷,这样您就不会在每次部署中都依赖 CIFS。
docker-compose 停止命名外部提供的卷,但我们可以通过要求将卷名称指定为环境变量来解决这个问题,大概在您的.env
:
services:
my-service:
volumes:
- data:/mnt/data
volumes:
data:
name: "${DATA_VOLUME?}"
external: true
然后使用以下命令手动创建卷:
# We might as well use the standard project-namespacing convention
DATA_VOLUME=compose-project_data
# N.B. you MUST use the addr option when relying on DNS resolution
docker volume create \
--name $DATA_VOLUME \
--driver local \
--opt type=cifs \
--opt "device=//remote.host/share/path" \
--opt "o=addr=remote.host,domain=$DOMAIN,username=$USER,password=$PASS"