docker数据持久化

news2024/12/23 8:13:02

在Docker中若要想实现容器数据的持久化(所谓的数据持久化即数据不随着Container的结束而销毁),需要将数据从宿主机挂载到容器中。目前Docker提供了三种不同的方式将数据从宿主机挂载到容器中。

(1)Volumes:Docker会管理宿主机文件系统的一部分资源,默认位于 /var/lib/docker/volumes 目录中;(最常用的方式)

[root@localhost ~]# docker run -it -v /opt/ centos /bin/bash

[root@977816d61f04 /]# touch /opt/test.txt

[root@977816d61f04 /]# ls /opt/

test.txt

[root@localhost ~]# ls /var/lib/docker/volumes/38fe1df3b5049eecb6954b65f738a34e8673b2a026a9edeb0c62aaed15c6e99f/_data/

test.txt

  目前所有Container的数据都保存在/var/lib/docker/volumes/目录下边,由于没有在创建时指定卷,所以Docker帮我们默认创建许多匿名(就上面这一堆很长ID的名字)卷。

(2)bind mounts:意为着可以指定存储在宿主机系统的任意位置;(比较常用的方式)

但是bind mounts在不同的宿主机系统之间是不可移植的,比如Windows和Linux的存储结构是不一样的,bind mount所指向的host目录也不能一样。这也是为什么bind mount不能出现在Dockerfile中的原因,因为会导致Dockerfile无法移植。

(3)tmpfs:挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统;(一般都不会用的方式)

 

8.2、Volume的基本使用

8.2.1、管理卷

创建一个自定义容器卷

[root@localhost ~]# docker volume create nginx-data

nginx-data

查看所有容器卷

[root@localhost ~]# docker volume ls

DRIVER              VOLUME NAME

local               nginx-data

查看指定容器卷详情信息

[root@localhost ~]# docker volume inspect nginx-data

[

    {

        "CreatedAt": "2020-12-02T23:21:45+08:00",

        "Driver": "local",

        "Labels": {},

        "Mountpoint": "/var/lib/docker/volumes/nginx-data/_data",

        "Name": "nginx-data",

        "Options": {},

        "Scope": "local"

    }

]

8.2.2、创建使用指定卷的容器

有了自定义容器卷,我们可以创建一个使用这个数据卷的容器

[root@localhost ~]# docker run -d -it --name=nginx -p 8000:80 -v nginx-data:/usr/share/nginx/html nginx

930bcea1135707a66056b6cdc294847925786a6a32692c8873c630cabd8e3681

[root@localhost ~]# docker exec -it nginx /bin/bash

root@930bcea11357:/# ls /usr/share/nginx/html/

50x.html  index.html

选项-v代表挂载数据卷,这里使用自定数据卷nginx-data,并且将数据卷挂载到 /usr/share/nginx/html (这个目录是yum安装nginx的默认网页目录)。如果没有通过-v指定,那么Docker会默认帮我们创建匿名数据卷进行映射和挂载。

注意:

  1. 数据卷下无文件,显示容器对应目录下的文件
  2. 数据卷下有文件,显示数据卷原有文件,并将容器对应目录的文件隐藏,显示数据卷文件

可以看到网页目录下有两个默认页面,这时我们可以查看宿主机文件系统的数据

[root@localhost ~]# ls /var/lib/docker/volumes/nginx-data/_data/

50x.html  index.html

   可以看到容器里面的两个默认页面,由此可知Volume帮我们做了类似于一个软链接的功能。在容器里边的改动,我们可以在宿主机里感知,而在宿主机里面的改动,在容器里边可以感知到。

  如果我们手动stop并且remove当前nginx容器,我们会发现容器卷里面的文件还在,并没有随着容器被删除掉。

[root@localhost ~]# docker stop nginx

nginx

[root@localhost ~]# docker rm nginx

nginx

[root@localhost ~]# ls /var/lib/docker/volumes/nginx-data/_data/

50x.html  index.html

   所以在数据卷里边的东西是可以持久化的。如果下次还需要创建一个nginx容器,那么时候复用当前数据卷里面文件的。

[root@localhost ~]# docker run -d -it --name=nginx2 -p 8001:80 -v nginx-data:/usr/share/nginx/html nginx

f21efa07e66d89004327f6cbb705af9d4464b0f423ffdcec54d9c352b90cbdcb

[root@localhost ~]# docker exec -it nginx2 /bin/bash

root@f21efa07e66d:/# ls /usr/share/nginx/html

50x.html  index.html

  此外,我们还可以启动多个nginx容器实例,共享同一个数据卷。数据卷的复用性和扩展性较强的。

8.2.3、清理卷

如果不再使用自定义数据卷了,那么可以手动清理掉:

[root@localhost ~]# docker volume rm nginx-data

nginx-data

[root@localhost ~]# docker volume ls

DRIVER              VOLUME NA

8.3、Bind Mounts的基本使用

8.3.1 使用卷创建一个容器

[root@localhost ~]# docker run -d -it --name=nginx -p 800:80 -v /wwwroot:/usr/share/nginx/html nginx

d7e201c67bdfbd88ac2aa04590889ac4cc3e2f473f90b1b12dd7c5158f1ec306

这里指定了将宿主机上的 /wwwroot 目录(如果没有会自动创建)挂载到 /usr/share/nginx/html (这个目录是yum安装nginx的默认网页目录)。

docker挂载的默认权限是读写(rw),用户也可以通过ro指定为只读

[root@localhost ~]# docker run -d -it --name=nginx -p 800:80 -v /wwwroot:/usr/share/nginx/html:ro nginx

d7e201c67bdfbd88ac2aa04590889ac4cc3e2f473f90b1b12dd7c5158f1ec306

[root@localhost ~]# docker exec -it nginx /bin/bash

root@d7e201c67bdf:/# ls /usr/share/nginx/html

   可以看到,与volumes不同,bind mounts的方式会隐藏掉被挂载目录里面的内容(如果非空的话),这里是/usr/share/nginx/html 目录下的内容被隐藏掉了,因此我们看不到。

但是,我们可以将宿主机上的文件随时挂载到容器中:

新建一个index.html,并在容器中查看

[root@localhost ~]# echo "test html" > /wwwroot/index.html

root@d7e201c67bdf:/# ls /usr/share/nginx/html

index.html

8.3.2、验证绑定

[root@localhost ~]# docker inspect nginx

        "HostConfig": {

            "Binds": [

                "/wwwroot:/usr/share/nginx/html"

            ],

8.3.3、清理

[root@localhost ~]# docker stop nginx

nginx

[root@localhost ~]# docker rm nginx

nginx

[root@localhost ~]# ls /wwwroot/

index.html

同volumes一样,当我们清理掉容器之后,挂载目录里面的文件仍然还在,不会随着容器的结束而消失,从而实现数据持久化。

8.4、数据卷容器

8.4.1、数据卷容器概述

    用户需要在容器之间共享一些持续性更新的数据时,可以使用数据卷容器。数据容器也是一个普通的容器。里边带有设置好的数据卷,专门提供给其他容器挂载使用。 通过--volumes-from 数据卷容器名来实现。

8.4.2、创建数据卷容器

[root@localhost ~]# docker run -it -v /dbdata:/dbdata --name=dbdata centos /bin/bash

[root@56c18602fb79 /]# exit

exit          

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

进入test1容器创建文件测试

[root@localhost ~]# docker run -it --volumes-from dbdata --name test1 centos /bin/bash

[root@13ab94ee6fde /]# ls

anaconda-post.log  bin  dbdata  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

[root@13ab94ee6fde /]# touch dbdata/crushlinux    

//在test1容器的/dbdata目录创建测试文件

[root@13ab94ee6fde /]# exit

exit

进入test2容器验证结果

[root@localhost ~]# docker run -it --volumes-from dbdata --name test2 centos:1 /bin/bash

[root@fe011c0bb730 /]# ls

anaconda-post.log  bin  dbdata  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

[root@fe011c0bb730 /]# ls dbdata/

crushlinux       //测试文件还在

说明:

  1. 可以多次使用--volume-from参数从多个容器挂载多个目录。也可以从其他已经挂载了数据卷的容器来挂载数据卷(类似传递)。
  2. 再次强调:如果删除了挂载的容器,数据卷不会被自动删除。如果要删除容器的时候同时删除数据卷,需加上-v参数。

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

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

相关文章

【C#学习笔记】值类型(1)

虽然拥有编程基础的人可以很快地上手C#,但是依然需要学习C#的特性和基础。本系列是本人学习C#的笔记,完全按照微软官方文档编写,但是不适合没有编程基础的人。 文章目录 .NET 体系结构Hello,World类型和变量(重要&…

分库分表之基于Shardingjdbc+docker+mysql主从架构实现读写分离 (三)

本篇主要说明: 1. 因为这个mysql版本是8.0,所以当其中一台mysql节点挂掉之后,主从同步,甚至双向数据同步都失效了,所以本篇主要记录下当其中的节点挂掉之后如何再次生效。另外推荐大家使用mysql5.7的版本,这…

3-ASCII-座位渲染-二维码

一 ASCII码 1 概念 ascii码是一种计算机信息交换标准,在这个表里面制定了 128个数字跟128个字符的对应关系 我们只关注字母跟数字的对应关系 2 ASCII码转字符 let str String.fromCharCode(数字)二 js对象跟查询字符串互转 a js对象转查询字符串 //创建一个对象 let obj …

新SDK平台下载开源全志D1-H/D1s的SDK

获取SDK SDK 使用 Repo 工具管理,拉取 SDK 需要配置安装 Repo 工具。 Repo is a tool built on top of Git. Repo helps manage many Git repositories, does the uploads to revision control systems, and automates parts of the development workflow. Repo is…

【Python】模块学习之matplotlib柱状图、饼状图、动态图及解决中文显示问题

目录 前言 安装 pip安装 安装包安装 柱状图 主要方法 参数说明 示例代码 效果图 解决中文显示问题 修改后的图片 饼状图 主要方法 示例代码 效果图 动态图 主要方法 动态图官方使用介绍 示例代码 颜色设置 内建颜色 字体设置 资料获取方法 前言 众所周…

WPF上位机6——文件操作、多线程、线程锁、Task异步编程

文件操作 文件夹操作 创建文件夹 磁盘信息 文件的读写 文件流 Thread多线程 带参数创建线程 Task多线程 创建方式1 第一种 第二种 第三种:线程池的方式 前台与后台线程 线程锁 Task异步编程 task任务取消 task返回值 async await异步 并行库Parallel

CEC2014:CEC2014测试函数及多种智能优化算法求解CEC2014对比

目录 一、CEC2014测试函数 二、多种智能优化算法求解CEC2014 2.1 本文参与求解CEC2014的智能优化算法 2.2 部分测试函数运行结果与收敛曲线 三、曲线标记代码(获得代码后可自行更改) 一、CEC2014测试函数 CEC2014测试集共有30个单目标测试函数&#xff0…

linux下docker安装、镜像下载、镜像基础操作、容器基础操作

目录 一、环境准备 1、开启虚拟化 2、关闭防火墙 3、yum仓库获取阿里源(清华、京东都可以) 4、确保能ping到外网 二、安装docker 1、yum安装docker 2、启动docker并设置开机自启 3、安装docker-ce阿里镜像加速器 三、docker基本操作 1、查看版…

如何在项目需求与技术方案未确定的情况下掌控上线时间?

需求不明确与技术方案未确定的挑战 在任何项目管理过程中,需求和技术方案是两个核心环节。理想情况下,我们希望在项目开始阶段就有清晰明确的需求和经过深思熟虑的技术方案。然而,现实中的项目管理往往并不如此理想。 项目需求的重要性 需求…

2023年全新版Java学习路线,精心整理【文中送书福利 】

小伙伴们大家好,这里是动力节点,我们从2009年开始一直在从事Java培训 到今年已经整14年了,虽然现在不缺培训机构,更不缺Java培训,但是像我们这么多年专注这一件事的应该也不多。我们只希望在“专业”两个字上面不断精…

Vue3 基础知识点汇总 自学笔记,记录难点 和 新知识点

1.vue3 基础 1.1vue3基础及创建 npm init vue@latest1.2.熟悉项目目录及关键文字 1.3 组合式API-setup 1.4.组合式 API reactive 和ref 函数 (都是为了生成响应式数据) 1.5.组合式API-computed 计算属性函数 1.6.watch 函数 1.7.组合式API-生命周期函数 1.8.组合式 API-父子…

Spring之事务实现方式及原理

目录 Spring事务简介 Spring支持事务管理的两种方式 编程式事务控制 声明式事务管理 Spring事务角色 未开启事务之前 开启Spring的事务管理后 事务配置 事务传播行为 事务传播行为的可选值 Spring事务简介 事务作用:在数据层保障一系列的数据库操作同成功…

Python之pyinstaller打包exe填坑总结

一、起因 编写了一个提取图片中文字的python脚本,想传给同事使用,但是同事电脑上没有任何python环境,更没有安装python库,因此想到通过pyinstaller打包成exe程序传给同事使用,于是开始了不断地挖坑填坑之旅 import p…

Kafka-消费者组消费流程

消费者向kafka集群发送消费请求,消费者客户端默认每次从kafka集群拉取50M数据,放到缓冲队列中,消费者从缓冲队列中每次拉取500条数据进行消费。

Dockerfile构建SSHD镜像

Dockerfile构建SSHD镜像 基于Dockerfile制作镜像时首先需要建立工作目录,作为生成镜像的工作目录,然后分别创建并编写 Dockerfile文件、需要运行的脚本文件以及要复制到容器中的文件。 1、环境配置: [rootdocker ~]# iptables -F [rootdoc…

用python+PyQt5来编写一个定时关机窗口

一、界面展示 二、源码 import sys from PyQt5.QtWidgets import QDesktopWidget,QApplication, QWidget, QLabel, QVBoxLayout, QPushButton, QSpinBox import osclass AutoShutdownApp(QWidget):def __init__(self):super().__init__()self.setWindowTitle("自动关机应…

Aop监控所有Controller,包括void类型的response中的出参(工具类)

一、主要坐标 <!--aop--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>com.google.guava</groupId><artifa…

saas堡垒机定义以及优势简单说明

工作中我们经常可以听到saas这个词语&#xff0c;但对于saas堡垒机相信还有很多人不了解。今天我们就来一起简单聊聊什么是saas堡垒机&#xff0c;saas堡垒机有哪些优势。 saas堡垒机定义 saas堡垒机顾名思义为一款SaaS化堡垒机产品&#xff0c;即一款SaaS运维审计安全系统。…

学习记录——EGE-UNet、R2AU-Net、PHNet、CFNet

EGE-UNet: an Efficient Group Enhanced UNet for skin lesion segmentation 上海交大 2023 MICCAI 基于 U-Net 进行魔改&#xff0c;用于解决医学图像&#xff08;尤其是皮肤病变&#xff09;分割中面临的问题。由于它是针对移动健康应用开发的&#xff0c;解决了当前许多模型…

硬件系统工程师宝典(35)-----SDRAM是如何“提速”的?

各位同学大家好&#xff0c;欢迎继续做客电子工程学习圈&#xff0c;今天我们继续来讲这本书&#xff0c;硬件系统工程师宝典。 上篇我们了解了FLASH可分为NOR FLASH和NAND FLASH&#xff0c;NOR FLASH一般用于代码运行及擦除或编程较少的场合&#xff0c;NAND FLASH用于擦除、…