惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
L
Lohrmann on Cybersecurity
aimingoo的专栏
aimingoo的专栏
V
V2EX
S
Security Affairs
T
Threatpost
C
CXSECURITY Database RSS Feed - CXSecurity.com
IT之家
IT之家
J
Java Code Geeks
The Register - Security
The Register - Security
U
Unit 42
C
CERT Recently Published Vulnerability Notes
月光博客
月光博客
A
About on SuperTechFans
H
Hackread – Cybersecurity News, Data Breaches, AI and More
T
The Blog of Author Tim Ferriss
Cisco Talos Blog
Cisco Talos Blog
Project Zero
Project Zero
S
Schneier on Security
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
D
DataBreaches.Net
博客园 - 司徒正美
V
Vulnerabilities – Threatpost
T
Tor Project blog
Security Latest
Security Latest
T
The Exploit Database - CXSecurity.com
T
Threat Research - Cisco Blogs
Scott Helme
Scott Helme
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
M
MIT News - Artificial intelligence
云风的 BLOG
云风的 BLOG
小众软件
小众软件
L
LangChain Blog
Attack and Defense Labs
Attack and Defense Labs
Recent Commits to openclaw:main
Recent Commits to openclaw:main
P
Palo Alto Networks Blog
A
Arctic Wolf
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
C
Cyber Attacks, Cyber Crime and Cyber Security
博客园 - 叶小钗
D
Darknet – Hacking Tools, Hacker News & Cyber Security
L
LINUX DO - 最新话题
MongoDB | Blog
MongoDB | Blog
Webroot Blog
Webroot Blog
H
Hacker News: Front Page
Know Your Adversary
Know Your Adversary
Spread Privacy
Spread Privacy
AWS News Blog
AWS News Blog
Engineering at Meta
Engineering at Meta

lvbibir's Blog

shell | 磁盘空间分析脚本 Linux cat 和 tee 命令写入文件 python | 使用 uv 管理你的 python 环境 Claude Code 完整配置指南 windows | mihomo 内核独立部署指南 linux | 磁盘扩容 wsl | 释放长久运行占用的磁盘空间 mysql | 线程上限问题处理 麒麟 7.6 安装谷歌 OTP 认证模块 suse 12sp5 升级 openssh 及 openssl suse 12sp5 部署 mysql 5.7 《谁的青春不迷茫》 docker | centos7 部署 docker vim | 基础配置和使用 windows | rime 输入法 & 雾凇方案 shell | sshpass 批量传输文件及执行命令 wsl | 原生 linux 方式安装 docker nodejs | fnm + pnpm 开发环境配置 wsl | 安装配置 miniconda 虚拟环境 wsl | 自动更新系统代理 wsl | bashrc 环境变量不正确加载的处理方法 wsl | win10 安装 wsl2 troubleshooting | ssh 成功但是 scp 失败 linux | 常用命令总结 docker 部署 piclist shell | 检测网站存活并自动钉钉告警 Zabbix | 监控端口连通性并自动追踪 TCP 路由 windows | 自定义开机快速启动项 windows | miniconda 配置 python 虚拟环境 Zabbix | 监控主机到指定 ip 的流量大小 shell | centos 初始化 loki (二) 部署 loki (一) 简介 prometheus (六) Alertmanager prometheus (五) 记录规则与告警规则 prometheus (四) 黑盒监控 prometheus (三) 服务发现 prometheus (二) 静态配置 prometheus (一) 简介及部署 traefik (四) TraefikService 服务 traefik (三) Middleware 中间件 traefik (二) ingressRoute 路由 traefik (一) 简介、部署和配置 kubernetes | Gateway API 简介及部署 linux | dns 配置文件中 search 和 options ndots 详解 kubernetes | command args 和 dockerfile 中的 ENTRYPOINT CMD kubernetes | statefulset 控制器详解 docker | dockerfile 最佳实践 docker | dockerfile 指令详解 linux | kill 命令详解以及 linux 中的信号 troubleshooting | elasticsearch 安装插件报错 shell | if 条件判断 docker | 下载外网镜像的几种方式 python | 鬼谷子数学问题 steam挂刀教程 linux | history 命令的格式化输出 shell | 将本地镜像批量推送到 harbor windows | hosts 文件修复 kubernetes | configmap & secret kubernetes | RBAC 鉴权和 NetworkPolicy kubernetes | service & ingress kubernetes | 存储 kubernetes | 滚动升级和自动伸缩 kubernetes | 控制器 kubernetes | 日志 kubernetes | 调度 kubernetes | pod kubernetes | 杂记 linux | set 命令详解 ceph | openeuler 部署 ceph-v16 ceph | ceph-v16 离线安装解决方案 pxe 如何应对复杂的服务器硬件环境 python | 批量修改目录下文件名 《微习惯》 ceph | openeuler (aarch64) 部署 ceph-v16 troubleshooting | glibc 误升级后修复 pxe 安装配置大全 《人间失格》 跑步日常 [置顶] Hello, hugo! shell | 检索某 url 中所有文件的内容 shell | 不同执行方式的区别 shell | 开启 debug 模式 vscode | 常见问题 windows & linux 多网卡时设置默认路由以及添加静态路由 mysql (二) 主从复制原理 GTID 并行复制 mysql (一) 部署 mysql | 杂记 cicd | jenkins 部署 mall-swarm 项目 httpd 源码打包编译成 rpm 包 openssl 源码打包编译成 rpm 包 centos7 | 修改网卡名称 ceph | pool pg_num 配置 docker | 脚本方式批量导出/导入镜像 centos 密码尝试次数过多问题处理 centos7 | 升级内核至 5.10 CVE-1999-0526 ceph | centos7 部署 ceph-v12 python | 修改 pip 源 troubleshooting | 安装 cloud-init 后导致 ssh 连接失败
docker | 数据卷 volume
lvbibir · 2019-08-01 · via lvbibir's Blog

0 什么是数据卷

docker 的理念之一就是将应用与其运行的环境打包。通常 docker 容器的生命周期都是与在容器中运行的程序相一致的,我们对于数据的要求就是持久化;另一方面 docker 容器之间也需要一个共享文件的渠道。

  • 数据卷是经过特殊设计的目录,可以绕过联合文件系统(UFS),为一个或者过个容器提供服务
  • 数据卷设计的目的,在于数据的持久化,他完全独立于容器的生存周期,因此,docker 不会在容器删除时删除其挂载的数据卷,也不会存在类似的垃圾收集机制,对容器引用的数据卷进行处理

在这里插入图片描述

从图片中:

  1. 数据卷独立于 docker 容器存在,它存在于 docker 的宿主机中
  2. 数据卷可以是目录,也可以是文件
  3. docker 容器可以利用数据卷与宿主机共享文件
  4. 同一个数据卷可以支持多个容器的访问

1 数据卷的特点

  1. 数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中
  2. 数据卷可以在容器之间共享和重用
  3. 可以对数据卷里的内容直接进行修改
  4. 数据卷的变化不会影响镜像的更新
  5. 数据卷会一直存在,即使挂载数据卷的容器已经被删除

2 数据卷操作

2.1 添加数据卷

docker run -it -v HOST_DIRECTORY:CONTAINER_DIRETORY  IMAGE [COMMADN]
# HOST-DIRECTORY:指定主机目录,不存在时即创建
# CONTAINER:指定容器目录,不存在时即创建

示例:

[root@localhost ~]# docker run -it -v /docker/data_volume:/data_volume busybox /bin/sh
/ # touch /data_volume/test		#创建测试文件
/ # echo "lvbibir" > /data_volume/test
/ # cat /data_volume/test
lvbibir
[root@localhost ~]# cat /docker/data_volume/test		#验证测试文件
lvbibir
[root@localhost ~]# docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
be3fad8d789e        busybox             "/bin/sh"           6 minutes ago       Up 6 minutes                            elastic_boyd
[root@localhost ~]# docker inspect elastic_boyd

在这里插入图片描述

在这里插入图片描述

2.2 访问权限

docker run -it -v HOST_DIRECTORY:CONTAINER_DIRETORY:r/w  IMAGE [COMMADN]

权限可以设置为:

  • ro:only-read,只读
  • wo:only-write,只写
  • rw:write and read,读写

示例:

[root@localhost ~]# docker run -itd -v /docker/data_volume:/data_volume:ro busybox /bin/sh
3ee3a2b7a97c0a10125d46ee1135bf59af1d97932572d49fdd5c0bb64bf775a5
[root@localhost ~]# docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
3ee3a2b7a97c        busybox             "/bin/sh"           4 seconds ago       Up 3 seconds                            confident_hopper
[root@localhost ~]# docker inspect confident_hopper

在这里插入图片描述

2.3 dockerfile

dockerfile 指令:

VOLUME [“HOST_DIRECTORY”]

  • dockerfile 中配置数据卷无法指定映射到本地的目录
  • 构建好镜像启动容器时,数据卷会进行初始化,docker 会在/var/lib/docker/volumes/下为数据卷创建新的随机名字的目录(不同版本该目录位置可能不同,具体以 inspect 查看到的为准)
  • 使用同一个镜像构建的多个容器,映射的本地目录也不一样
  • 通过数据卷容器来进行容器间的数据共享

示例:

[root@localhost ~]# cat Dockerfile
#For test data_volume
FROM busybox:latest
VOLUME ["/data_volume1","/data_volume2"]
CMD /bin/sh
[root@localhost ~]# docker build -t test/data_volume .
[root@localhost ~]#  docker run -itd --name test_data_volume_1 test/data_volume /bin/sh
ee8347a4bd3590e8cb65a28e1ebfc5d01e44f2ce70d33a2fa9bbc19782e34f21
[root@localhost ~]# docker exec test_data_volume_1 ls -l / | grep data_volume
drwxr-xr-x    2 root     root             6 Aug 14 15:20 data_volume1
drwxr-xr-x    2 root     root             6 Aug 14 15:20 data_volume2
[root@localhost ~]# docker inspect test_data_volume_1

在这里插入图片描述

[root@localhost ~]# docker run -itd --name test_data_volume_2 test/data_volume /bin/sh
b4f654706ea15e657cd61bb92d16fa6c6b8eb9129a68b1c9209ea21967175b24
[root@localhost ~]# docker exec test_data_volume_2 ls -l / | grep data_volume
drwxr-xr-x    2 root     root             6 Aug 14 15:24 data_volume1
drwxr-xr-x    2 root     root             6 Aug 14 15:24 data_volume2
[root@localhost ~]# docker inspect test_data_volume_2

在这里插入图片描述

3 数据卷容器

  • 一个命名的容器挂载了数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据卷的容器,就叫做数据卷容器
  • 使用数据卷容器而不是用数据卷直接挂载,可以不暴露宿主机的实际目录
  • 删除数据卷容器对于已经挂载了该容器的容器没有影响,因为数据卷容器只是传递了挂载信息,任何对于目录的更改都不需要通过数据卷容器

在这里插入图片描述

从图片中:

  • 数据卷容器挂载了一个本地目录,其他容器通过连接这个数据卷容器来实现数据的共享

3.1 挂载数据卷容器

docker run -it --volumes-from [CONTAINER] IMAGE [COMMAND]
  • CONTAINER 必须是已经挂载了卷组的容器,dockerfile 和 -v 两个方式都可以
  • CONTAINER 可以未运行,但必须存在

示例:

创建数据卷容器

[root@localhost ~]# cat Dockerfile
#For test data_volume
FROM busybox:latest
VOLUME ["/data_volume1","/data_volume2"]
CMD /bin/sh
[root@localhost ~]# docker build -t test/data_volume .
[root@localhost ~]# docker run -it --name  data_volume_container  test/data_volume /bin/sh
/ # touch /data_volume1/test1
/ # touch /data_volume2/test2
/ # exit

创建一个容器,挂载数据卷容器进行验证

[root@localhost ~]# docker run -itd --name test_dvc_1 --volumes-from data_volume_container busybox /bin/sh
6c4afa29df7ef226da7f1f0d394a356d53b92e3b20fa6c4632e7197ba393612c
[root@localhost ~]# docker exec test_dvc_1 ls /data_volume1/
test1
[root@localhost ~]# docker exec test_dvc_1 ls /data_volume2/
test2

使用这个新容器对挂载的目录进行更改

[root@localhost ~]# docker exec test_dvc touch /data_volume1/test2
[root@localhost ~]# docker exec test_dvc ls /data_volume1/
test1
test2

再创建一个新容器验证上一个容器对挂载目录的更改是否生效

[root@localhost ~]# docker run -itd --name test_dvc_2 --volumes-from data_volume_container busybox /bin/sh
276c24ecd6ee62f35abf24855ffc5416b9abe987c1bb693ec57bf27d241383d2
[root@localhost ~]# docker exec test_dvc_2 ls /data_volume1
test1
test2
[root@localhost ~]# docker inspect --format="{{.Mounts}}"  test_dvc_1
[{volume 1aca4270e7c9ba34b3978638a6bf9e8259c294508207e89b3b9cbb529f4dd4be /var/lib/docker/volumes/1aca4270e7c9ba34b3978638a6bf9e8259c294508207e89b3b9cbb529f4dd4be/_data /data_volume1 local  true } {volume d6ebda8735e2c76857d199bd1b96d11c9802d39557d2028bac60f0ec42efc764 /var/lib/docker/volumes/d6ebda8735e2c76857d199bd1b96d11c9802d39557d2028bac60f0ec42efc764/_data /data_volume2 local  true }]
[root@localhost ~]# docker inspect --format="{{.Mounts}}"  test_dvc_2
[{volume d6ebda8735e2c76857d199bd1b96d11c9802d39557d2028bac60f0ec42efc764 /var/lib/docker/volumes/d6ebda8735e2c76857d199bd1b96d11c9802d39557d2028bac60f0ec42efc764/_data /data_volume2 local  true } {volume 1aca4270e7c9ba34b3978638a6bf9e8259c294508207e89b3b9cbb529f4dd4be /var/lib/docker/volumes/1aca4270e7c9ba34b3978638a6bf9e8259c294508207e89b3b9cbb529f4dd4be/_data /data_volume1 local  true }]
[root@localhost ~]# docker inspect test_dvc_1

在这里插入图片描述

[root@localhost ~]# docker inspect test_dvc_2

在这里插入图片描述

3.2 删除数据卷容器

删除数据卷容器后,已经挂载了这个数据卷容器的容器不受任何影响

数据卷容器只传递链接信息,挂载的数据并不需要通过数据卷容器来进行传输

4 数据卷的备份和还原

4.1 数据备份

备份这个数据卷容器挂载的所有目录

docker run --volumes-from [container] -v $(pwd):/backup [image] tar cvf /backup/backup.tar [container data volume]
  • -v $(pwd):/backup:挂载一个数据卷用于存放备份文件
  • tar 命令:将数据卷容器挂载的目录进行压缩,备份到/backup 目录

在这里插入图片描述

4.2 数据还原

docker run --volumes-from [container] -v $(pwd):/backup [image] tar xvf /backup/backup.tar [container data volume]

以上

wechat_pay

微信

alipay

支付宝