Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Docker数据共享与持久化

Docker数据共享与持久化

作者头像
Cyylog
发布于 2020-08-19 02:52:06
发布于 2020-08-19 02:52:06
70700
代码可运行
举报
文章被收录于专栏:Cyylog技术Cyylog技术
运行总次数:0
代码可运行

本文介绍如何在 Docker 内部以及容器之间管理数据,在容器中管理数据主要有两种方式:

  • 数据卷(Data Volumes)
  • 挂载主机目录 (Bind mounts)

数据卷

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

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

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

选择 -v 还是 -–mount 参数: Docker 新用户应该选择--mount参数,经验丰富的 Docker 使用者对-v或者 --volume已经很熟悉了,但是推荐使用--mount参数。

创建一个数据卷:

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

查看所有的 数据卷:

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

在主机里使用以下命令可以查看指定 数据卷 的信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ docker volume inspect my-vol
[
    {
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
        "Name": "my-vol",
        "Options": {},
        "Scope": "local"
    }
]

启动一个挂载数据卷的容器:在用docker run命令的时候,使用--mount标记来将 数据卷 挂载到容器里。在一次docker run中可以挂载多个 数据卷。下面创建一个名为 web 的容器,并加载一个 数据卷 到容器的 /webapp 目录。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ docker run -d -P \
    --name web \
    # -v my-vol:/wepapp \
    --mount source=my-vol,target=/webapp \
    training/webapp \
    python app.py

查看数据卷的具体信息:在主机里使用以下命令可以查看 web 容器的信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ docker inspect web
...
"Mounts": [
    {
        "Type": "volume",
        "Name": "my-vol",
        "Source": "/var/lib/docker/volumes/my-vol/_data",
        "Destination": "/app",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
],
...

删除数据卷:

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

数据卷 是被设计用来持久化数据的,它的生命周期独立于容器,Docker 不会在容器被删除后自动删除 数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的 数据卷。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用docker rm -v这个命令。 无主的数据卷可能会占据很多空间,要清理请使用以下命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ docker volume prune

挂载主机目录

选择 -v 还是 -–mount 参数: Docker 新用户应该选择 –mount 参数,经验丰富的 Docker 使用者对 -v 或者 –volume 已经很熟悉了,但是推荐使用 –mount 参数。

挂载一个主机目录作为数据卷:使用 --mount 标记可以指定挂载一个本地主机的目录到容器中去。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ docker run -d -P \
    --name web \
    # -v /src/webapp:/opt/webapp \
    --mount type=bind,source=/src/webapp,target=/opt/webapp \
    training/webapp \
    python app.py

上面的命令加载主机的 /src/webapp 目录到容器的 /opt/webapp目录。这个功能在进行测试的时候十分方便,比如用户可以放置一些程序到本地目录中,来查看容器是否正常工作。本地目录的路径必须是绝对路径,以前使用 -v 参数时如果本地目录不存在 Docker 会自动为你创建一个文件夹,现在使用 –mount 参数时如果本地目录不存在,Docker 会报错。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ docker run -d -P \
    --name web \
    # -v /src/webapp:/opt/webapp:ro \
    --mount type=bind,source=/src/webapp,target=/opt/webapp,readonly \
    training/webapp \
    python app.py

加了readonly之后,就挂载为 只读 了。如果你在容器内 /opt/webapp 目录新建文件,会显示如下错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/opt/webapp # touch new.txt
touch: new.txt: Read-only file system

查看数据卷的具体信息:在主机里使用以下命令可以查看 web 容器的信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ docker inspect web
...
"Mounts": [
    {
        "Type": "bind",
        "Source": "/src/webapp",
        "Destination": "/opt/webapp",
        "Mode": "",
        "RW": true,
        "Propagation": "rprivate"
    }
],

挂载一个本地主机文件作为数据卷:--mount标记也可以从主机挂载单个文件到容器中

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

root@2affd44b4667:/# history
1  ls
2  diskutil list

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-01-19,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
4-数据的持久化和共享互连
正常情况下,删除容器,容器中所有的文件也会被删除。所以需要能持久化容器中数据的方法,也就是数据卷 数据卷(Data Volume)的作用:
jackxiao
2021/11/16
6870
Docker重学系列之高级数据卷配置
容器数据卷就是目录的挂载,将我们的容器的目录挂载到宿主机上,从而实现打通宿主机和容器之间的文件共享功能;
大忽悠爱学习
2022/05/10
5290
Docker重学系列之高级数据卷配置
Docker 基础知识 - 使用卷(volume)管理应用程序数据
卷(volumes)是 Docker 容器生产和使用持久化数据的首选机制。绑定挂载(bind mounts)依赖于主机的目录结构,卷(volumes)完全由 Docker 管理。卷与绑定挂载相比有几个优势:
用户8803964
2021/07/05
3.8K1
Docker入门与实践:两种Docker数据管理方法——数据卷、挂载主机目录
下图给出一个示例,其中创建的数据卷My_Volume主要包括的信息有:创建时间、设备类型、标签、挂载点、名字等信息。
用户1143655
2022/06/23
2.4K0
Docker入门与实践:两种Docker数据管理方法——数据卷、挂载主机目录
Docker数据管理
数据卷 ( Data Volumes ) 是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于 Linux 中的 mount 行为 。
海盗船长
2021/12/07
8190
Docker学习笔记之docker volume 容器卷的那些事(一)
接触 docker 的朋友都知道,docker 镜像是以 layer 概念存在的,一层一层的叠加,最终成为我们需要的镜像。但该镜像的每一层都是 ReadOnly 只读的。只有在我们运行容器的时候才会创建读写层。文件系统的隔离使得:
Jetpropelledsnake21
2019/03/19
1.9K0
Docker学习笔记之docker volume 容器卷的那些事(一)
Docker 数据管理介绍
默认容器的数据是保存在容器的可读写层,当容器被删除时其上的数据也会丢失,所以为了实现数据的持久性则需要选择一种数据持久技术来保存数据。官方提供了三种存储方式:Volumes、Bind mounts和tmpfs。前面还介绍了:Docker 服务终端 UI 管理工具
民工哥
2021/03/15
7270
Docker 数据管理介绍
02、数据卷(Data Volumes)以及dockefile详解
天蝎座的程序媛
2023/10/17
5170
02、数据卷(Data Volumes)以及dockefile详解
​Docker数据管理
在前面我们详细学习了docker的三大核心概念:镜像、容器和仓库,接下来开始学习如何管理数据。在实际工作中使用docker,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,此时必然会使用到容器数据管理的各种操作。
啃饼思录
2020/12/29
1.3K0
​Docker数据管理
Docker实践之07-数据管理
数据卷是一个可供一个或多个容器使用的特殊目录,它绕过UFS,可以提供很多有用的特性:
编程随笔
2022/09/09
3920
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
9080
Docker 入门到实战教程(六)Docker数据卷
一. 前言 上一篇介绍到如何构建镜像以及镜像管理,不知道大家学到现在有没有疑问?比如我运行web服务产生的日志,我如何在宿主机上看到?我想安装mysql或者redis等,配置文件如何配置,可以进到容器
小东啊
2020/07/23
1.6K0
Docker 入门到实战教程(六)Docker数据卷
docker入门篇
docker pull centos       # 从docker仓库下载一个镜像例如:docker pull centos:6.7
保持热爱奔赴山海
2019/09/18
6010
容器中的数据管理
本节学习的内容是如何管理容器中的数据以及容器之间的数据,我们将要学习如下两个主要方式:
字母哥博客
2020/09/23
8360
Docker学习——数据管理、使用网络(三)
这一章介绍如何在 Docker 内部以及容器之间管理数据,在容器中管理数据主要有两种方式:
wuweixiang
2018/12/06
5570
Docker 学习笔记-数据管理
我们在使用 docker 的时候会将一些数据(例如网站文件、配置文件、数据库文件等)存储在容器中。这样存在一个严重的问题,如果容器出现损坏(例如无法启动,被删除等)那么存储在容器中的数据就会丢失,即使我们进行了容器备份,数据也不可能恢复到故障发生时。如果要解决这个问题,我们就需要用到 docker 的数据管理。在 docker 中数据管理一共有两种方式,分别是数据卷和数据卷容器,下面我们来一一讲解。
喵叔
2020/09/08
5030
[入门] Docker容器数据储存和转移
容器和镜像之间的主要区别是顶部的可写层。所有对容器添加新的或修改现有数据的内容都存储在该可写层中。当容器被删除时,可写层也被删除。底层镜像保持不变。
宣言言言
2019/12/15
2K0
docker 数据管理
docker镜像被存储在一系列的只读层,当我们开启一个容器,docker读取只读镜像并添加一个读写层在顶部,如果正在运行的容器修改了现有的文件,该文件将被拷贝出底层的只读层到最顶层的读写层,在读写层中的旧版本文件隐藏于该文件之下,但并没有被破坏,它仍然存在于镜像一下,当docker的容器被删除时,然后重新启动镜像时,将开启一个没有任何更改的新的容器,这些更改会丢失,为了能够保存数据以及共享容器间的数据,docker提出了volumes的概念,volumes可以是目录或者文件,它们是外部默认的联合文件系统或者是存在与宿主文件系统正常的目录和文件。
dogfei
2020/07/31
9010
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
相关推荐
4-数据的持久化和共享互连
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验