《Docker极简教程》--Docker卷和数据持久化--Docker卷的使用

一、基本操作

1.1 创建Docker卷

创建 Docker 卷是在 Docker 中管理持久化数据的重要步骤之一。通过 Docker 卷,可以将数据与容器解耦,实现数据的持久化存储,并且可以在容器之间共享数据。以下是创建 Docker 卷使用 docker volume create 命令创建卷

docker volume create my_volume

这将创建一个名为 my_volume 的 Docker 卷。你也可以在创建卷时指定其他选项,以下是常用参数:

  1. –name: 指定卷的名称。
  2. –driver: 指定卷的驱动程序。Docker 支持多种卷驱动程序,如 local、azure、efs 等。
  3. –opt: 为卷指定选项。这可以是一个键值对,用于设置特定驱动程序的选项。
  4. –label: 为卷添加标签。标签可以用于组织和识别卷。
  5. –mount: 指定挂载选项。可以使用此参数将卷挂载到容器中,并设置挂载的选项,如挂载路径等。
  6. –rm: 在容器停止时自动删除关联的卷。这个参数在创建临时卷时很有用。
  7. –read-only: 将卷挂载为只读。这可以确保容器只能读取卷中的数据,而无法对其进行写入操作。
  8. –volume-driver: 指定使用的卷驱动程序。与 --driver 参数类似,但只影响单个挂载点。
  9. –size: 指定卷的大小。对于某些存储后端,如本地存储驱动程序,可以设置卷的大小限制,默认单位为字节。

这些参数可以根据需求组合使用,以创建和管理 Docker 卷。它们使得可以根据具体应用程序的需求来定制卷的行为和特性,从而更好地满足应用程序的要求。

1.2 挂载Docker卷到容器

在 Docker 中,可以使用 -v--mount 选项将 Docker 卷挂载到容器中。下面分别介绍这两种方法:

  1. 使用 -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 是容器所基于的镜像。
  2. 使用 --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 命令。以下是一些常用的命令和操作:

  1. 列出所有 Docker 卷:

    docker volume ls
    

    这会列出所有当前系统中存在的 Docker 卷,包括名称、驱动程序和卷的大小等信息。

  2. 查看特定 Docker 卷的详细信息:

    docker volume inspect <volume_name>
    

    这会显示特定 Docker 卷的详细信息,包括卷的名称、驱动程序、挂载点等。

  3. 删除 Docker 卷:

    docker volume rm <volume_name>
    

    这会删除指定名称的 Docker 卷。请注意,只有当没有容器正在使用该卷时,才能成功删除。

  4. 删除未使用的 Docker 卷:

    docker volume prune
    

    这会删除当前系统中未被任何容器使用的所有 Docker 卷。

  5. 为 Docker 卷添加标签:

    docker volume label <volume_name> <label_key>=<label_value>
    

    这会为指定的 Docker 卷添加标签,标签可以用于组织和识别卷。

  6. 移除 Docker 卷的标签:

    docker volume label rm <volume_name> <label_key>
    

    这会移除指定 Docker 卷的特定标签。

通过这些命令,你可以方便地查看和管理 Docker 卷。这些操作使得可以有效地管理卷,清理不再需要的卷,并对卷进行标记以便于识别和组织。

二、数据持久化

2.1 数据卷容器

数据卷容器是一种特殊类型的容器,旨在存储和管理数据卷,以便其他容器可以共享和访问这些数据。数据卷容器提供了一种简单有效的方式,使得多个容器可以访问共享数据,同时也使得数据的管理更加方便。
以下是使用数据卷容器的一般步骤:

  1. 创建数据卷容器:
    首先,创建一个专门用于存储数据卷的容器。这个容器通常不需要运行任何应用程序,它只是用来存储数据。
    docker create -v /data --name data_container ubuntu
    
    这将创建一个名为 data_container 的容器,其中包含一个名为 /data 的卷,并使用了 ubuntu 镜像。
  2. 使用数据卷容器:
    现在,可以通过 --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_container1app_container2,它们都能够访问和共享 data_container 中的数据卷。

通过这种方式,可以实现数据的共享和持久化存储,同时也能够更灵活地管理数据。数据卷容器提供了一种简单而强大的机制,使得容器之间能够共享数据,而无需直接暴露它们的文件系统。

2.2 将主机目录挂载到容器

将主机目录挂载到容器是一种常见的操作,可以实现容器与主机之间的数据共享。这种挂载方式特别适合需要将主机上的数据或配置文件传递给容器的情况。以下是如何将主机目录挂载到容器的基本步骤:

  1. 确定要挂载的主机目录:
    在主机上选择一个目录,作为需要共享给容器的数据或配置文件的存储位置。例如,假设要将主机上的 /host/data 目录挂载到容器。

  2. 运行容器时进行挂载:
    使用 -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 目录。

  3. 访问挂载的主机目录:
    在容器内部,可以像访问普通文件一样访问挂载的主机目录,容器内部的操作对主机上的目录和文件具有实时影响。

通过这些步骤,可以轻松将主机目录挂载到容器中,实现容器与主机之间的数据共享和交互。这对于需要在容器内访问主机上的数据或配置文件的场景非常有用。

2.3 数据卷的备份和恢复

备份和恢复 Docker 数据卷是确保数据持久性和安全性的重要方面。下面是备份和恢复 Docker 数据卷的基本步骤:

  1. 备份 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
      
      这个命令将备份文件拷贝到宿主机上的指定目录中。
  2. 恢复 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 数据库为例:

  1. 创建 MySQL 数据卷容器:
    docker volume create mysql_data
    
    这将创建一个名为 mysql_data 的 Docker 数据卷,用于存储 MySQL 数据。
  2. 启动 MySQL 容器并挂载数据卷:
    docker run -d --name mysql_db -e MYSQL_ROOT_PASSWORD=my-secret-pw -v mysql_data:/var/lib/mysql mysql:latest
    
    这会启动一个 MySQL 容器,将 mysql_data 数据卷挂载到容器的 /var/lib/mysql 目录中,并设置 MySQL 的 root 密码为 my-secret-pw
  3. 连接到 MySQL 容器并创建数据库:
    docker exec -it mysql_db mysql -uroot -pmy-secret-pw
    
    这会连接到 MySQL 容器,并使用指定的 root 密码登录 MySQL。然后可以在 MySQL 中执行 SQL 命令来创建数据库、用户等。
  4. 停止和重新启动容器:
    容器中的数据库数据现在将存储在 mysql_data 数据卷中。当需要停止或重新启动容器时,数据将保留在数据卷中,并且可以在容器重新启动后立即访问。

通过这个例子,可以看到如何使用 Docker 数据卷来实现 MySQL 数据库的持久化存储。无论容器如何启动、停止或重新启动,数据库数据都会被保存在数据卷中,确保数据的持久性和安全性。

3.2 日志持久化

在 Docker 中,持久化日志是保证日志数据不丢失并能够在容器重新启动后继续访问的重要方面。以下是一个使用 Docker 数据卷持久化日志的示例,以 Nginx 服务器为例:

  1. 创建 Nginx 日志目录容器:
    首先,创建一个用于存储 Nginx 日志的数据卷容器。
    docker volume create nginx_logs
    
  2. 启动 Nginx 容器并挂载日志目录:
    使用 -v--mount 选项,将 Nginx 日志目录挂载到数据卷容器中。
    docker run -d --name nginx_server -v nginx_logs:/var/log/nginx -p 80:80 nginx:latest
    
    这会启动一个 Nginx 容器,并将 nginx_logs 数据卷挂载到容器的 /var/log/nginx 目录中,同时将容器的 80 端口映射到宿主机的 80 端口。
  3. 访问 Nginx 日志:
    可以通过进入数据卷容器或者直接在宿主机上查看数据卷的方式来访问 Nginx 的日志。
    docker exec -it nginx_server /bin/bash
    
    进入容器后,可以在 /var/log/nginx 目录下找到 Nginx 的日志文件。
  4. 持久化日志数据:
    当 Nginx 容器启动和运行时,所有的日志数据都将存储在 nginx_logs 数据卷中。即使容器被停止或重新启动,日志数据仍然保持在数据卷中,可以在容器重新启动后继续访问。

通过这个例子,可以看到如何使用 Docker 数据卷来实现 Nginx 服务器日志的持久化存储。这样可以确保日志数据不会丢失,并且可以在容器重新启动后继续访问和分析。

3.3 共享数据卷

在 Docker 中,可以使用数据卷来实现容器之间的数据共享。以下是一个示例,演示如何在两个容器之间共享数据卷:

  1. 创建数据卷容器并挂载数据卷:
    首先,创建一个用于存储共享数据的数据卷容器。
    docker volume create shared_data
    
  2. 在第一个容器中创建共享数据:
    启动一个容器,并将数据写入到共享数据卷中。
    docker run -it --name container1 -v shared_data:/data ubuntu
    
    在容器中执行一些操作,比如创建文件或者写入数据到 /data 目录中。
  3. 在第二个容器中访问共享数据:
    启动另一个容器,并挂载同一个共享数据卷。
    docker run -it --name container2 -v shared_data:/data ubuntu
    
    在容器中可以访问到之前创建的共享数据,数据将与第一个容器中的数据相同。
  4. 在两个容器之间共享数据:
    现在,两个容器都可以访问共享数据卷 /data 中的数据。任何一个容器对共享数据的修改都会立即反映到另一个容器中。

通过这个示例,可以看到如何使用 Docker 数据卷来在容器之间共享数据。这种方法非常灵活,使得容器之间可以轻松地共享文件和数据,而无需复制或传输大量数据。

四、总结

本文介绍了 Docker 数据卷的基本操作、数据持久化以及实际应用场景。在基本操作部分,详细介绍了如何创建 Docker 卷、挂载卷到容器以及查看和管理卷的方法,并列举了常用的参数和选项。在数据持久化部分,以数据库持久化和日志持久化为例,说明了如何使用 Docker 数据卷来保证数据持久性和安全性。最后,通过共享数据卷的示例展示了容器之间如何共享数据。这些技术和实践使得 Docker 在实际应用中能够更好地满足持久化存储和数据共享的需求,为容器化应用的开发和部署提供了更灵活、更可靠的解决方案。

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

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

相关文章

Go 如何按行读取(大)文件?尝试 bufio 包提供的几种方式

嗨&#xff0c;大家好&#xff01;我是波罗学。本文是系列文章 Go 技巧第十七篇&#xff0c;系列文章查看&#xff1a;Go 语言技巧。 本文将介绍 Go 如何按行读取文件&#xff0c;基于此会逐步延伸到如何按块读取文件。 引言 我们将要介绍的按行读取文件的方式其实是非常适合…

C# 1.消息队列MQ使用场景--图文解析

为什么使用消息队列MQ&#xff08;Message Queue&#xff09;&#xff1f; 消息队列有什么优点和缺点&#xff1f; Kafka(大数据日志采集)、ActiveMQ(最早的MQ--目前使用较少)、RabbitMQ(开源&#xff0c;中小型企业使用足够)、RocketMQ(阿里开发&#xff0c;大型企业适用) 都…

125 Linux C++ 系统编程4 Linux 静态库制作,动态库制作,静态库和动态库对比。静态库运行时找不到库的bug fix

一 静态库 和动态库 对比 静态库的原理&#xff1a;假设我们有一个 静态库&#xff0c;大小为500M&#xff0c;这个静态库实现了一些打牌的逻辑算法&#xff0c;提供了一堆API&#xff0c;让开发者 可以轻松的实现 54张扑克牌的随机发牌&#xff0c;指定发牌等功能。 我们写了…

Python入门学习——基础语法

一、Python解释器 1. Python解释器的作用是&#xff1a; 将Python代码翻译成计算机认识的O和1并提交计算机执行在解释器环境内可以一行行的执行我们输入的代码也可以使用解释器程序&#xff0c;去执行".py"代码文件 2. Python解释器程序在&#xff1a; <Python…

google浏览器chrome无法访问localhost等本地虚拟域名的解决方法

场景一&#xff1a; 谷歌浏览器访问出现&#xff1a;forbbiden 403 问题&#xff0c;或者直接跳转到正式域名(非本地虚拟域名) 访问本地的虚拟域名http://www.hd.com/phpinfo.php?p1发生了302 条状 火狐浏览器正常访问; 解决方法&#xff1a; 方法1&#xff1a;在谷歌浏览器…

Linux的ACL权限以及特殊位和隐藏属性

前言&#xff1a; ACL是什么&#xff1f; ACL&#xff08;Access Control List&#xff09;是一种权限控制机制&#xff0c;用于在Linux系统中对文件和目录进行细粒度的访问控制。传统的Linux权限控制机制基于所有者、所属组和其他用户的三个权限类别&#xff08;读、写、执行…

转运机器人,AGV底盘小车:打造高效、精准的汽车电子生产线

为了满足日益增长的市场需求&#xff0c;保持行业领先地位&#xff0c;某汽车行业电子产品企业引入富唯智能AMR智能搬运机器人及其智能物流解决方案&#xff0c;采用自动化运输措施优化生产节拍和搬运效率&#xff0c;企业生产效率得到显著提升。 项目背景&#xff1a; 1、工厂…

milvus Delete api写s3的流程

Delete api写s3的流程 milvus版本:v2.3.2 整体架构: Delete 的数据流向 delete相关配置 dataNode:segment:insertBufSize: 16777216 # Max buffer size to flush for a single segment.deleteBufBytes: 67108864 # Max buffer size to flush del for a single channelsyncPe…

汽修专用产品---选型介绍 汽修示波器 汽车示波器 汽车电子 汽修波形 汽车传感器波形 汽车检测

为了满足汽车电子用户的测量需求&#xff0c;我司特推出汽修专用版示波器&#xff0c;一键测量&#xff0c;轻松找出汽车问题。 LOTO各种型号的示波器其实都可以用作汽车传感器信号波形的检测。汽修应用中&#xff0c;工程师对示波器的性能要求对于LOTO产品来说不算高。 在我们…

《TCP/IP详解 卷一》第6章 DHCP

目录 6.1 引言 6.2 DHCP 6.2.1 地址池和租用 6.2.2 DHCP和BOOTP消息格式 6.2.3 DHCP和BOOTP选项 6.2.4 DHCP协议操作 6.2.5 DHCPv6 6.2.6 DCHP中继 6.2.7 DHCP认证 6.2.8 重新配置扩展 6.2.9 快速确认 6.2.10 位置信息&#xff08;LCI和LoST&#xff09; 6.2.11 移…

Unity Shader ASE基础效果思路与代码(二):边缘光、扰动火焰

Unity Shader ASE基础效果思路与代码(二)&#xff1a;边缘光、扰动火焰 这里写目录标题 Unity Shader ASE基础效果思路与代码(二)&#xff1a;边缘光、扰动火焰边缘光效果展示&#xff1a;代码与思路&#xff1a; 扰动火焰效果展示&#xff1a;代码与思路&#xff1a; 边缘光 …

snmp协议开通教程

目录 一、什么是snmp协议&#xff1f; 二、snmp协议可以用来干什么&#xff1f; 三、snmp协议的开通 1、snmpv2协议开通 2、snmpv3协议开通 一、什么是snmp协议&#xff1f; SNMP&#xff08;Simple Network Management Protocol&#xff09;是一种用于网络管理的标准协议&a…

什么是异常处理?解释 C++ 中的异常处理机制

什么是异常处理&#xff1f;解释 C 中的异常处理机制 异常处理是一种编程范式&#xff0c;用于处理程序执行过程中可能发生的异常情况。异常是指在程序执行过程中出现的不正常情况&#xff0c;例如除零、内存分配失败、文件不存在等。异常处理机制允许程序在遇到异常时&#x…

解释 C++11 中引入的右值引用(Rvalue References)

解释 C11 中引入的右值引用&#xff08;Rvalue References&#xff09; 在 C11 中引入的右值引用&#xff08;Rvalue References&#xff09;是一种新的引用类型&#xff0c;它与传统的左值引用&#xff08;lvalue references&#xff09;有所不同。右值引用主要用于支持移动语…

STM32物联网(封装AT指令进行TCP连接及数据的接收和发送)

文章目录 前言一、AT指令函数封装1.向ESP8266发送数据函数2.设置ESP8266工作模式3.连接WIFI函数4.查询IP地址5.连接TCP服务器6.发送数据到TCP服务器7.接收并解析来自TCP服务器的数据8.关闭TCP服务器 二、代码测试总结 前言 本篇文章将继续带大家学习STM32物联网&#xff0c;那…

Vue 2.0 中的 Vuex Store 状态管理器核心概念和组成部分

Vue 2.0 中的 Vuex Store 状态管理器核心概念和组成部分 State&#xff08;状态&#xff09;&#xff1a; Vuex Store 的核心就是集中式存储应用的所有组件的状态。它是一个单一状态树&#xff0c;所有的组件都从这个状态树中读取数据并可以响应状态的变化。 const state {c…

Ubuntu20.04 查看系统版本号

目录 uname -auname -vlsb_release -acat /etc/issuecat /proc/version uname -a 查看系统发行版本号和操作系统版本 uname -v 查看版本号 lsb_release -a 查看发行版本信息 cat /etc/issue 查看系统版本 cat /proc/version 查看内核的版本号

计算机网络面经_体系结构一文说清

编辑&#xff1a;平平无奇的羊 目录 基础 1. 计算机网络结构体系 三种模型之间的区别&#xff1a; 如何背诵&#xff1a; 进阶 OSI七层模型&#xff1a; TCP/IP四层模型&#xff1a; TCP/IP五层模型 总结 字节实习生为大家带来的是计算机网络面经系列博文&#xff0c;由浅…

分散的产品开发团队

分散的产品开发团队指的是各个团队或成员在地理位置上分布在不同地方&#xff0c;通过互联网和现代通讯技术进行协作和沟通&#xff0c;以共同完成产品开发任务的团队模式。 这种团队模式的优势在于可以充分利用各地的人才资源&#xff0c;降低团队的管理和协作成本&#xff0…

SpringBoot和SpringCloud的区别,使用微服务的好处和缺点

SpringBoot是一个用于快速开发单个Spring应用程序的框架&#xff0c;通过提供默认配置和约定大于配置的方式&#xff0c;快速搭建基于Spring的应用。让程序员更专注于业务逻辑的编写&#xff0c;不需要过多关注配置细节。可以看成是一种快速搭建房子的工具包&#xff0c;不用从…