欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Docker Data Management

程序员文章站 2024-03-17 10:06:22
...

Docker Data Management

Docker容器数据管理概览:

  1. 绑定挂载文件(Bind Mount) – 指定容器外的路径和容器内的路径形成挂载映射关系,在容器内外可对文件的读写
  2. 卷(Volume) – 从宿主操作系统中挂载目录到容器内,挂载的目录由Docker进行管理
  3. 临时文件挂载(Tmpfs Mount) – 内容会随着容器的停止而消失

其中(Volume)和绑定挂载文件(Bind Mount)是持久化的,临时文件挂载(Tmpfs Mount)是非持久化的;

默认情况下,在容器内创建的所有文件都存储在容器读写层上,这意味着:

  1. 当该容器A不再存在时,其数据将不会持久保存,另一个容器B无法使用容器A的数据;
  2. 容器的读写层与运行容器的主机紧密耦合,不能轻易地将数据移动到其他地方;

存储驱动程序使用Linux内核提供联合文件系统( Union Filesystem);
与使用直接写入主机文件系统的数据卷相比,这种额外的抽象降低了性能;
Docker提供了两个选项:卷(Volume)绑定挂载文件(Bind Mounts),来将文件存储在主机中,以便容器停止后文件也可以持久存储;

Docker Data Management

1. Bind Mount

绑定挂载文件(Bind Mount)可以存储在主机系统上的任何位置,甚至可能是重要的系统文件或目录;
Docker主机或Docker容器上的非Docker进程可以随时对其进行修改;
Docker Data Management

最初-vor--volume标志用于独立容器,而--mount标志用于集群服务;
但是,从Docker 17.06开始,可以使用--mount独立容器;
--mount是更明确和冗长的,最大的区别是该-v语法将所有选项合并在一个字段中,而--mount语法将它们分开;

1.1 命令

使用-v--volume命令,以冒号(:)分隔,这些字段必须以正确的顺序排列;

  1. 第一个字段是主机上文件或目录的路径。
  2. 第二个字段是文件或目录在容器中的安装路径。
  3. 第三个字段是可选的,并且是用逗号分隔的选项,诸如列表ro,consistent,delegated,cached,z,和Z。

--mount:由多个键值对组成,这些键值对之间用逗号分隔,每个键值对都由一个<key>=<value>元组组成;
type:可以是bindvolumetmpfs,本段此类型始终为bind
source:这是Docker守护程序主机上文件或目录的路径;
destination|dst|target:可以指定为sourcesrcdestination作为其值,其中的文件或目录被安装在容器的路径;
readonly:会使绑定安装以只读方式安装到容器中;
bind-propagation:将更改绑定传播,可以是rprivateprivatersharedsharedrslaveslave
consistency:如果存在,可以是一种consistentdelegatedcached,此设置仅适用于Mac的Docker桌面,其他平台上将被忽略;

1.2 使用

创建一个index.html,将其路径挂在到nginx容器中,运行容器,访问index:

  1. 创建本地路径/Users/admin/localDataindex.html,查看 index.html中内容为:Hello Weison
  2. 运行容器bind-mount-nginx,暴露端口10086映射其80端口,将容器/usr/share/nginx/html路径挂载至宿主机/Users/admin/localData
  3. 到容器bind-mount-nginx内,打开/usr/share/nginx/html,查看index.html,其内容与宿主机index.html内容一致
  4. 在宿主机浏览器中访问:localhost:10086 查看 index.html

Docker Data Management执行docker inspect bind-mount-nginx可以看到有关容器数据挂载相关的信息:
Docker Data Management

启动容器时,在挂载选项-v后再接上:ro可声明为只读挂载

1.3 使用场景

在保证安全性的前提下,有几种常见场景非常适合使用这种挂载方式:

  • 当我们需要从宿主操作系统共享配置的时候,某些配置项,我们可以直接从容器外部挂载到容器中,这利于保证容器中的配置为我们所确认的值,也方便我们对配置进行监控。
  • 当我们需要借助Docker进行开发的时候,如果我们直接把代码挂载进入容器,那么我们每次对代码的修改都可以直接在容器外部进行。

2. Tmpfs Mount

tmpfs挂载仅存储在主机系统的内存中,且永远不会写入主机系统的文件系统中,特征就是临时性挂载,只能在Linux上使用;

与挂载宿主操作系统目录或文件不同,挂载临时文件目录要通过 --tmpfs 这个选项来完成。由于内存的具体位置不需要我们来指定,这个选项里我们只需要传递挂载到容器内的目录即可。

Docker Data Management

1.1 命令

–tmpfs:挂载tmpfs挂载而不允许您指定任何可配置的选项,并且只能与独立容器一起使用;

tmpfs-size:tmpfs安装的大小(以字节为单位),默认情况下不受限制;
tmpfs-mode:tmpfs的文件模式(八进制),例如700或0770。默认为1777或可全局写入;

–mount:独立容器和群集服务都可使用,语法比–tmpfs更详细

type:可以是bindvolumetmpfs,本段此类型始终为tmpfs
destination|dst|target:指定路径被安装在容器中;

1.2 使用

执行命令:

#--mount
docker run -d -it --name tmpfs-mount-nginx --mount type=tmpfs,destination=/app nginx
#--tmpfs
docker run -d -it --name tmpfs-tmpfs-nginx --tmpfs /app nginx

Docker Data Management

1.3 使用场景

以下场景非常适合使用这种挂载方式:

  • 应用中使用到,但不需要进行持久保存的敏感数据,可以借助内存的非持久性和程序隔离性进行一定的安全保障;
  • 读写速度要求较高,数据变化量大,但不需要持久保存的数据,可以借助内存的高读写速度减少操作的时间;

3. Volume

卷(Volume):从宿主操作系统中挂载目录到容器内,这个挂载的目录由 Docker 进行管理(/var/lib/docker/volumes/在Linux上);
我们只需要指定容器内的目录,不需要关心具体挂载到了宿主操作系统中的哪里;
非Docker进程不应修改文件系统的这一部分,所以卷是在Docker中持久保存数据的最佳方法
卷通常是更好的选择,因为卷不会增加使用卷的容器的大小,并且卷的内容存在于给定容器的生命周期之外
Docker Data Management
与绑定安装相比,卷具有几个优点:

与绑定安装相比,卷更易于备份或迁移。
您可以使用Docker CLI命令或Docker API管理卷。
卷在Linux和Windows容器上均可工作。
可以在多个容器之间更安全地共享卷。
卷驱动程序使您可以将卷存储在远程主机或云提供程序上,以加密卷内容或添加其他功能。
可以通过容器预先填充新卷的内容。

1.3 命令

使用-v--volume命令,以冒号(:)分隔,这些字段必须以正确的顺序排列;

  1. 第一个字段是主机上文件或目录的路径。
  2. 第二个字段是文件或目录在容器中的安装路径。
  3. 第三个字段是可选的,并且是用逗号分隔的选项,诸如列表ro,consistent,delegated,cached,z,和Z。

--mount:由多个键值对组成,这些键值对之间用逗号分隔,每个键值对都由一个<key>=<value>元组组成;
type:可以是bindvolumetmpfs,本段此类型始终为volume
source:这是Docker守护程序主机上文件或目录的路径;
destination|dst|target:可以指定为sourcesrcdestination作为其值,其中的文件或目录被安装在容器的路径;
readonly:会使绑定安装以只读方式安装到容器中;
bind-propagation:将更改绑定传播,可以是rprivateprivatersharedsharedrslaveslave
consistency:如果存在,可以是一种consistentdelegatedcached,此设置仅适用于Mac的Docker桌面,其他平台上将被忽略;

1.3 使用

1.3.1 创建卷

使用docker volume create命令显式创建卷,或者在容器或服务创建期间创建卷,可以命名为或匿名:
Docker Data Management使用docker volume rm删除卷,可以使用删除未使用的卷docker volume prune:
Docker Data Management

1.3.2 使用数据卷

已两种方式使用数据卷:

#--mount
docker run -d --name volume-mount-nginx --mount source=local-volume,target=/app nginx
#-v
docker run -d --name volume-v-nginx -v local-volume:/app nginx
#查看容器卷信息
docker inspect volume-mount-nginx

Docker Data Management

https://docs.docker.com/storage/volumes/

参考:
[ 1 ]. https://docs.docker.com/storage/
[ 2 ]. https://juejin.im/book/5b7ba116e51d4556f30b476c

相关标签: Docker