备份之 Docker 卷 VS 主机目录挂载

1. Docker 卷(Volumes)

Docker 卷是 Docker 提供的用于持久化数据的专用机制。它由 Docker 管理,并存储在主机的 /var/lib/docker/volumes 目录下(可以通过自定义设置修改路径)。

优点

  • 独立于容器生命周期:卷不会随着容器的删除而删除,容器删除后,卷中的数据仍然存在。
  • 跨平台支持好:Docker 卷的跨平台支持较好,尤其是在 Docker 桌面版(如 macOS 和 Windows)上,卷的性能比绑定主机目录要好很多,因为卷在虚拟机中运行时经过了优化。
  • 数据管理简便:Docker 提供了专门的卷管理命令,可以通过命令简单地创建、删除、挂载和备份卷。数据在卷中更加封闭,不容易被误操作修改。
  • 权限和隔离性好:卷由 Docker 管理,权限更好控制,不会与主机文件系统有直接的读写冲突,确保更好的数据安全性。

缺点

  • 不易直接访问:卷的文件存储在 Docker 的管理目录中(如 /var/lib/docker/volumes),不如主机目录那么直观访问。访问卷中的文件需要使用 docker run 或其他工具来进入容器内或手动挂载。
  • 难以手动编辑:如果你希望直接在主机上修改数据(如编辑配置文件),这在卷中是不方便的。

适用场景

  • 生产环境:在生产环境中,使用卷可以确保数据与容器隔离,方便数据迁移、备份、恢复。对于跨主机环境(如 Kubernetes、Swarm 集群)或需要持久化存储的复杂场景,卷是更优的选择。
  • 需要高性能:在 macOS 或 Windows 下运行 Docker 桌面版时,卷比主机目录挂载有更好的性能表现。

如何备份 Docker 卷

如前所述,可以使用 busybox tar 来备份和恢复 Docker 卷。


2. 主机目录挂载(Bind Mounts)

主机目录挂载是将主机上的某个目录直接挂载到容器的某个路径上,使得容器能够直接访问主机文件系统。这种方式常用于开发环境,特别是希望容器能实时读取或写入主机目录的数据。

优点

  • 便于直接访问和修改:主机目录挂载的最大优势是你可以直接在主机上查看、编辑文件,而不需要通过 Docker 命令进入容器。例如,配置文件可以直接在主机上修改。
  • 开发调试便利:在开发环境中,主机目录挂载非常方便,代码或配置文件的修改可以实时生效,而无需重新启动容器。
  • 易于集成:某些开发工具或者监控工具更适合与主机上的文件系统直接交互。通过主机目录挂载,数据和容器之间的交互更加直观。

缺点

  • 权限问题:主机目录挂载可能会引发权限冲突问题。容器中的用户权限和主机上的文件权限可能不一致,从而导致权限不足或安全问题。
  • 性能较差(特别是在 Docker 桌面版上):特别是在 macOS 和 Windows 下,由于主机目录的文件系统需要通过虚拟化层进行访问,性能远不如 Docker 卷。
  • 安全性较低:容器和主机之间共享文件系统,可能增加数据泄露或被误操作的风险。

适用场景

  • 开发环境:在开发环境中,主机目录挂载方便调试和快速迭代。在开发思源笔记等应用时,你可以直接修改配置或文件,且无需重启容器。
  • 小型项目或测试环境:如果不涉及复杂的存储管理和高性能要求,主机目录挂载可以带来便利。

所以你会选择哪种备份方式呢?

  • Docker 卷备份
  • 目录备份
0 voters

我是使用主机目录挂载卷的。

原因是我不需要进入服务器后再进入 Docker 容器。

可以直接在服务器上对文件进行操作。

这样备份也就非常的方便,但是Discourse似乎是另外一种?

Discourse 的备份目录,不需要进入容器也是可以通过操作系统访问到的。

volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log