Docker存储

前提条件

  1. 拥有docker环境,可参考:Docker的安装
  2. 掌握容器的使用,可参考:Docker容器的使用
  3. 掌握镜像的使用,可参考:Docker镜像的使用

Docker存储的问题

容器是隔离环境,容器内程序的文件、配置、运行时产生的数据都存储在容器内部,思考如下问题:

  • 如果要升级MySQL版本,需要销毁旧容器,那么数据岂不是跟着被销毁了?

  • MySQL、Nginx容器运行后,如果要修改其中的某些配置该怎么办?需要先进入容器内部才能再修改,不方便。

Docker存储概述

默认情况下,在容器内部创建的所有文件都存储在可写的容器层上。这意味着:

  • 当容器不再存在时,数据不会持久化,并且如果其他进程需要这些数据,可能很难从容器中取出数据。

  • 容器的可写层与容器正在运行的主机紧密耦合,无法轻易地将数据移动到其他地方。

  • 写入容器的可写层需要一个存储驱动程序来管理文件系统。该存储驱动程序使用 Linux 内核提供联合文件系统。与直接写入主机文件系统的数据卷相比,这种额外的抽象会降低性能。

Docker解决存储问题的方式:

Docker 为容器在主机上存储文件提供了两种选择,以便在容器停止后文件仍然持久化:卷(volume)和绑定挂载(bind mount)

对于敏感数据不希望被持久化的情况下,Docker 还支持容器在主机的内存中存储文件,这样的文件不会被持久化,tmpfs 挂载(tmpfs mount)用于将文件存储在主机的系统内存中。

一种直观理解卷、绑定挂载和 tmpfs 挂载之间差异的简单方法是数据在 Docker 主机上的存储位置。挂载类型及其在 Docker 主机上的存储位置,如下图所示:

  • 绑定挂载可以存储在主机系统的任何位置,甚至可能是重要的系统文件或目录。Docker 主机上的非 Docker 进程或 Docker 容器可以随时修改它们。

  • 卷存储在主机文件系统中由 Docker 管理的一部分(在 Linux 上为 /var/lib/docker/volumes/)。非 Docker 进程不应修改文件系统的这一部分。卷是在 Docker 中持久化数据的最佳方式。

  • tmpfs 挂载仅存储在主机系统的内存中,并且永远不会写入主机系统的文件系统。

绑定挂载和卷都可以使用 -v--volume 标志挂载到容器中,但每种的语法略有不同。对于 tmpfs 挂载,可以使用 --tmpfs 标志。对于容器和服务,建议使用 --mount 标志来进行绑定挂载、卷或 tmpfs 挂载,因为其语法更清晰。

绑定挂载

绑定挂载就是将容器内部的目录/文件与宿主机的任意目录进行映射,主机目录由用户决定,目录不存在将系统自动创建。

案例:实现nginx的html目录绑定挂载

#运行容器
[root@localhost ~]# docker run -d --name my-nginx -p 90:80 -v /root/html:/usr/share/nginx/html nginx
​
#挂载目录会自动创建
[root@localhost ~]# ls html
​
#访问页面,403错误,因为挂载目录/root/html下没有任何内容,所以403
[root@localhost ~]# curl localhost:90
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.21.5</center>
</body>
</html>
​
#添加index.html
[root@localhost ~]# echo "hello docker" > html/index.html
​
#再次访问
[root@localhost ~]# curl localhost:90
hello docker
​

从案例中看到,使用-v实现绑定挂载,将主机的/root/html与容器中的/usr/share/nginx/html做映射。当主机/root/html目录没有内容时,容器内部的/usr/share/nginx/html也没有内容。当主机目录内容改变,容器内部目录内容也跟着改变。

什么是数据卷

卷由 Docker 创建和管理。你可以使用 docker volume create 命令显式地创建一个卷,或者在容器或服务创建期间,Docker 可以创建一个卷。

当创建一个卷时,它存储在 Docker 主机上的一个目录中,目录由Docker决定。当你将卷挂载到容器中时,这个目录会被挂载到容器中。这与绑定挂载的工作方式类似,不同之处在于卷由 Docker 管理并且与主机的核心功能隔离。

一个给定的卷可以同时挂载到多个容器中。当没有正在运行的容器使用卷时,该卷仍然可供 Docker 使用,并且不会自动删除。你可以使用 docker volume prune 来删除未使用的卷。

当你挂载一个卷时,它可以是命名的或匿名的。匿名卷会被赋予一个随机名称,在给定的 Docker 主机中保证是唯一的。就像命名卷一样,即使你删除了使用它们的容器,匿名卷也会持久化,除非你在创建容器时使用 --rm 标志,在这种情况下,匿名卷将被销毁。如果你依次创建多个使用匿名卷的容器,每个容器都会创建自己的卷。匿名卷不会在容器之间自动重用或共享。要在两个或多个容器之间共享一个匿名卷,必须使用随机卷 ID 挂载匿名卷。卷还支持使用卷驱动程序,这使你可以将数据存储在远程主机或云提供商等地方。

数据卷命令

数据卷的相关命令有:

命令说明
docker volume create创建数据卷
docker volume ls查看所有数据卷
docker volume rm删除指定数据卷
docker volume inspect查看某个数据卷的详情
docker volume prune清除数据卷

注意:容器的卷挂载要在创建容器时配置,对于创建好的容器,是不能设置数据卷的。而且 创建容器的过程中,数据卷会自动创建 。

案例1:nginx html目录的卷挂载

# 1.首先创建容器并指定数据卷,注意通过 -v 参数来指定数据卷
[root@localhost ~]# docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
​
# 2.然后查看数据卷
[root@localhost ~]# docker volume ls
DRIVER    VOLUME NAME
local     html
​
# 3.查看数据卷详情
[root@localhost ~]# docker volume inspect html
[{"CreatedAt": "2024-09-28T00:07:39+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/html/_data","Name": "html","Options": null,"Scope": "local"}
]
​
# 4.查看/var/lib/docker/volumes/html/_data目录
[root@localhost ~]# ll /var/lib/docker/volumes/html/_data
total 8
-rw-r--r-- 1 root root 497 Dec 28  2021 50x.html
-rw-r--r-- 1 root root 615 Dec 28  2021 index.html
​
# 5.访问页面
[root@localhost ~]# curl localhost
有默认内容
...
<title>Welcome to nginx!</title>
...
​
# 6.进入该目录,并随意修改index.html内容
[root@localhost ~]# cd /var/lib/docker/volumes/html/_data/
​
[root@localhost _data]# ls
50x.html  index.html
​
直接查看index.html
[root@localhost _data]# cat index.html 
...
<title>Welcome to nginx!</title>
...
​
修改index.html内容
[root@localhost _data]# echo "hello world" > index.html 
​
# 7.打开页面,查看效果
[root@localhost _data]# curl localhost
hello world
​
# 8.进入容器内部,查看/usr/share/nginx/html目录内的文件是否变化
[root@localhost _data]# docker exec -it nginx bash
root@6a5ddf625373:/# cat /usr/share/nginx/html/index.html 
hello world
​

看到绑定挂载和卷挂载的区别在于:

  • 绑定挂载:目录是绝对路径或相对路径(以 /./开头),目录挂载的目录不存在会自动创建,不会把容器里面的文件映射到挂载目录,以主机目录为准。

  • 卷挂载:直接以卷名(目录)名字开头,卷和目录不存在也会自动创建,通过 docker volume ls查看卷,通过 docker volume inspect查看目录,把容器里面的文件复制到映射的目录。

案例2:nginx配置的卷挂载

显然启动ngin需要用到nginx.conf内容,所以不能使用绑定挂载(除非主机目录已经准备好相关配置文件),而是使用卷挂载方式。

查看nginx容器内部的配置,如下

进入nginx容器内部
[root@localhost _data]# docker exec -it nginx bash
​
查看配置目录
root@6a5ddf625373:/# ls /etc/nginx/
conf.d  fastcgi_params  mime.types  modules  nginx.conf  scgi_params  uwsgi_params
​
查看nginx.conf配置内容
root@6a5ddf625373:/# cat /etc/nginx/nginx.conf 
​
user  nginx;
worker_processes  auto;
​
error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;
​
​
events {worker_connections  1024;
}
​
​
http {include       /etc/nginx/mime.types;default_type  application/octet-stream;
​log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';
​access_log  /var/log/nginx/access.log  main;
​sendfile        on;#tcp_nopush     on;
​keepalive_timeout  65;
​#gzip  on;
​include /etc/nginx/conf.d/*.conf;
}
​

再启动一个容器进行卷映射

# 启动容器,进行html和ngconf卷映射
[root@localhost ~]# docker run -d --name nginx1 -p 81:80 -v html:/usr/share/nginx/html -v ngconf:/etc/nginx nginx
​
# 访问页面,因为此前进行卷映射修改了html内容index.html,所以看到此前html卷映射的内容
[root@localhost ~]# curl localhost:81
hello world
​
# 查看卷
[root@localhost ~]# docker volume ls
DRIVER    VOLUME NAME
local     html
local     ngconf
​
# 查看卷信息
[root@localhost ~]# docker volume inspect ngconf
[{"CreatedAt": "2024-09-28T00:51:26+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/ngconf/_data","Name": "ngconf","Options": null,"Scope": "local"}
]
​
# 进入ngconf卷,发现存在相关配置文件,说明卷挂载可以将容器内部的配置映射出来。
[root@localhost ~]# cd /var/lib/docker/volumes/ngconf/_data
[root@localhost _data]# ls
conf.d  fastcgi_params  mime.types  modules  nginx.conf  scgi_params  uwsgi_params
​
# 在宿主机修改配置内容,在第一行添加注释内容 # hhh
[root@localhost _data]# vi nginx.conf
# hhh
...
​
# 查看容器内部的nginx.conf,配置内容也改变了
[root@localhost _data]# docker exec -it nginx1 bash
root@88c3de4ddc3e:/# cat /etc/nginx/nginx.conf 
# hhh
...
​

tmpfs

tmpfs 挂载,将数据放在内存中,不会在磁盘上持久化(无论是在 Docker 主机上还是在容器内都不会持久化),它可以在容器的生命周期内被容器使用。用于存储非持久化状态或敏感信息。例如,在内部,Swarm 服务使用 tmpfs 挂载将机密信息挂载到服务的容器中。

# 使用tmpfs挂载:将容器内部的/tmp/container_tmp_data目录挂载到主机内存中
[root@localhost ~]# docker run -it --tmpfs /tmp/container_tmp_data busybox sh
/ # echo "This is a test" > /tmp/container_tmp_data/test.txt
/ # cat /tmp/container_tmp_data/test.txt
This is a test
/ # exit
[root@localhost ~]#
​
# 查看运行的容器,说明容器的不再运行,容器的本次生命周期已经结束,tmpfs挂载的内容在内存中应该被释放,挂载的内容不会持久化存储在容器中。
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
​
# 查看所有容器
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS                      PORTS     NAMES
8229d76fc9fd   busybox   "sh"      47 seconds ago   Exited (0) 13 seconds ago             relaxed_gould
​
# 再次进入到容器
[root@localhost ~]# docker exec -it 822 sh
​
# 查看容器内部的数据,发现容器内部的container_tmp_data目录是空的,说明数据不持久化到容器内部
/ # ls /tmp/
container_tmp_data
/ # ls /tmp/container_tmp_data/
/ # cat /tmp/container_tmp_data/test.txt
cat: can't open '/tmp/container_tmp_data/test.txt': No such file or directory
/ # exit
[root@localhost ~]# 
​
# 查看宿主机也没有数据,说明数据也不持久化到主机
[root@localhost ~]# ls /tmp/ | grep con
[root@localhost ~]#

完成!enjoy it!

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

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

相关文章

自动发现-实现运维管理自动化

nVisual-Discovery是一款自动化工具软件&#xff0c;通过多种自动发现技术&#xff0c;协助运维管理人员快速建立可视化的网络文档&#xff0c;提升网络管理的效率与准确性。 01 IP扫描发现 当我们新接手一个网络运维项目&#xff0c;通常缺乏精准的网络文档数据&#xff0c;…

vue3+ts实时播放视频,视频分屏

使用vue3以及播放视频组件Jessibuca Jessibuca地址 使用循环个数来实现分屏 效果图&#xff0c;四屏 九屏 dom代码 <div class"icon"><div class"icon-box"><span class"text">分屏&#xff1a;</span><el-icon …

RHCSA笔记三

第二章 linux中执行命令 命令格式 命令分为两类 内置命令&#xff1a;由 shell 程序自带的命令 外部命令&#xff1a;有独立的可执行程序文件&#xff0c;文件名即命令名 格式 主命令 参数 操作对象 # 注意&#xff1a; 下面是对于命令的语法的一些符号的说明&#xff1…

爬虫结合项目实战

由于本人是大数据专业&#xff0c;所以准备的是使用pycharm工具进行爬虫爬取数据&#xff0c;然后实现一个可视化大屏 参考项目&#xff1a; 1.医院大数据可视化最后展示 2. 大数据分析可视化系统展示 代码包&#xff1a;

【js逆向专题】12.RPC技术

目录 一. websocket1. 什么是websocket2. websocket的原理3. websocket实现方式1. 客户端2.服务端3. 实际案例1. 案例目标2. 解析思路 二. RPC1. RPC 简介2.Sekiro-RPC1. 使用方法1. 执行方式2.客户端环境3.使用参数说明 2. 测试使用1. 前端代码2. SK API3.python调用代码 三.项…

LabVIEW伺服压机是如何实现压力位移的精度?

LabVIEW伺服压机通过精确的压力和位移控制&#xff0c;实现了高精度的压装操作。为了达到这种精度&#xff0c;系统通常依赖于多个硬件和软件模块的协同工作&#xff0c;包括伺服电机、压力传感器、位移传感器以及LabVIEW的实时控制和数据处理功能。以下是LabVIEW伺服压机如何实…

论文阅读与写作入门

文章目录 1.阅读第一篇论文(1)论文结构(2)目标 2.使用GPT辅助论文的阅读与写作3.专有名词(1)架构(2)网络(3)机器学习 4.文献翻译软件5.从哪里下载文献&#xff1f;6.如何判断(你自己的)研究工作的价值or贡献【论文精读李沐】7.经典论文(1)AlexNet 2012(2)FCN 全卷积 2014(3)Res…

【java面向对象编程】第一弹----类与对象的理解及类和对象的内存分配机制

一、类与对象 1.1类与对象的理解 &#xff08;1&#xff09;类就是数据类型&#xff0c;比如String类 &#xff08;2&#xff09;对象就是一个具体的实例 1.1.2类和对象的区别与联系 1) 类是抽象的&#xff0c;概念的&#xff0c;代表一类事物,比如人类,猫类.., 即它是数据…

异地组网最简单的方法

异地组网的方法多种多样&#xff0c;每种方法都有其特定的优缺点和适用场景&#xff0c;本期梳理一些相对简单且常用的异地组网方法&#xff0c;开始~ 一、使用硬件路由器的 VPN 功能 前提条件 你需要有支持 VPN 功能的路由器&#xff0c;如华硕、中兴等品牌。这些路由器在设置…

Newstar_week1_week2_wp

week1 wp crypto 一眼秒了 n费马分解再rsa flag&#xff1a; import libnum import gmpy2 from Crypto.Util.number import * p 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297…

「C/C++」C++17 之 std::variant 安全的联合体(变体)

#1024程序员节&#xff5c;征文# ✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计…

vue2 el-select赋值无效(无法选中)

背景&#xff1a;点击添加明细时&#xff0c;el-table会新增一条数据&#xff0c;其中&#xff0c;存货原申购用途 会根据 费用承担事业部 下拉框的值改变而改变&#xff0c;所以每次费用承担事业部发生变化时&#xff0c;都需要清空存货原申购用途的值 最开始是直接这样写的&a…

基于Java(SSM框架)+MySQL开发的小型英语学习网站

一、需求分析 英语已经越来越凸显其重要性。大学生一般都需要考CET-4或者CET-6&#xff0c;对于程序员&#xff0c;如果没有扎实的英语基础&#xff0c;看有些API文档也比较费力。生活中处处存在英语&#xff0c;也越来越体现英语的重要性&#xff0c;如何高效学习英语成了关键…

Openlayers高级交互(7/20):点击某点弹出窗口,自动播放视频

在使用 OpenLayers 构建 WebGIS 应用程序时,如果你想在地图上嵌入视频,通常的做法是将视频作为覆盖层(Overlay)添加到地图上。这里是一个示例,点击某点弹出窗口,自动播放视频。 效果图 专栏名称内容介绍Openlayers基础实战 (72篇)专栏提供73篇文章,为小白群体提供基础…

Vxe UI vue vxe-table 虚拟树表格的使用,流畅的渲染万级数据树结构表格

Vxe UI vue vxe-table 虚拟树表格的使用&#xff0c;流畅的渲染万级数据树结构表格 代码 普通树表格&#xff0c;一般存数据库里都是平级数据&#xff0c;vxe-table 的树渲染这就非常友好了&#xff0c;只有带有父子id关联的数组&#xff0c;就可以自动渲染树表格。 <te…

用 Vue 打造高效 Gherkin 自动化测试脚本编写工具

之前曾撰写过一篇有关运用 Pytest - BDD 框架开展自动化测试的文章。行为驱动开发&#xff08;BDD&#xff09;因着重于以业务需求和用户行为作为导向来编写测试脚本&#xff0c;故而广受关注。Gherkin 作为 BDD 中常用的语言&#xff0c;用于描述测试场景与步骤&#xff0c;具…

C#学习笔记(五)

C#学习笔记&#xff08;五&#xff09; 第 三 章 基本语句以及语法一、控制台的基本语句使用1. 方法重载2. 输入输出3.字符串格式化 二、赋值运算符、算数运算符、比较运算符三、数据类型转换常用方法使用、比较和选择1. 自动类型转换(隐式转换)2. 强制类型转换2.1 数值类型之间…

k8s-service详解

Service介绍 在kubernetes中&#xff0c;pod是应用程序的载体&#xff0c;我们可以通过pod的ip来访问应用程序&#xff0c;但是pod的ip地址不是固定的&#xff0c;这也就意味着不方便直接采用pod的ip对服务进行访问。 为了解决这个问题&#xff0c;kubernetes提供了Service资源…

COVON全意卫生巾,轻薄透气,绵柔速干,马来西亚热销中

随着女性健康意识的提高&#xff0c;卫生巾作为女性日常生活中的必需品&#xff0c;其品质和舒适度越来越受到关注。今天&#xff0c;我们要为大家介绍一款来自马来西亚热销的卫生巾——COVON全意卫生巾&#xff0c;以其轻薄透气、绵柔速干的特点&#xff0c;赢得了广大女性的喜…

故障诊断 | CNN-GRU卷积神经网络-门控循环单元组合模型的故障诊断(Matlab)

效果一览 文章概述 故障诊断 | CNN-GRU卷积神经网络-门控循环单元组合模型的故障诊断(Matlab) 源码设计 %% CNN-GRU多特征分类预测