Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Docker实践之07-数据管理

Docker实践之07-数据管理

作者头像
编程随笔
发布于 2022-09-09 00:26:37
发布于 2022-09-09 00:26:37
39200
代码可运行
举报
文章被收录于专栏:后端开发随笔后端开发随笔
运行总次数:0
代码可运行

目录

一.数据卷概述

数据卷是一个可供一个或多个容器使用的特殊目录,它绕过UFS,可以提供很多有用的特性:

  • 数据卷可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像
  • 数据卷默认会一直存在,即使容器被删除

注意: 数据卷的使用,类似于Linux下对目录或文件进行mount,镜像中被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的数据卷。

二.创建数据卷

使用命令docker volume create创建数据卷,如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ docker volume create test-vol
test-vol

三.查看数据卷

使用命令docker volume ls查看所有的数据卷,如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ docker volume ls
DRIVER              VOLUME NAME
local               my-vol

在主机里使用命令docker volume inspect可以查看指定数据卷的详细信息,如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ docker volume inspect test-vol
[
    {
        "CreatedAt": "2018-05-03T16:42:05+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/test-vol/_data",
        "Name": "test-vol",
        "Options": {},
        "Scope": "local"
    }
]

使用的docker volume create test-vol创建的数据卷默认挂载目录为“/var/lib/docker/volumes/test-vol/_data”。 注意: 数据卷的默认主机目录是:/var/lib/docker/volumes,但是在Mac下使用Docker Desktop时是不存在目录“/var/lib/docker/volumes”的,因为Mac上启动Docker本质上是启动了一个虚拟机,所以并不会在Mac主机本身存在数据卷的默认挂载目录,参考:Mac使用docker时,卷默认挂载路径/var/lib/docker/volumes不存在问题

四.挂载数据卷

所谓"挂载数据卷"是指将数据卷加载到容器的指定目录,在用docker run命令的时候,可以将数据卷挂载到容器里。在一次docker run中可以挂载多个数据卷。挂载数据卷可以使用2个选项:--mount或者--volume,推荐使用--mount。 如下创建一个名为web的容器,并加载一个数据卷到容器的/usr/local/tomcat/webapps目录:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ docker run -d -P --name web --mount source=my-vol,target=/usr/local/tomcat/webapps tomcat

挂在数据卷之后,来看一下如下信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ docker volume inspect my-vol
[
    {
        "CreatedAt": "2018-05-03T17:02:43+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
        "Name": "my-vol",
        "Options": {},
        "Scope": "local"
    }
]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ sudo ls /var/lib/docker/volumes/my-vol/_data -al
total 28
drwxr-x---  7 root root 4096 May  3 17:02 .
drwxr-xr-x  3 root root 4096 May  3 16:34 ..
drwxr-x--- 14 root root 4096 May  3 16:58 docs
drwxr-x---  6 root root 4096 May  3 16:58 examples
drwxr-x---  5 root root 4096 May  3 16:58 host-manager
drwxr-x---  5 root root 4096 May  3 16:58 manager
drwxr-x---  3 root root 4096 May  3 17:04 ROOT

将数据卷加载到容器的指定目录之后,在数据卷的挂载点目录下就可以看到容器的对应目录下的内容。而且,此时对数据卷挂载目录下内容的修改会同步到容器的对应目录下。 显然,上面看到的数据卷中的信息正是容器的/usr/local/tomcat/webapps目录下的内容。 现在来修改/var/lib/docker/volumes/my-vol/_data/ROOT/index.jsp文件,可以看到修改的内容马上就生效。 现在停止容器,查看/var/lib/docker/volumes/my-vol/_data内容发现数据依然存在,删除容器之后再查看,数据依然存在。

五.删除数据卷

可以使用命令docker volume rm删除数据卷,如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ docker volume rm my-vol
my-vol

数据卷是被设计用来持久化数据的,它的生命周期独立于容器,Docker不会在容器被删除后自动删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷。 如果需要在删除容器的同时移除对数据卷的引用,可以在删除容器的时候使用"-v"选项,即:docker rm -v注意: 在删除容器时使用"-v"选项并不会删除该容器使用的数据卷,仅仅是删除容器对数据卷的引用关系;因为容器删除之后,如果未使用"-v"选项移除对应的数据卷,那么再去删除数据卷时将会提示数据卷正在容器中被使用,不允许删除。

无主的数据卷可能会占据很多空间,需要使用命令docker volume prune进行清理:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ docker volume prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
my-vol
test-vol

Total reclaimed space: 4.642MB

六.挂载主机目录或文件

1.挂载一个主机目录作为数据卷

使用--mount选项可以指定一个本地主机的目录挂载到容器中去,此时需要指定type=bind,如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ docker run -d -P --name web --mount type=bind,source=/home/test/webapps,target=/usr/local/tomcat/webapps tomcat

此时在主机目录上做的修改,在容器中就能够及时地被感知到.

Docker挂载主机目录的默认权限是读写,也可以通过增加readonly指定为只读,如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ docker run -d -P --name web --mount type=bind,source=/home/test/webapps,target=/usr/local/tomcat/webapps,readonly tomcat

2.挂载一个主机文件作为数据卷

--mount选项也可以从主机挂载单个文件到容器中,如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ docker run --rm -it --mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history ubuntu:16.04 bash

这样就可以记录在容器输入过的命令了。

七.挂载数据卷与主机目录/文件的比较

相同点:

  1. 挂载数据卷或者主机目录/文件都是容器进行数据管理的方式
  2. 都可以通过"--mount"选项进行挂载

不同点:

  1. 挂载数据卷时不需要明确指定type参数,只需要指定source和target即可,例如:--mount source=my-vol,target=/usr/local/tomcat/webapps
  2. 挂载主机目录/文件时必须明确指定type参数为bind,例如:--mount type=bind,source=/home/test/webapps,target=/usr/local/tomcat/webapps;另外,挂载的主机目录默认权限是读写,也可以通过增加readonly指定为只读:--mount type=bind,source=/home/test/webapps,target=/usr/local/tomcat/webapps,readonly
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-07-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Docker重学系列之高级数据卷配置
容器数据卷就是目录的挂载,将我们的容器的目录挂载到宿主机上,从而实现打通宿主机和容器之间的文件共享功能;
大忽悠爱学习
2022/05/10
5290
Docker重学系列之高级数据卷配置
Docker数据管理
数据卷 ( Data Volumes ) 是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于 Linux 中的 mount 行为 。
海盗船长
2021/12/07
8200
Docker 基础知识 - 使用卷(volume)管理应用程序数据
卷(volumes)是 Docker 容器生产和使用持久化数据的首选机制。绑定挂载(bind mounts)依赖于主机的目录结构,卷(volumes)完全由 Docker 管理。卷与绑定挂载相比有几个优势:
用户8803964
2021/07/05
3.8K1
02、数据卷(Data Volumes)以及dockefile详解
天蝎座的程序媛
2023/10/17
5180
02、数据卷(Data Volumes)以及dockefile详解
Docker学习笔记之docker volume 容器卷的那些事(一)
接触 docker 的朋友都知道,docker 镜像是以 layer 概念存在的,一层一层的叠加,最终成为我们需要的镜像。但该镜像的每一层都是 ReadOnly 只读的。只有在我们运行容器的时候才会创建读写层。文件系统的隔离使得:
Jetpropelledsnake21
2019/03/19
1.9K0
Docker学习笔记之docker volume 容器卷的那些事(一)
​Docker数据管理
在前面我们详细学习了docker的三大核心概念:镜像、容器和仓库,接下来开始学习如何管理数据。在实际工作中使用docker,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,此时必然会使用到容器数据管理的各种操作。
啃饼思录
2020/12/29
1.3K0
​Docker数据管理
4-数据的持久化和共享互连
正常情况下,删除容器,容器中所有的文件也会被删除。所以需要能持久化容器中数据的方法,也就是数据卷 数据卷(Data Volume)的作用:
jackxiao
2021/11/16
6890
Docker 数据管理介绍
默认容器的数据是保存在容器的可读写层,当容器被删除时其上的数据也会丢失,所以为了实现数据的持久性则需要选择一种数据持久技术来保存数据。官方提供了三种存储方式:Volumes、Bind mounts和tmpfs。前面还介绍了:Docker 服务终端 UI 管理工具
民工哥
2021/03/15
7280
Docker 数据管理介绍
[入门] Docker容器数据储存和转移
容器和镜像之间的主要区别是顶部的可写层。所有对容器添加新的或修改现有数据的内容都存储在该可写层中。当容器被删除时,可写层也被删除。底层镜像保持不变。
宣言言言
2019/12/15
2K0
Docker实践(三):数据持久化及共享
 在Linux上运行的Docker有三种不同的方式将数据从 Docker Host挂载到 Docker 容器,并实现数据的读取和存储:volumes、bind mounts、tmpfs。  
loong576
2019/09/10
9100
Docker实践(三):数据持久化及共享
Docker实战(一)
Docker 也是作为我的第二技能栈之一,除了 Go 语言,Docker 是我最喜欢的第二技能栈了,值得一提的是,Docker 是 Go 语言编写的。现在很多公司已经全面实现项目部署的容器化,这也是未来发展的一个方向,所以我也会在这里推一些关于 Docker 的文章。
张乘辉
2019/06/18
9110
【Docker入门】数据卷管理
在创建 docker 的镜像和容器后,还需要对容器进行数据管理,以便能与主机、不同容器之间进行交换数据。
参谋带个长
2024/01/04
4840
docker 数据管理
docker镜像被存储在一系列的只读层,当我们开启一个容器,docker读取只读镜像并添加一个读写层在顶部,如果正在运行的容器修改了现有的文件,该文件将被拷贝出底层的只读层到最顶层的读写层,在读写层中的旧版本文件隐藏于该文件之下,但并没有被破坏,它仍然存在于镜像一下,当docker的容器被删除时,然后重新启动镜像时,将开启一个没有任何更改的新的容器,这些更改会丢失,为了能够保存数据以及共享容器间的数据,docker提出了volumes的概念,volumes可以是目录或者文件,它们是外部默认的联合文件系统或者是存在与宿主文件系统正常的目录和文件。
dogfei
2020/07/31
9020
Docker数据管理与挂载管理
数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
踏歌行
2020/10/15
7000
Docker 容器的数据管理
docker的理念之一就是将应用和运行的环境打包,因此docker容器的生存周期通常都是与在容器中运行的程序相同的,而我们对数据的要求是持久化,docker容器之间也需要一个共享数据的渠道。这些需求就催生了docker数据卷的诞生。
程序员果果
2019/05/28
5700
Docker基础(二)
数据卷是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似Linux中的mount行为。
Java阿呆
2020/11/04
4190
Docker 学习笔记-数据管理
我们在使用 docker 的时候会将一些数据(例如网站文件、配置文件、数据库文件等)存储在容器中。这样存在一个严重的问题,如果容器出现损坏(例如无法启动,被删除等)那么存储在容器中的数据就会丢失,即使我们进行了容器备份,数据也不可能恢复到故障发生时。如果要解决这个问题,我们就需要用到 docker 的数据管理。在 docker 中数据管理一共有两种方式,分别是数据卷和数据卷容器,下面我们来一一讲解。
喵叔
2020/09/08
5050
Docker 数据管理
我们已经熟悉了 -v 或者 --volume,官方最近建议( Docker 17.06+ ) 使用 --mount。 官方文档:https://docs.docker.com/engine/admin/volumes/ 类型 bind volume tmpfs source source 或 src destination destination 或 dst 或 target volumes 创建 volume $ docker volume create VOLUME_NAME $ dock
康怀帅
2018/02/28
1.6K0
开发也需了解的运维知识之Docker
docker容器化部署应用可以简化应用的部署流程。假设部署一个应用需要在机器上安装和配置nginx、tomcat,如果需要新增一台服务器,或者切换服务器,那么就要重复同样的操作,安装nginx、tomcat并配置。容器化部署就是一次配置到处使用,将安装nginx配置nginx这一系列工作制作成一个镜像,在服务器上通过docker拉取镜像并启动容器即可,基于此实现集群自动伸缩。
Bug开发工程师
2020/02/19
9140
开发也需了解的运维知识之Docker
Docker应用程序数据管理与持久化
默认情况下,container内部新创建文件或者修改文件,结果会保存在container的可读写层中,这意味着:当container消失时,与container一体的可读写层也一并消失,数据并没有持久化。并且,当一个container需要其它container中可读写层的数据时,取出操作非常困难。
Power
2025/03/03
990
相关推荐
Docker重学系列之高级数据卷配置
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验