5.Docker数据管理

文章目录

  • Docker数据管理
    • 1、数据卷
      • 1.1、创建数据卷
      • 1.2、绑定数据卷
    • 2、数据卷容器
    • 3、利用数据卷容器迁移数据
      • 3.1、备份
      • 3.2、恢复
  • 总结

Docker数据管理

在生产环境中使用 Docker涉及容器的数据管理操作,需要对数据进行持久化或者需要在多个容器之间进行数据共享。

容器中的管理数据主要有两种方式:

  • 数据卷 (Data Volumes): 容器内数据直接映射到本地主机环境;

    在容器内创建数据卷, 并且把本地的目录或文件挂载到容器内的数据卷中。

  • 数据卷容器 (Data Volume Containers): 使用特定容器维护数据卷。

    使用数据卷容器在容器和主机、 容器和容器之间共享数据, 并实现数据的备份和恢复。

1、数据卷

数据卷(Data Volumes)是一个可供容器使用的特殊目录映射进容器,它将主机操作系统目录直接类似于Linux中的mount行为。

数据卷特性:

  • 数据卷可以在容器之间共享和重用, 容器间传递数据将变得高效与方便;
  • 对数据卷内数据的修改会立马生效, 无论是容器内操作还是本地操作;
  • 对数据卷的更新不会影响镜像, 解耦开应用和数据;
  • 卷会一直存在, 直到没有容器使用, 可以安全地卸载它。

1.1、创建数据卷

volume子命令管理数据卷

[root@localhost ~]# docker volume create -d local test
test
#查看/var/lib/docker/volumes路径下,会发现所创建的数据卷位置
[root@localhost ~]# ls -l /var/lib/docker/volumes/
drwx-----x. 3 root root     19 56 23:03 test

docker volume还支持inspect(查看详细信息)、ls (列出已有数据卷)、prune(清理无用数据卷)、rm(删除数据卷)等。

[root@localhost ~]# docker volume inspect test
[{"CreatedAt": "2024-05-06T23:03:37-04:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/test/_data","Name": "test","Options": null,"Scope": "local"}
]
[root@localhost ~]# docker volume ls
DRIVER    VOLUME NAME
local     3c5f45922be6ba271bd6f40bfb160d55d6552e46a2b0155ed6c31fee47dbf430
local     baf0e871e0586fdc374d0451354c488a413270ccc8cb4e7c53a47510c30b01ad
local     test
[root@localhost ~]# docker volume prune
WARNING! This will remove anonymous local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B

1.2、绑定数据卷

在创建容器时将主机本地的任意路径挂载到容器内作为数据卷,这种形式创建的数据卷称为绑定数据卷。

docker [container] run命令可以使用-mount选项来使用数据卷。

-mount选项支持三种类型的数据卷:

  • volume: 普通数据卷,映射到主机 /var/lib/docker/volumes路径下;
  • bind: 绑定数据卷, 映射到主机指定路径下;
  • tmpfs: 临时数据卷,只存在于内存中。

举例:使用 training/webapp镜像创建一个Web容器,并创建一个数据卷挂载到容器的/opt/webapp目录。

[root@localhost ~]$ mkdir /webapp
[root@localhost ~]$ docker run -d -it -P --name web --mount type=bind,source=/webapp,destination=/opt/webapp ubuntu /bin/bash
#等价于使用旧的 -v标记可以在容器内创建一个数据卷
$ docker run -d -it -P --name web -v /webapp:/opt/webapp ubuntu /bin/bash
#测试
[root@localhost ~]# cd /webapp/
[root@localhost webapp]# touch a
[root@localhost webapp]# ls
a  
[root@localhost ~]# docker exec -it adc2b32202cd /bin/bash
root@adc2b32202cd:/# cd /opt/webapp/
root@adc2b32202cd:/opt/webapp# ls
a

用户可以放置一些程序或数据到本地目录中实时进行更新,然后在容器内运行和使用。本地目录的路径必须是绝对路径,容器内路径可以为相对路径。如果目录不存在,Docker会自动创建。

查看数据卷是否挂载成功:

docker inspect 容器名称

Docker挂载数据卷的默认权限是读写(rw), 用户也可以通过ro指定为只读,容器内对所挂载数据卷内的数据就无法修改。

$ docker run -d -it -P --name web -v /webapp:/opt/webapp:ro ubuntu /bin/bash

直接挂载一个文件到容器,使用文件编辑工具,包括 vi或者sed --in-place 的时候,可能会造成文件 inode的改变。从Docker 1. 1 .0起,这会导致报错误信息。所以推荐的方式是直接挂载文件所 在的目录到容器内。

💡Docker挂载主机目录访问如果出现cannot open directory .: Permission denied

解决办法:在挂载目录后多加一个–privileged=true参数即可。

原因是CentOS7安全模块会比之前系统版本加强,不安全的会先禁止,所以目录挂载的情况被默认为不安全的行为,在SELinux里面挂载目录被禁止掉了,如果要开启,我们一般使用–privileged=true命令,扩大容器的权限解决挂载目录没有权限的问题,也即使用该参数,container内的root拥有真正的root权限,否则,container内的root只是外部的一个普通用户权限。

2、数据卷容器

数据卷容器是专门提供数据卷给其他容器挂载的容器。如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。

  1. 创建一个数据卷容器dbdata, 并在其中创建一个数据卷挂载到/dbdata

    [root@localhost ~]# mkdir /dbdata
    [root@localhost ~]# docker run -it -v /dbdata --name dbdata ubuntu
    root@529ee7fec788:/# ls
    bin  boot  dbdata  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    
  2. 可以在其他容器中使用–volumes-from来挂载dbdata容器中的数据卷,例如创建db1和db2两个容器并从dbdata容器挂载数据卷。

    [root@localhost ~]# docker run -it -d --volumes-from dbdata --name db1 ubuntu
    63241c4a05903f0dad1a13ded4d4390b2978ab801bb999773d8459f2e3b786e6
    [root@localhost ~]# docker run -it -d --volumes-from dbdata --name db2 ubuntu
    51cc6dadb57707bfb39e0a8d9c3e79d7bcde52a82c4fb1e971c51898c5681079[root@localhost ~]# docker exec -it db1 /bin/bash
    root@63241c4a0590:/# ls
    bin  boot  dbdata  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    

    在数据卷容器dbdata中挂载目录创建文件后,在db1和db2中可以看到和使用。

🔔可以多次使用--volumes-from参数来从多个容器挂载多个数据卷,还可以从其他已经挂载了容器卷的容器来挂载数据卷。使用--volumes-from参数所挂载数据卷的容器自身并不需要保持在运行状态。

如果删除了挂载的容器(包括dbdata、db1和db2), 数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式使用docker rm -v命令来指定同时删除关联的容器。

[root@localhost ~]# docker run -it -d --name db3 --volumes-from db1 ubuntu
f739ab152a712eeb3dda3f079c490d06338bfb8f89137f7abc3ccb6f110e0f0b
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE        COMMAND                   CREATED         STATUS          PORTS                                       NAMES
f739ab152a71   ubuntu       "bash"                    2 seconds ago   Up 2 seconds                                                db3
51cc6dadb577   ubuntu       "bash"                    2 hours ago     Up 52 seconds                                               db2
63241c4a0590   ubuntu       "bash"                    2 hours ago     Up 53 seconds                                               db1
529ee7fec788   ubuntu       "bash"                    3 hours ago     Up 58 seconds                                               dbdata
[root@localhost ~]# 
[root@localhost ~]# docker exec -it db3 /bin/bash
root@f739ab152a71:/# 
root@f739ab152a71:/# ls
bin  boot  dbdata  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@f739ab152a71:/# exit
exit[root@localhost ~]# docker rm -v db1 db3
Error response from daemon: cannot remove container "/db1": container is running: stop the container before removing or force remove
Error response from daemon: cannot remove container "/db3": container is running: stop the container before removing or force remove
[root@localhost ~]# docker stop db1
db1
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE        COMMAND                   CREATED              STATUS              PORTS                                       NAMES
f739ab152a71   ubuntu       "bash"                    About a minute ago   Up About a minute                                               db3
51cc6dadb577   ubuntu       "bash"                    2 hours ago          Up 2 minutes                                                    db2
529ee7fec788   ubuntu       "bash"                    3 hours ago          Up 2 minutes                                                    dbdata
[root@localhost ~]# docker stop db3
db3
[root@localhost ~]# docker rm -v db1 db3
db1
db3
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE        COMMAND                   CREATED       STATUS          PORTS                                       NAMES
51cc6dadb577   ubuntu       "bash"                    2 hours ago   Up 2 minutes                                                db2
529ee7fec788   ubuntu       "bash"                    3 hours ago   Up 2 minutes                                                dbdata

3、利用数据卷容器迁移数据

3.1、备份

备份dbdata数据卷容器内的数据卷

docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu tar
cvf /backup/backup.tar /dbdata

理解:

  1. 专门启动一个worker容器,将当前目录映射到容器的/backup目录下;
  2. 使用--volumes-from dbdata参数来让worker容器挂载dbdata容器的数据卷;
  3. 将worker容器中的/dbdata目录压缩存储至backup目录下;
  4. 此时查看宿主机本地目录,可以查看到压缩包。

3.2、恢复

1.创建一个带有数据卷的容器dbdata2

$ docker run -v /dbdata --name dbdata2 ubuntu /bin/bash

2.创建另一个新的容器, 挂载dbdata2的容器, 并使用untar解压备份文件到所挂载的容器卷中

$ docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar -C /dbdata
#等价于
$ docker run --mount source=dbdata2,target=/dbd --mount type=bind,source=$(pwd),target=/backup busybox tar xvf /backup/backup.tar -C /dbd

总结

​ 数据卷机制为数据管理提供了方便的操作支持 。通过数据卷和数据卷容器对容器内的数据进行共享、备份和恢复等操作, 这些机制即使容器在运行中出现故障,用户也不必担心数据发生丢失, 只需要快速地重新创建容器即可。

​ 在生产环境中推荐在使用数据卷或数据卷容器之外,定期将主机的本地数据进行备份, 或者使用支持容错的存储系统, 包括 RAID 或分布式文件系统。
​ 另外, 有些时候不希望将数据保存在宿主机或容器中, 还可以使用 tmpfs类型的数据卷, 其中数据只存在内存中, 容器退出后自动删除。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/833130.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DDR4 新功能介绍

DDR4(第四代双倍数据率同步动态随机存取内存)相较于其前代DDR3,引入了一些新的功能和改进,这些新功能有助于提高内存的性能、降低功耗以及增强系统的可靠性,包括VPP、DBI(Data Bus Inversion,数据总线翻转)和DMI(与LPDDR4相关)。以下是对这些功能的简要说明: 更高的…

《QT实用小工具·六十》Qt 多列时间轴控件

1、概述 源码放在文章末尾 Qt 多列时间轴控件。 可与多段字符串格式自由转换,也可手动添加列表项。 专门用来以时间轴作为事件线发展顺序的故事大纲。 特点 时间背包功能:记录所有物品或属性发生的变化,随时回溯 时间可输入任意内容&…

[redis] 说一说 redis 的底层数据结构

Redis有动态字符串(sds)、链表(list)、字典(ht)、跳跃表(skiplist)、整数集合(intset)、压缩列表(ziplist) 等底层数据结构。 Redis并没有使用这些数据结构来直接实现键值对数据库,而是基于这些数据结构创建了一个对象系统,来表示所有的key-value。 文章…

书生·浦语大模型实战营之手把手带你评测 Llama 3 能力(OpenCompass 版)

书生浦语大模型实战营之手把手带你评测 Llama 3 能力(OpenCompass 版) 环境配置 conda create -n llama3 python3.10 pytorch torchvision pytorch-cuda -c nvidia -c pytorch -y conda activate llama3conda install git git-lfs install✨下载 Llama3…

C# OpenCvSharp 图片找茬

C# OpenCvSharp 图片找茬 目录 效果 项目 代码 下载 效果 项目 代码 using OpenCvSharp; using System; using System.Diagnostics; using System.Drawing; using System.Windows.Forms; namespace OpenCvSharp_Demo { public partial class Form1 : Form { …

Meltdown 以及Linux KPTI技术简介

文章目录 前言一、Introduction二、 Background2.1 Out-of-order execution2.2 Address Spaces2.3 Cache Attacks 三、A Toy Example四、Building Blocks of the Attack4.1 Executing Transient Instructions4.2 Building a Covert Channel 五、Meltdown5.1 Attack Description…

【docker】容器创建、服务启动、容器迁移

一、镜像基本操作 在Docker中,镜像(images)是用来创建容器(containers)的模板,每个镜像都是一个独立的对象,可以被多个容器使用。 1、查询镜像(images) docker search ubuntu 2、创建镜像(images)并进入容器(containers) docker run -it --name my_container ub…

DAY38,39,41|动态规划01

文章目录 509.斐波那契数70.爬楼梯746.使用最小花费爬楼梯62.不同路径63.不同路径II343.整数拆分 509.斐波那契数 代码: class Solution {public int fib(int n) {if (n0||n1) {return n;}//1.确认dp数组和下标含义,一维dp数组,第i个数据为…

关于ssti(简介)

ssti(Server-Side Template Injection)即服务器端模版注入。 首先,在介绍ssti漏洞之前,需要了解web前端框架(MVC)中对模版文件的调用和渲染,Web框架比如Flask(以使用 Python 编写的轻…

【Linux】Docker 安装部署 Nacos

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 【Linux】Docker 安装部署 Nacos docker搜索na…

Leetcode—289. 生命游戏【中等】

2024每日刷题&#xff08;126&#xff09; Leetcode—289. 生命游戏 算法思想 实现代码 class Solution { public:void gameOfLife(vector<vector<int>>& board) {int rows board.size();int cols board[0].size();int neighbors[3] {0, 1, -1};vector<…

信息系统安全与对抗-网络侦查技术与网络扫描技术(期末复习)

1、网络拓扑结构在网络攻击中的作用 查明目标网络的拓扑结构&#xff0c;有利于找到目标网络的关键节点&#xff0c;从而提高攻击效率&#xff0c;达到最大攻击效果。 2、网络侦查在网络攻击中的作用 识别潜在目标系统&#xff0c;确认目标系统适合哪种类型的攻击。 3、百度…

电动汽车电机转矩计算(个人交流使用)

电动汽车电机转矩计算 Motor torque calculation for EV 驱动力-行驶阻力平衡公式【Driving force- resistance balance formula】 F t F f F w F i F j F_t F_f F_w F_i F_j Ft​Ff​Fw​Fi​Fj​ where F t , 驱动力 [ Driving force ] F f &#xff0c;滚动阻力 […

【嵌入式必读】一文彻底理解PID自整定及PID自整定代码设计

文章目录 1. 前言2. PID简介3. 常用的PID自整定方法3.1 临界度比例法3.2 衰减曲线法 4. 继电反馈整定法原理4.1 继电反馈自整定的基本思想4.2 继电反馈自整定原理 5. 算法设计5.1 振荡的生成5.2 提取出临界周期 T c T_c Tc​和振荡波形幅值 A A A5.3 计算出PID参数 6 原代码6.1…

回归预测 | Matlab实现基于CNN-SE-Attention-ITCN多特征输入回归组合预测算法

回归预测 | Matlab实现基于CNN-SE-Attention-ITCN多特征输入回归组合预测算法 目录 回归预测 | Matlab实现基于CNN-SE-Attention-ITCN多特征输入回归组合预测算法预测效果基本介绍程序设计参考资料 预测效果 基本介绍 【模型简介】CNN-SE_Attention结合了卷积神经网络&#xff…

navicat premium16.3.9重置

软件下载 官网地址&#xff1a;https://navicat.com.cn/products/ # 准备脚本 1、建一个txt 2、复制以下代码 3、修改文件格式为bat 4、运行bat文件 5、重新打开navicat&#xff0c;试用期重置为14 经测试16.2.3以上版本均可用 echo off set dnInfo set dn2ShellFolder set r…

【计组OS】访存过程以及存储层次化结构

苏泽 本专栏纯个人笔记作用 用于记录408 学习的笔记记录&#xff08;敲了两年码实在不习惯手写笔记了&#xff09; 如果能帮助到大家当然最好 但由于是工作后退下来备考 很多说法和想法都会结合实际开发的思想 可能不是那么的纯粹应试哈 希望大家挑选自己喜欢的口味食用…

AIGC技术的未来与展望

如何看待AIGC技术&#xff1f; 方向一&#xff1a;技术应用 AIGC&#xff08;人工智能生成内容&#xff09;技术已经在多个领域得到应用&#xff0c;包括但不限于传媒、电商、教育、娱乐和工业设计。例如&#xff0c;在传媒行业&#xff0c;AIGC技术被用于自动生成新闻稿件、…

SpringBootWeb入门

SpringBoot可以帮助我们快速的构建应用程序、简化开发、提高效率 创建SpringBoot工程&#xff0c;并勾选web开发相关依赖 定义HelloController类&#xff0c;添加方法&#xff0c;并添加注解 运行测试 创建SpringBoot工程(联网下载) 在File里面点击new Module 点击next 修…

信创 | 信创产业数字化转型与升级:路径规划与实践!

信创产业的数字化转型与升级路径&#xff0c;主要围绕着构建国产化信息技术软硬件底层架构体系和全周期生态体系&#xff0c;解决核心技术关键环节“卡脖子”的问题&#xff0c;以推动中国经济数字化转型的平稳健康发展。 一、信创产业的发展趋势包括&#xff1a; 加强国产信息…