Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >docker容器数据持久化

docker容器数据持久化

作者头像
小闫同学啊
发布于 2020-03-11 02:36:53
发布于 2020-03-11 02:36:53
4.3K00
代码可运行
举报
文章被收录于专栏:小闫笔记小闫笔记
运行总次数:0
代码可运行

"Failure is success if you learn from it.—— 作者未知"

docker 容器内的数据是独立于镜像之外的,那么如何将其持久化到宿主机呢?答案便是利用「数据卷」,那什么又是「数据卷」呢?更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』

数据卷

数据卷其实就是一个目录或者一个文件,该目录(或文件)可以存在于宿主机上。将此目录(或文件)映射到容器中,便可以持久化容器内的数据到宿主机。如果目录不存在于宿主机上,而是存在于一个容器内部,那么此容器便可以被称为「数据卷容器

下面讲解一下具体的操作方式。

1.持久化到目录

数据卷如果是宿主机的一个目录,可以进行如下操作将容器内的数据持久化:

1.1 命令介绍

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -itd --name [容器名字] -v [宿主机目录]:[容器目录] [镜像名称] [命令(可选)]

该命令解读:通过一个镜像启动一个容器。利用 --name 指定容器的名称;利用 -v 指定宿主机的某目录作为数据卷挂载到容器中,使该容器与宿主机共享此目录 。更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』

注意:1.如果本地路径不存在,docker 会贴心的自动创建。2.宿主机的目录请使用绝对路径

1.2 操作

1) 执行如下命令,将宿主机的 /Users/ethanyan/dockerdata/ 目录映射到新创建的 nginx 容器中的 /data 目录:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -itd --name nginx -v /Users/ethanyan/dockerdata:/data nginx

2) 接下来验证是否生效,先在本地共享目录下创建一个新目录 NG

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd /Users/ethanyan/dockerdata
mkdir NG

3) 进入容器 nginx 中看是否存在 NG 目录:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker exec -it nginx /bin/bash

root@81bbc2c2bf5c:/# cd /data/
root@81bbc2c2bf5c:/data# ls
NG

可发现在本地创建目录后,容器内的确实也出现了新建的目录。

4) 反向进行操作。在容器的 /data/NG 目录中创建一个文件 testdata.txt ,退出容器后发现本地也出现了该文件。从而得出使用此方法可以让容器和宿主机共享目录,并将容器内的数据持久化到本地

2.持久化到文件

2.1 命令介绍

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -itd --name [容器名字] -v [宿主机文件]:[容器文件] [镜像名称] [命令(可选)]

-d 是创建容器后,使其在后台持续运行。更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』

2.2 操作

1) 执行如下命令,将本地的 testdata.txt 文件映射到容器的 testdata.txt 文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -itd --name nginx_test -v /Users/ethanyan/dockerdata/NG/testdata.txt:/data/testdata.txt nginx

同样是创建了一个容器,此容器基于镜像 nginx ,并命名为 nginx_test

注意:宿主机要映射的文件与容器内的文件名称可以不同,但是文件类型必须相同!

2) 接下来同样验证一下此操作。在本地的文件 /Users/ethanyan/dockerdata/NG/testdata.txt 中写入 hello world

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd /Users/ethanyan/dockerdata/NG/
echo 'hello world' > testdata.txt

3) 进入容器内,执行下列操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
root@8694fd7cba10:/# cd /data
root@8694fd7cba10:/data# ls
testdata.txt
root@8694fd7cba10:/data# cat testdata.txt
hello world

4) 验证了宿主机修改文件后容器内文件也被修改。接下来我们在容器内修改一下内容,看本地是否也被修改:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker exec -it nginx /bin/bash

root@8694fd7cba10:/# cd /data
root@8694fd7cba10:/data# ls
testdata.txt
root@8694fd7cba10:/data# echo 'xxx测试用' >> testdata.txt
root@8694fd7cba10:/data# cat testdata.txt
hello world
xxx测试用
root@8694fd7cba10:/data# exit
exit

5) 然后在本地查看发现内容也被更改。说明可以使用文件持久化数据

3.持久化到容器

如果不想这些数据直接暴露在宿主机,可以使用数据卷容器的方式。将数据卷容器挂载到其他容器,就可以多个容器之间共享数据了,而且还可以持久化的保存数据(后面会讲解如何备份和恢复数据卷容器)

注意:数据卷容器不启动

3.1 步骤

1) 创建数据卷容器

2) 将数据卷容器挂载到其他容器更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』

注意:使用数据卷容器是容器之间共享数据,不涉及宿主机,因此数据没有在宿主机上。

3.2 示例

1) 创建一个数据卷容器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 命令
docker create -v [容器数据卷目录] --name [容器名字] [镜像名称] [命令(可选)]
# 示例
docker create -v /data/ --name data nginx

既然需要创建一个数据卷容器,那么就需要使用镜像,因为我电脑只有一个 nginx 镜像,那么使用它即可。一般大家都习惯使用 centos 或者 Ubuntu 作为基础镜像

2) 创建两个容器(为了测试是否可以在容器间共享数据),并都挂载数据卷容器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 创建容器并挂载数据卷命令
docker run --volumes-from [数据卷容器 id/name] -itd --name [容器名字] [镜像名称] [命令(可选)]
# 示例 
docker run  --volumes-from db847d3fc055 -itd --name nginx_test1 nginx /bin/bash
docker run  --volumes-from db847d3fc055 -itd --name nginx_test2 nginx /bin/bash
# 注意:db847d3fc055 为数据卷容器id

3) 验证操作

先进入容器 nginx_test1 中进行操作,创建一个文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker exec -it nginx_test1 /bin/bash

root@72abfcc9e2e9:/# ls /data/
root@72abfcc9e2e9:/# touch /data/file.txt
root@72abfcc9e2e9:/# ls /data/
file.txt
root@72abfcc9e2e9:/# exit
exit

进入容器 nginx_test2 验证,并修改文件内容进行反向验证:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker exec -it nginx_test2 /bin/bash

root@c5f2c2463640:/# ls /data/
file.txt
root@c5f2c2463640:/# echo 'hello world' > /data/file.txt
root@c5f2c2463640:/# exit
exit

然后再进入容器 nginx_test1 验证:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker exec -it nginx_test1 /bin/bash

root@72abfcc9e2e9:/# ls /data/
file.txt
root@72abfcc9e2e9:/# cat /data/file.txt
hello world
root@72abfcc9e2e9:/# exit
exit

3.3 备份与恢复

数据卷容器的备份与恢复并不是容器的备份与恢复,实质上是数据的备份与恢复。

这句话你品,你细品!

3.3.1 备份

命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -it --volumes-from [数据卷容器id或者name] -v [宿主机存放备份文件的目录]:[容器内存放备份文件目录] [镜像] tar cvf [备份文件路径] [要备份的目录]

我们执行示例命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -it --volumes-from data -v /Users/ethanyan/dockerdata/:/backup nginx tar cvf /backup/backup.tar /data
tar: Removing leading `/' from member names
/data/
/data/file.txt

该命令是加载数据卷容器并将容器内的 /data 目录打包,然后把压缩包保存到 映射到容器内 的新数据卷,本地目录为 /Users/ethanyan/dockerdata/ 。执行完后,会在本地该目录出现压缩包 backup.tar

注意:

1) 备份的命令执行完后会创建出一个临时容器,删除即可。重要的是压缩包。

之所以会出现一个临时容器,是因为备份的原理是:创建一个新的容器挂载数据卷容器,而且此容器还与宿主机共享了一个目录(新数据卷),执行打包命令将数据卷容器内的数据打包保存到共享目录中,所以本地会出现一个压缩包。更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』

3.3.2 恢复

请保存好备份的压缩包文件,恢复时用得到。

步骤:

1) 创建一个新的数据卷容器 data_new

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker create -v /data/ --name data_new nginx

2) 恢复之前的备份文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 命令
docker run --volumes-from [新创建的数据卷容器id或者name] -v [宿主机存放备份文件的目录]:[容器内存放备份文件目录] [镜像] tar xvf [备份文件]

# 执行示例命令
docker run --volumes-from data_new -v /Users/ethanyan/dockerdata/:/backup nginx tar xvf /backup/backup.tar
data/
data/file.txt

3) 为了验证是否恢复,我们可以新创建一个容器并挂载新的数据卷容器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run  --volumes-from data_new -itd --name nginx_test6 nginx /bin/bash

docker exec -it nginx_test6 /bin/bash

root@2b54f0bfefbe:/# ls /data
file.txt
root@2b54f0bfefbe:/# cat /data/file.txt
hello world

可看到数据卷容器已经恢复。

3.3.3 备份与恢复的原理

不管是备份还是恢复,我们都使用了一个中间介质,此介质便是一个容器。因为数据卷容器是不启动的,为了备份数据,我们就需要使用一个挂载了此数据卷容器的中间介质(容器)。此介质不光要能连接数据卷容器,还需要连接本地,因此我们又将本地的一个目录映射到了中间介质中。

备份就是中间介质将数据卷容器的目录打包后,再通过映射的目录共享给本地,所以本地会出现一个压缩包。容器列表多了一个新的容器,此容器便是中间介质。

恢复就是中间介质通过映射到容器的共享目录,读取到本地的备份文件(压缩包),然后在容器内部解压缩,数据就恢复到了挂载的数据卷容器中。更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』

当然,此中间介质也可以使用 --name 参数命名,便于删除。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 全栈技术精选 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Docker 系列】docker 学习六,探究一下数据卷容器
Dockerfile 就是用来构建 docker 镜像的构建文件,关于 Dockerfile 详细的我们在后面一期说到,此处先用用
阿兵云原生
2023/02/16
3220
Docker容器数据持久化和容器网桥连接
该命令是通过一个镜像启动一个容器。 用--name指定容器的名称; 用-v指定宿主机的某目录作为数据卷挂载到容器中,使该容器与宿主机共享此目录 。
软测小生
2020/03/19
1.1K0
Docker容器数据持久化和容器网桥连接
4-数据的持久化和共享互连
正常情况下,删除容器,容器中所有的文件也会被删除。所以需要能持久化容器中数据的方法,也就是数据卷 数据卷(Data Volume)的作用:
jackxiao
2021/11/16
6860
Docker容器数据持久化之Data Volume(数据卷)与容器数据共享(1)
 当容器运行期间产生的数据是不会在写镜像里面的,重新用此镜像启动新的容器就会初始化镜像,会加一个全新的读写层来保存数据。如果想做到数据持久化,Docker提供数据卷(Data volume)或者数据容器卷来解决问题,另外还可以通过commit提交一个新的镜像来保存产生的数据。
非著名运维
2022/06/22
1.2K0
Docker 容器的数据管理
docker的理念之一就是将应用和运行的环境打包,因此docker容器的生存周期通常都是与在容器中运行的程序相同的,而我们对数据的要求是持久化,docker容器之间也需要一个共享数据的渠道。这些需求就催生了docker数据卷的诞生。
程序员果果
2019/05/28
5690
Docker 配置安装(Ⅲ)
一、数据卷备份恢复 其实只要是把容器和本地宿主机做了目录映射直接存在本地,那我们只需对本地的硬盘定期备份下不就好了么?那这个备份就是多余的,但是偏偏就有这么干的。备份和恢复也就接踵而来。 1.1 本地创建备份目录 mkdir /data/backup docker run --volumes-from testvol -v /data/backup/:/backup centos tar cvf /backup/data.tar /data/ 说明:首先我们需要使用testvol数据卷新开一个容器,同时我
老七Linux
2018/05/31
6060
Docker系列教程14-Docker数据持久化
容器中数据持久化主要有两种方式: 数据卷(Data Volumes) 数据卷容器(Data Volumes Dontainers) 数据卷 数据卷是一个可供一个或多个容器使用的特殊目录,可以绕过UFS(Unix File System)。 数据卷可以在容器之间共享和重用 对数据卷的修改会立马生效 对数据卷的更新,不会影响镜像 数据卷默认会一直存在,即使容器被删除 一个容器可以挂载多个数据卷 注意:数据卷的使用,类似于 Linux 下对目录或文件进行 mount。 创建数据卷 示例: docker run -
用户1516716
2018/04/03
9190
​Docker数据管理
在前面我们详细学习了docker的三大核心概念:镜像、容器和仓库,接下来开始学习如何管理数据。在实际工作中使用docker,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,此时必然会使用到容器数据管理的各种操作。
啃饼思录
2020/12/29
1.3K0
​Docker数据管理
【赵渝强老师】Docker的数据持久化
在生产环境中使用Docker时,一方面,往往需要对数据进行保存或者在多个容器之间进行数据共享;另一方面,在Docker的容器被删除销毁后,并不保留容器状态的信息。那么如何实现信息的持久化操作呢?这必然涉及容器的数据管理操作和数据的持久化。
赵渝强老师
2024/08/13
1270
【赵渝强老师】Docker的数据持久化
Docker 从入门到实战教程(三):Docker 容器网络与数据管理 | Docker 网络配置、数据卷使用与持久化存储
摘要: 本文是《Docker 从入门到实战》的第三篇,全面介绍了 Docker 容器的网络配置、数据管理以及持久化存储的实现方式。通过深入了解 Docker 网络模型和数据卷的使用,你可以提升容器部署的灵活性与可维护性,特别适用于微服务架构和 DevOps 流程中的数据管理需求。
猫头虎
2025/04/10
2410
Named Volume 在 MySQL 数据持久化上的基本应用
初识春哥时,春哥是美术设计大咖。后不久,创业并致力于游戏开发,已有3年。从Unity3D到IOS(Swift)开发,从前端开发到后端以及容器技术,从设计开发测试到产品经理以及CEO,已是爬坑累累,但是仍是奋勇前行。
心莱科技雪雁
2019/03/19
9170
Docker实践(三):数据持久化及共享
 在Linux上运行的Docker有三种不同的方式将数据从 Docker Host挂载到 Docker 容器,并实现数据的读取和存储:volumes、bind mounts、tmpfs。  
loong576
2019/09/10
9100
Docker实践(三):数据持久化及共享
Docker应用程序数据管理与持久化
默认情况下,container内部新创建文件或者修改文件,结果会保存在container的可读写层中,这意味着:当container消失时,与container一体的可读写层也一并消失,数据并没有持久化。并且,当一个container需要其它container中可读写层的数据时,取出操作非常困难。
Power
2025/03/03
950
docker容器技术系列六:docker容器的数据管理
刚接触docker时总在思考两个问题: 1、docker容器如何实现将数据持久化呢?比如一个httpd容器中用户上传的文件或者访问日志等! 2、如何实现便捷的更新容器中的文件呢? 比如需要快捷的更新容器中的程序,总不能每次更新都build一次镜像吧! 那下面我们就来聊聊docker容器的数据管理:数据卷。 docker提供了两种方式实现数据管理: 1、映射宿主机目录或文件 2、通过创建一个专用的数据卷容器与相关容器间共享数据并实现持久化 一、数据卷的基本概念 数据卷是一个可供一个或多个容器使用的特殊目录,它
小小科
2018/05/04
8420
docker容器技术系列六:docker容器的数据管理
Docker 入门到实战教程(六)Docker数据卷
一. 前言 上一篇介绍到如何构建镜像以及镜像管理,不知道大家学到现在有没有疑问?比如我运行web服务产生的日志,我如何在宿主机上看到?我想安装mysql或者redis等,配置文件如何配置,可以进到容器
小东啊
2020/07/23
1.6K0
Docker 入门到实战教程(六)Docker数据卷
使用docker数据卷持久化容器数据
volume是用于对Docker容器生成和使用的数据持久化的首选机制。如果您的容器生成非持久状态数据,请考虑使用 tmpfs挂载以避免将数据永久存储在任何地方,并通过避免写入容器的可写层来提高容器的性能。
DevOps云学堂
2020/07/23
8050
Docker 使用指南 (四)—— 数据卷的使用
摘要总结:本文主要介绍了如何使用Docker进行数据库的部署和运维,包括Docker Compose、数据卷的使用等。通过使用Docker,可以简化数据库的部署和运维,提高效率和可靠性。同时,还介绍了如何通过数据卷在不同的容器之间共享数据,以及如何使用Docker进行数据的备份和恢复。
田飞雨
2016/07/20
5.3K0
Docker容器的数据卷备份与恢复
1.使用nginx基础镜像新启动一个名为nginx的容器,-v指定数据卷名为web并挂载到nginx容器的/mnt/web目录
非著名运维
2022/06/22
1.1K0
Docker | 数据持久化与数据共享
参考另一篇Docker安装mysql: https://www.cnblogs.com/all-smile/p/16778376.html
甜点cc
2022/10/24
3090
Docker | 数据持久化与数据共享
Docker容器虚拟化(二)—容器管理、仓库管理、数据管理
下载registry镜像,registy为docker官方提供的一个镜像,我们可以用它来创建本地的docker私有仓库。
阿dai学长
2019/04/03
8780
推荐阅读
相关推荐
【Docker 系列】docker 学习六,探究一下数据卷容器
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验