跳到主要内容

Docker

Docker 中的数据共享

为什么需要数据共享?

  • 数据持久化,不会在容器更新后丢失。
  • 数据共享,可以方便地在容器间共享数据。

Docker 容器间共享数据以及与宿主机共享数据主要有以下几种方法:

主要分为数据卷与数据卷容器两种方式。

  1. 挂载卷(Volumes):

    • 定义:Docker 卷是由 Docker 管理的数据存储区域。
    • 用途:适用于持久化数据存储、数据共享和数据备份。
    • 特点
      • 数据不会随容器删除而丢失。
      • 可以在容器间共享和重用:通过将同一个volume挂载到多个容器上,不同容器可以访问和共享相同的数据。
      • 由 Docker 管理,更安全。
    • 使用:在 docker run 命令中使用 -v--mount 标志来挂载卷。
  2. 绑定挂载(Bind Mounts):

    • 定义:将宿主机上的文件或目录直接映射到容器中。
    • 用途:适合在宿主机和容器间共享特定文件或目录。
    • 特点
      • 直接反映宿主机的文件系统结构。
      • 对文件的任何更改都会即时反映在宿主机和容器中。
    • 使用:在 docker run 命令中指定宿主机的路径和容器的目标路径。
  3. 临时卷(tmpfs 挂载):

    • 定义:将数据存储在宿主机的临时内存中,而不是磁盘上。
    • 用途:适用于存储敏感信息或非持久化数据。
    • 特点
      • 数据不会写入宿主机的文件系统。
      • 容器停止后,数据会丢失。
  4. 网络共享(Network Sharing):

    • 定义:通过网络通信共享数据。
    • 用途:适合于跨主机或需要远程通信的场景。
    • 实现:可以通过 REST APIs、远程数据库连接等方式实现。
  5. Docker 数据卷容器(Data Volume Containers):

    • 定义:使用专门的容器来持久化和共享数据。
    • 用途:在容器间共享和更新数据。
    • 实现:创建一个数据卷容器,并在其他容器中使用 --volumes-from 来挂载这个容器的卷。

在实践中,卷(Volumes)和绑定挂载(Bind Mounts)是最常用的方法,它们提供了灵活且高效的数据共享和持久化方案。

提示
  • 镜像与卷的初始数据: 当第一次创建容器并指定一个卷时,如果该卷是空的,Docker会将镜像中指定路径下的数据复制到卷中。但是,如果卷已经包含数据(例如,它是被其他容器使用过的旧卷),那么镜像中的数据将不会被复制过去,而是直接使用卷中现有的数据
  • 数据卷更新策略
    • 使用新卷: 如果你希望新容器使用新镜像中的数据,你可以创建一个新的卷。这样,当容器启动时,它将使用镜像中的初始数据填充这个新卷。
    • 手动同步: 如果需要将新镜像中的数据更新到现有卷中,可能需要手动同步这些数据。这可能涉及到将新数据复制到卷中,或者运行一些初始化脚本来更新数据。

Reference