《Docker极简教程》--Docker卷和数据持久化--Docker卷的使用
一、基本操作
1.1 创建Docker卷
创建 Docker 卷是在 Docker 中管理持久化数据的重要步骤之一。通过 Docker 卷,可以将数据与容器解耦,实现数据的持久化存储,并且可以在容器之间共享数据。以下是创建 Docker 卷使用 docker volume create
命令创建卷
docker volume create my_volume
这将创建一个名为 my_volume
的 Docker 卷。你也可以在创建卷时指定其他选项,以下是常用参数:
- –name: 指定卷的名称。
- –driver: 指定卷的驱动程序。Docker 支持多种卷驱动程序,如 local、azure、efs 等。
- –opt: 为卷指定选项。这可以是一个键值对,用于设置特定驱动程序的选项。
- –label: 为卷添加标签。标签可以用于组织和识别卷。
- –mount: 指定挂载选项。可以使用此参数将卷挂载到容器中,并设置挂载的选项,如挂载路径等。
- –rm: 在容器停止时自动删除关联的卷。这个参数在创建临时卷时很有用。
- –read-only: 将卷挂载为只读。这可以确保容器只能读取卷中的数据,而无法对其进行写入操作。
- –volume-driver: 指定使用的卷驱动程序。与 --driver 参数类似,但只影响单个挂载点。
- –size: 指定卷的大小。对于某些存储后端,如本地存储驱动程序,可以设置卷的大小限制,默认单位为字节。
这些参数可以根据需求组合使用,以创建和管理 Docker 卷。它们使得可以根据具体应用程序的需求来定制卷的行为和特性,从而更好地满足应用程序的要求。
1.2 挂载Docker卷到容器
在 Docker 中,可以使用 -v
或 --mount
选项将 Docker 卷挂载到容器中。下面分别介绍这两种方法:
- 使用
-v
选项:
这会将名为docker run -d --name my_container -v my_volume:/path/in/container my_image
my_volume
的 Docker 卷挂载到容器中的/path/in/container
目录中。其中,my_container
是容器的名称,my_image
是容器所基于的镜像。 - 使用
--mount
选项:
这也会将名为docker run -d --name my_container --mount source=my_volume,target=/path/in/container my_image
my_volume
的 Docker 卷挂载到容器中的/path/in/container
目录中。source
指定了卷的名称,target
指定了挂载到容器中的路径。
无论是使用-v
还是--mount
选项,都可以将 Docker 卷挂载到容器中。挂载后,容器就可以读写卷中的数据,实现了数据在容器之间的共享和持久化存储。
1.3 查看和管理Docker卷
要查看和管理 Docker 卷,可以使用一系列 Docker 命令。以下是一些常用的命令和操作:
-
列出所有 Docker 卷:
docker volume ls
这会列出所有当前系统中存在的 Docker 卷,包括名称、驱动程序和卷的大小等信息。
-
查看特定 Docker 卷的详细信息:
docker volume inspect <volume_name>
这会显示特定 Docker 卷的详细信息,包括卷的名称、驱动程序、挂载点等。
-
删除 Docker 卷:
docker volume rm <volume_name>
这会删除指定名称的 Docker 卷。请注意,只有当没有容器正在使用该卷时,才能成功删除。
-
删除未使用的 Docker 卷:
docker volume prune
这会删除当前系统中未被任何容器使用的所有 Docker 卷。
-
为 Docker 卷添加标签:
docker volume label <volume_name> <label_key>=<label_value>
这会为指定的 Docker 卷添加标签,标签可以用于组织和识别卷。
-
移除 Docker 卷的标签:
docker volume label rm <volume_name> <label_key>
这会移除指定 Docker 卷的特定标签。
通过这些命令,你可以方便地查看和管理 Docker 卷。这些操作使得可以有效地管理卷,清理不再需要的卷,并对卷进行标记以便于识别和组织。
二、数据持久化
2.1 数据卷容器
数据卷容器是一种特殊类型的容器,旨在存储和管理数据卷,以便其他容器可以共享和访问这些数据。数据卷容器提供了一种简单有效的方式,使得多个容器可以访问共享数据,同时也使得数据的管理更加方便。
以下是使用数据卷容器的一般步骤:
- 创建数据卷容器:
首先,创建一个专门用于存储数据卷的容器。这个容器通常不需要运行任何应用程序,它只是用来存储数据。
这将创建一个名为docker create -v /data --name data_container ubuntu
data_container
的容器,其中包含一个名为/data
的卷,并使用了ubuntu
镜像。 - 使用数据卷容器:
现在,可以通过--volumes-from
选项将数据卷容器挂载到其他容器中。
这将创建两个容器docker run --volumes-from data_container --name app_container1 my_app_image docker run --volumes-from data_container --name app_container2 my_app_image
app_container1
和app_container2
,它们都能够访问和共享data_container
中的数据卷。
通过这种方式,可以实现数据的共享和持久化存储,同时也能够更灵活地管理数据。数据卷容器提供了一种简单而强大的机制,使得容器之间能够共享数据,而无需直接暴露它们的文件系统。
2.2 将主机目录挂载到容器
将主机目录挂载到容器是一种常见的操作,可以实现容器与主机之间的数据共享。这种挂载方式特别适合需要将主机上的数据或配置文件传递给容器的情况。以下是如何将主机目录挂载到容器的基本步骤:
-
确定要挂载的主机目录:
在主机上选择一个目录,作为需要共享给容器的数据或配置文件的存储位置。例如,假设要将主机上的/host/data
目录挂载到容器。 -
运行容器时进行挂载:
使用-v
或--mount
选项,在运行容器时将主机目录挂载到容器中。
使用-v
选项的示例:docker run -d --name my_container -v /host/data:/container/path my_image
这会将主机上的
/host/data
目录挂载到容器中的/container/path
目录。使用
--mount
选项的示例:docker run -d --name my_container --mount type=bind,source=/host/data,target=/container/path my_image
这也会将主机上的
/host/data
目录挂载到容器中的/container/path
目录。 -
访问挂载的主机目录:
在容器内部,可以像访问普通文件一样访问挂载的主机目录,容器内部的操作对主机上的目录和文件具有实时影响。
通过这些步骤,可以轻松将主机目录挂载到容器中,实现容器与主机之间的数据共享和交互。这对于需要在容器内访问主机上的数据或配置文件的场景非常有用。
2.3 数据卷的备份和恢复
备份和恢复 Docker 数据卷是确保数据持久性和安全性的重要方面。下面是备份和恢复 Docker 数据卷的基本步骤:
-
备份 Docker 数据卷:
- 创建数据卷备份容器:
创建一个临时容器,挂载数据卷并将数据备份到容器内部的临时目录中。
这个命令将会创建一个名为docker run --rm --volumes-from <container_name_or_id> -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /path/to/volume
backup.tar
的备份文件。 - 将备份文件从容器拷贝到宿主机:
使用docker cp
命令将备份文件从备份容器中拷贝到宿主机上。
这个命令将备份文件拷贝到宿主机上的指定目录中。docker cp <container_id>:/backup/backup.tar /host/path/backup.tar
- 创建数据卷备份容器:
-
恢复 Docker 数据卷:
- 创建临时数据卷容器:
创建一个临时容器,将备份文件拷贝到容器内部,并解压缩备份文件。
这个命令将备份文件解压缩到指定的数据卷中。docker run --rm -v <container_name_or_id>:/target -v /host/path/backup.tar:/backup.tar ubuntu bash -c "cd /target && tar xvf /backup.tar --strip 1"
- 将备份文件拷贝到数据卷容器中:
使用docker cp
命令将备份文件拷贝到新创建的数据卷容器中。
这个命令将备份文件拷贝到指定的数据卷容器中。docker cp /host/path/backup.tar <container_id>:/backup.tar
- 解压缩备份文件:
在数据卷容器内部解压缩备份文件。
这个命令将备份文件解压缩到数据卷中。docker exec -it <container_id> bash -c "cd /target && tar xvf /backup.tar --strip 1"
- 创建临时数据卷容器:
通过这些步骤,可以实现 Docker 数据卷的备份和恢复操作。备份可以保证数据的安全性,而恢复操作可以在数据丢失或损坏时快速地恢复数据。
三、实际应用场景
3.1 数据库持久化
在 Docker 中使用数据卷进行数据库持久化是一种常见的场景,特别是对于需要保留数据并确保数据不会丢失的生产环境。以下是一个使用 Docker 数据卷进行数据库持久化的示例,以 MySQL 数据库为例:
- 创建 MySQL 数据卷容器:
这将创建一个名为docker volume create mysql_data
mysql_data
的 Docker 数据卷,用于存储 MySQL 数据。 - 启动 MySQL 容器并挂载数据卷:
这会启动一个 MySQL 容器,将docker run -d --name mysql_db -e MYSQL_ROOT_PASSWORD=my-secret-pw -v mysql_data:/var/lib/mysql mysql:latest
mysql_data
数据卷挂载到容器的/var/lib/mysql
目录中,并设置 MySQL 的 root 密码为my-secret-pw
。 - 连接到 MySQL 容器并创建数据库:
这会连接到 MySQL 容器,并使用指定的 root 密码登录 MySQL。然后可以在 MySQL 中执行 SQL 命令来创建数据库、用户等。docker exec -it mysql_db mysql -uroot -pmy-secret-pw
- 停止和重新启动容器:
容器中的数据库数据现在将存储在mysql_data
数据卷中。当需要停止或重新启动容器时,数据将保留在数据卷中,并且可以在容器重新启动后立即访问。
通过这个例子,可以看到如何使用 Docker 数据卷来实现 MySQL 数据库的持久化存储。无论容器如何启动、停止或重新启动,数据库数据都会被保存在数据卷中,确保数据的持久性和安全性。
3.2 日志持久化
在 Docker 中,持久化日志是保证日志数据不丢失并能够在容器重新启动后继续访问的重要方面。以下是一个使用 Docker 数据卷持久化日志的示例,以 Nginx 服务器为例:
- 创建 Nginx 日志目录容器:
首先,创建一个用于存储 Nginx 日志的数据卷容器。docker volume create nginx_logs
- 启动 Nginx 容器并挂载日志目录:
使用-v
或--mount
选项,将 Nginx 日志目录挂载到数据卷容器中。
这会启动一个 Nginx 容器,并将docker run -d --name nginx_server -v nginx_logs:/var/log/nginx -p 80:80 nginx:latest
nginx_logs
数据卷挂载到容器的/var/log/nginx
目录中,同时将容器的 80 端口映射到宿主机的 80 端口。 - 访问 Nginx 日志:
可以通过进入数据卷容器或者直接在宿主机上查看数据卷的方式来访问 Nginx 的日志。
进入容器后,可以在docker exec -it nginx_server /bin/bash
/var/log/nginx
目录下找到 Nginx 的日志文件。 - 持久化日志数据:
当 Nginx 容器启动和运行时,所有的日志数据都将存储在nginx_logs
数据卷中。即使容器被停止或重新启动,日志数据仍然保持在数据卷中,可以在容器重新启动后继续访问。
通过这个例子,可以看到如何使用 Docker 数据卷来实现 Nginx 服务器日志的持久化存储。这样可以确保日志数据不会丢失,并且可以在容器重新启动后继续访问和分析。
3.3 共享数据卷
在 Docker 中,可以使用数据卷来实现容器之间的数据共享。以下是一个示例,演示如何在两个容器之间共享数据卷:
- 创建数据卷容器并挂载数据卷:
首先,创建一个用于存储共享数据的数据卷容器。docker volume create shared_data
- 在第一个容器中创建共享数据:
启动一个容器,并将数据写入到共享数据卷中。
在容器中执行一些操作,比如创建文件或者写入数据到docker run -it --name container1 -v shared_data:/data ubuntu
/data
目录中。 - 在第二个容器中访问共享数据:
启动另一个容器,并挂载同一个共享数据卷。
在容器中可以访问到之前创建的共享数据,数据将与第一个容器中的数据相同。docker run -it --name container2 -v shared_data:/data ubuntu
- 在两个容器之间共享数据:
现在,两个容器都可以访问共享数据卷/data
中的数据。任何一个容器对共享数据的修改都会立即反映到另一个容器中。
通过这个示例,可以看到如何使用 Docker 数据卷来在容器之间共享数据。这种方法非常灵活,使得容器之间可以轻松地共享文件和数据,而无需复制或传输大量数据。
四、总结
本文介绍了 Docker 数据卷的基本操作、数据持久化以及实际应用场景。在基本操作部分,详细介绍了如何创建 Docker 卷、挂载卷到容器以及查看和管理卷的方法,并列举了常用的参数和选项。在数据持久化部分,以数据库持久化和日志持久化为例,说明了如何使用 Docker 数据卷来保证数据持久性和安全性。最后,通过共享数据卷的示例展示了容器之间如何共享数据。这些技术和实践使得 Docker 在实际应用中能够更好地满足持久化存储和数据共享的需求,为容器化应用的开发和部署提供了更灵活、更可靠的解决方案。
相关文章:

《Docker极简教程》--Docker卷和数据持久化--Docker卷的使用
一、基本操作 1.1 创建Docker卷 创建 Docker 卷是在 Docker 中管理持久化数据的重要步骤之一。通过 Docker 卷,可以将数据与容器解耦,实现数据的持久化存储,并且可以在容器之间共享数据。以下是创建 Docker 卷使用 docker volume create 命…...

【Logback】如何在项目中快速引入Logback日志?
目录 1、引入相关依赖或者 jar 包 2、使用logback日志 3、引入logback配置文件 4、打印logback内部状态信息 Logback 是 Java 社区中使用最广泛的日志框架之一。它是其前身 Log4j 的替代品。Logback 比所有现有的日志框架速度更快,占用空间更小,而且…...

【Linux从青铜到王者】 基础IO
本篇重点:文件描述符,重定向,缓冲区,磁盘结构,文件系统,inode理解文件的增删查改,查找一个文件为什么一定要有路径,动静态库,有的时候为什么找不到库,动态库的…...

C++之类作用域
目录 1、全局作用域 2、类作用域 2.1、设计模式之Pimpl 2.2、单例模式的自动释放 2.2.0、检测内存泄漏的工具valgrind 2.2.1、可以使用友元形式进行设计 2.2.2、内部类加静态数据成员形式 2.2.3、atexit方式进行 2.2.4、pthread_once形式 作用域可以分为类作用域、类名…...

SpringCloud Gateway网关 全局过滤器[AntPathMatcher 某些路径url禁止访问] 实现用户鉴权
前提:先保证Gateway网关项目 和 Nacos注册中心 等可以正常访问和调用,搭建方法可查看博文SpringCloud Gateway网关 项目创建 及 整合Nacos开发_spring gateway如何设置工程名称-CSDN博客 类似的全局鉴权方案,参考如下: SpringClo…...

ELK介绍以及搭建
基础环境 hostnamectl set-hostname els01 hostnamectl set-hostname els02 hostnamectl set-hostname els03 hostnamectl set-hostname kbased -i s/SELINUXenforcing/SELINUXdisabled/ /etc/selinux/config systemctl stop firewalld & systemctl disable firewalld# 安…...

Spring中的ApplicationContext.publishEvent
简单理解 其实就是监听处理。比如找工作平台上,雇主 employer 发布自己的雇佣条件,目的是平台中有符合条件的求职者时,及时向雇主推荐。求职者发布简历,当平台发现某个求职者比较符合条件,就触发被动,推荐…...

jackson、gson、fastjson和json-lib四种主流json解析框架对比
一、四种框架的介绍和对比 在Java中,Jackson、Gson、Fastjson和json-lib都是流行的JSON解析框架,它们各自有一些特点和优势。下面是对它们进行简要介绍和对比: 1.1 介绍 1) Jackson: Jackson是由FasterXML开发的一个高性能的J…...

已解决:IDEA中@Autowired自动注入MyBatis Mapper报红警告的几种解决方法
今天在使用 IDEA 使用 MyBatis 的时候遇到了这种情况: 可以看到 userMapper 下有个红色的波浪警告,虽然代码没有任何问题,能正常运行,但是这个红色警告在这里杵着确实让人很窝心。 于是我在网上找了找,最终明白了原因…...

在jar里限制指定的包名才可调用(白名单)。
1. 在jar包中定义一个接口,例如 用于检查传入的hash值是否匹配预设的值。 2. 在调用接口的地方,获取当前应用的hash值。 3. 将当前应用的hash值与预设的值进行比较,如果匹配,则允许调用接口;否则,拒绝调用。…...

python 提取PDF文字
使用pdfplumber,不能提取扫描的pdf和插入的图片。 import pdfplumberfile_path rD:\UserData\admindesktop\官方文档\1903_Mesh-Models-Overview_FINAL.pdf with pdfplumber.open(file_path) as pdf:page pdf.pages[0]print(page.extract_text()) # 所以文字prin…...

电气机械5G智能工厂数字孪生可视化平台,推进电气机械行业数字化转型
电气机械5G智能工厂数字孪生可视化平台,推进电气机械行业数字化转型。随着科技的不断发展,数字化转型已经成为各行各业发展的重要趋势。电气机械行业作为传统制造业的重要组成部分,也面临着数字化转型的挑战和机遇。为了更好地推进电气机械行…...

C# (WebApi)整合 Swagger
SpringBoot-整合Swagger_jboot整合swagger-CSDN博客 C# webapi 也可以整合Swagger webapi运行其实有个自带的HELP页面 但是如果觉得UI不好看,且没办法显示方法注释等不方便的操作,我们也可以整合Swagger 一、使用NuGet控制台安装Swagger 在菜单中选择…...

导入excel某些数值是0
目录 导入excel某些数值是0数据全部都是0原因解决 部分数据是0原因解决 导入excel某些数值是0 数据全部都是0 有一列“工单本月入库重量”全部的数据都是0 原因 展示的时候,展示的字段和内表需要展示的字段不一致,导致显示的是0。 解决 修改展示的字…...

wo-gradient-card是一款采用uniapp实现的透明辉光动画卡片
采用uniapp-vue3实现,透明辉光动画卡片,卡片内容包含标签、标题、副标题、图片 支持H5、微信小程序(其他小程序未测试过,可自行尝试) 可用于参考学习 可到插件市场下载尝试: https://ext.dcloud.net.cn/plu…...

Spark: a little summary
转眼写spark一年半了,从之前写机器学习组件、做olap到后面做图计算,一直都是用的spark,惭愧的是没太看过里面的源码。这篇文章的目的是总结一下Spark里面比较重要的point,重点部分会稍微看一下源代码,因为spark是跟cli…...

018—pandas 生成笛卡尔积排列组合合并多列字符串数据
思路: 本需求需要将给定的几列数据,生成一个排列组合形式的数据列,利用到 Pandas 多层索引生成的笛卡尔积的方法。 二、使用步骤 1.引入库 代码如下(示例): import pandas as pd2.读入数据 代码如下&…...

【算法与数据结构】链表、哈希表、栈和队列、二叉树(笔记二)
文章目录 四、链表理论五、哈希表理论五、栈和队列理论5.1 单调栈 六、二叉树理论6.1 树的定义6.2 二叉树的存储方式6.3 二叉树的遍历方式6.4 高度和深度 最近博主学习了算法与数据结构的一些视频,在这个文章做一些笔记和心得,本篇文章就写了一些基础算法…...

bugku3
前女友 md5 进去又是讴歌乱进的东西 源代码 看到code.txt,访问一下 <?php if(isset($_GET[v1]) && isset($_GET[v2]) && isset($_GET[v3])){$v1 $_GET[v1];$v2 $_GET[v2];$v3 $_GET[v3];if($v1 ! $v2 && md5($v1) md5($v2)){if(!strcmp($v3,…...

相机的白平衡
相机的白平衡是指相机根据拍摄环境的光源色温,调整图像中白色看起来应该是白色的功能。白平衡的设置对于确保图像中的颜色准确性非常重要,因为不同光源的色温会使白色看起来有不同的色调。 通常,相机提供了一些预设的白平衡模式,…...

刷题日记-Day2- Leedcode-977. 有序数组的平方,209. 长度最小的子数组,59. 螺旋矩阵 II-Python实现
刷题日记Day2 977 有序数组的平方209. 长度最小的子数组59. 螺旋矩阵 II 977 有序数组的平方 链接:https://leetcode.cn/problems/squares-of-a-sorted-array/description/ 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组…...

Linux命令-chcon命令(修改对象(文件)的安全上下文)
说明 chcon命令 是修改对象(文件)的安全上下文,比如:用户、角色、类型、安全级别。也就是将每个文件的安全环境变更至指定环境。使用 --reference 选项时,把指定文件的安全环境设置为与参考文件相同。chcon命令位于 /…...

【漏洞复现】大华DSS视频管理系统信息泄露漏洞
Nx01 产品简介 大华DSS数字监控系统是一个在通用安防视频监控系统基础上设计开发的系统,除了具有普通安防视频监控系统的实时监视、云台操作、录像回放、报警处理、设备治理等功能外,更注重用户使用的便利性。 Nx02 漏洞描述 大华DSS视频管理系统存在信…...

websocket了解下
websocket请求长啥样 GET /chat HTTP/1.1 Host: example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ Sec-WebSocket-Version: 13 啥是websocket websocket是http的一种,服务器可以主动向客户端推送信息,…...

docker install private registry 【docker 安装 registry 仅证书认证】
预备条件: 安装docker 我们设定镜像仓库域名为registry01.dev.com 配置/etc/hosts 192.168.23.51 registry01.dev.com安装 registry #!/bin/bashreg_ip$1 reg_n$2 reg_port$3if [ $# -eq 0 ]; thenecho "Usage: $0 [reg_ip] [registry_name]"echo &q…...

JavaWeb——004Maven SpringBootWeb入门
一、Maven 1、什么是maven? 2、Maven的作用是什么?(3种) 1.1、方便的依赖管理 依赖管理:有了Maven,我们就不用再手动导入Jar包了,我们只需要在配置文件当中,简单描述一下项目所需要…...

数据结构与算法-常用排序算法
一、常用排序说明 当涉及排序算法时,理解每个算法的工作原理、时间复杂度和空间复杂度是至关重要的。下面对常用排序算法进行详细说明: 1、冒泡排序(Bubble Sort): 工作原理:比较相邻的元素并交换&am…...

链表之“无头单向非循环链表”
目录 编辑 1.顺序表的问题及思考 2.链表 2.1链表的概念及结构 2.2无头单向非循环链表的实现 1.创建结构体 2.单链表打印 3.动态申请一个节点 3.单链表尾插 4.单链表头插 5.单链表尾删 6.单链表头删 7.单链表查找 8.单链表在pos位置之前插入x 9.单链表删除pos位…...

一休哥助手网页版如何使用
一休哥助手网页版可以使用GPT4提问了,具体操作流程如下: 1.登录网页版一休哥助手(首次打开页面时,初始化久一点,请耐心等一下) https://www.fudai.fun 2.登录后就可以使用GPT4了 3.你还可以自定义系统角色…...

个人博客系统测试
文章目录 一、项目介绍二、测试1. 功能测试2. 自动化测试(1)添加相关依赖(2)新建包并在报下创建测试类(3)亮点及难点 一、项目介绍 个人博客系统采用前后端分离的方法来实现,同时使用了数据库来…...