容器卷管理

简介: 容器卷管理

容器运行数据存放在哪里?

容器在运行的时候产生的数据文件,会存放在宿主机上吗?存在哪个地方?

首先,容器运行产生的文件是肯定存放在宿主机的文件系统上的,而且会存放在/var/lib/下,我们可以做一个测试

# 实验步骤 1. 运行一个容器,在容器内创建一个文件
#         2. 退出容器,在宿主机上查找刚刚所创建的文件是否存在,存在哪?
# 启动容器
[root@docker ~]# docker run -it --name linux1 centos:7 
[root@c5befd87e9fb /]# ls
anaconda-post.log  dev  home  lib64  mnt  proc  run   srv  tmp  var
bin                etc  lib   media  opt  root  sbin  sys  usr
[root@c5befd87e9fb /]# touch container_test_file
[root@c5befd87e9fb /]# ls
anaconda-post.log  container_test_file  etc   lib    media  opt   root  sbin  sys  usr
bin                dev                  home  lib64  mnt    proc  run   srv   tmp  var
[root@c5befd87e9fb /]# 
# 这里我们可以使用快捷键 Ctrl+p+q 可以退出容器并保持容器的运行
[root@docker ~]# find / -name container_test_file
/var/lib/docker/overlay2/339a8ce495b9b457ae048596913ea1dfa1a8ab5d7522fc9328bf4b1adf89d5be/diff/container_test_file
/var/lib/docker/overlay2/339a8ce495b9b457ae048596913ea1dfa1a8ab5d7522fc9328bf4b1adf89d5be/merged/container_test_file

这里我们可以看到可以查找到这2个文件,他们都是在/var/lib/overlay2/339a8ce495b9b457ae048596913ea1dfa1a8ab5d7522fc9328bf4b1adf89d5be/下

但是有一个是在diff下,有一个是在merged下

我们首先说这个merged,这个目录是容器运行的时候才会出现的目录,我们可以将容器停掉,再次查看,这个目录就不存在了

[root@docker ~]# docker stop linux1 
linux1
[root@docker ~]# find / -name container_test_file
/var/lib/docker/overlay2/339a8ce495b9b457ae048596913ea1dfa1a8ab5d7522fc9328bf4b1adf89d5be/diff/container_test_file

现在我们可以看见,merged确实不存在了,现在只有diff存在

那么这俩目录有什么差别呢

首先是diff,这个是different这个单词的缩写,也就是差异的意思,这个目录代表这是一个差分卷,不管容器运不运行,都会存在

然后是merged,这个单词是整合的意思,只有当容器运行时存在

那么既然在宿主机上存在这个目录,那我们能不能直接在宿主机上修改文件呢,可以!

# 我们停止容器,尝试修改container_test_file内容
[root@docker ~]# docker stop linux1 
linux1
# 因为容器已经停止了,所以只有diff目录存在
[root@docker ~]# cd /var/lib/docker/overlay2/339a8ce495b9b457ae048596913ea1dfa1a8ab5d7522fc9328bf4b1adf89d5be/diff/
[root@docker diff]# ls
container_test_file  root
# 将文件内容修改
[root@docker diff]# echo "change file tag" > container_test_file 
[root@docker diff]# cat container_test_file 
change file tag
# 重新启动容器,查看文件内容
[root@docker diff]# docker exec -it linux1 /bin/bash
[root@c5befd87e9fb /]# ls
anaconda-post.log  container_test_file  etc   lib    media  opt   root  sbin  sys  usr
bin                dev                  home  lib64  mnt    proc  run   srv   tmp  var
[root@c5befd87e9fb /]# cat container_test_file 
change file tag

我们可以看到容器内部的这个文件也是发生了变动,那我们来看看merged目录内是否也发生了改变

[root@docker 339a8ce495b9b457ae048596913ea1dfa1a8ab5d7522fc9328bf4b1adf89d5be]# cd merged/
[root@docker merged]# ls
anaconda-post.log  container_test_file  etc   lib    media  opt   root  sbin  sys  usr
bin                dev                  home  lib64  mnt    proc  run   srv   tmp  var
[root@docker merged]# cat container_test_file 
change file tag

我们可以看到,merged里面的内容也是一样的,在容器运行的时候merged会整合差分卷里面的内容,也就是说,在容器运行的时候diff和merged里面的内容是没有区别的

容器数据持久化存储

刚刚可以看到,容器运行时产生的数据是可以在宿主机上找到的,那如果容器被删除了呢,那么这些数据也会被删除

# 删除容器,查看目录是否被删除
[root@docker ~]# docker rm -f linux1 
linux1
[root@docker ~]# find / -name container_test_file
[root@docker ~]#

可以看到,这个文件确实不存在了,那么我想把容器运行时产生的数据永久保存在我的宿主机上该怎么办呢

想要持久化存储,我们可以在启动容器的时候使用 -v 参数

用法1
[root@docker ~]# docker run -itd --name linux1 -v /linux centos:7
dcb387e00d63e2817e181112fff36db2b361fedfc34f96287ee3f55f117f7168

我们直接在-v后面跟上一个目录,那么在容器内部就会创建出来这个目录

[root@docker ~]# docker exec -it linux1 /bin/bash
[root@dcb387e00d63 /]# ls 
anaconda-post.log  dev  home  lib64  media  opt   root  sbin  sys  usr
bin                etc  lib   linux  mnt    proc  run   srv   tmp  var
# 我们可以看到,/linux这个目录确实已经存在了,那么我们在这个目录创建一个文件
[root@dcb387e00d63 linux]# touch linux_file
[root@dcb387e00d63 linux]# ls
linux_file

那么这个文件我们是否也可以在宿主机上查到呢

[root@docker ~]# find / -name linux_file
/var/lib/docker/volumes/57fb9707b64a6d521389c4f67cbba75a3847ed1de612bf539db1890db9019a13/_data/linux_file

那我们删除容器,看这个文件是否依旧存在

[root@docker _data]# docker rm -f linux1 
linux1
[root@docker _data]# find / -name linux_file
/var/lib/docker/volumes/57fb9707b64a6d521389c4f67cbba75a3847ed1de612bf539db1890db9019a13/_data/linux_file

我们可以看到,虽然容器被删除了,但是存在容器里的文件依旧被保留在了宿主机上了

用法2

刚刚那种方法确实可以把容器内的文件给保留下来,但是存在宿主机上的位置太长了,不容易记,那我想指定他保存在我宿主机的某个地方,可以做到吗? 可以的

[root@docker ~]# docker run -itd --name linux1 -v /media:/linux centos:7
d250e0d2ffcae00834107935a97afc854ede4a4b27fb843a1e268cd6191976a5

这里的 -v 后面是 /media:/linux 这个意思是将宿主机的/media这个目录映射到容器内的/linux目录

也就是说你在宿主机上的/media目录内创建文件,那么容器内的/linux目录也会相应的创建一个文件,反之亦然

[root@docker ~]# cd /media/
[root@docker media]# echo test_volume > test
[root@docker media]# ls
test
# 进入容器内部查看文件
[root@docker media]# docker exec -it linux1 /bin/bash
[root@d250e0d2ffca /]# cd linux/
[root@d250e0d2ffca linux]# ls
test
[root@d250e0d2ffca linux]# cat test 
test_volume

是没有任何问题的,当然我演示的是在外面创建,在容器内查看,反过来操作也是一样的,在容器内创建文件,在外面去查看,结果是一样的

实验

实验需求

1.使用nginx镜像启动容器

2.将本地的/html目录映射到容器内,使容器读取index.html文件

3.要求可以在宿主机上修改index.html文件,容器内也会同步修改

# 实验步骤 1.拉取nginx镜像
# 2.启动容器指定必要的参数
# 3.修改index文件,通过curl命令查看是否生效
# 1. 拉取nginx镜像
[root@docker ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
Digest: sha256:1a53eb723d17523512bd25c27299046cfa034cce309f4ed330c943a304513f59
Status: Image is up to date for nginx:latest
docker.io/library/nginx:latest
# 2.使用nginx启动容器,并指定 -v 参数
[root@docker ~]# mkdir /html
[root@docker ~]# docker run -itd --name web -v /html:/usr/share/nginx/html -p 8080:80 nginx
5149ebd97d88978a4656433a23a3c4cb440a48f8113593106a86405b3391d3e6
# 3.进入宿主机/html目录,创建index.html文件
[root@docker html]# echo 123 > index.html
[root@docker html]# curl localhost:8080
123
# 4.修改文件内容,重新使用curl命令查看
[root@docker html]# echo hello > index.html 
[root@docker html]# curl localhost:8080
hello

本文来自博客园,作者:FuShudi,转载请注明原文链接:https://www.cnblogs.com/fsdstudy/p/17946915

分类: CKA

目录
相关文章
|
XML Java 编译器
如何使用IOC容器进行对象的管理和创建?
如何使用IOC容器进行对象的管理和创建?
147 0
如何使用IOC容器进行对象的管理和创建?
|
Cloud Native 测试技术 持续交付
Docker Compose 解析:定义和管理多容器应用,从多角度探索其优势和应用场景
Docker Compose 解析:定义和管理多容器应用,从多角度探索其优势和应用场景
495 0
|
11月前
|
安全 关系型数据库 开发者
Docker Compose凭借其简单易用的特性,已经成为开发者在构建和管理多容器应用时不可或缺的工具。
Docker Compose是容器编排利器,简化多容器应用管理。通过YAML文件定义服务、网络和卷,一键启动应用环境。核心概念包括服务(组件集合)、网络(灵活通信)、卷(数据持久化)。实战中,编写docker-compose.yml,如设置Nginx和Postgres服务,用`docker-compose up -d`启动。高级特性涉及依赖、环境变量、健康检查和数据持久化。最佳实践涵盖环境隔离、CI/CD、资源管理和安全措施。案例分析展示如何构建微服务应用栈,实现一键部署。Docker Compose助力开发者高效驾驭复杂容器场景。
149 1
|
Java 数据库连接 Docker
【Docker 专栏】Docker 容器内环境变量的管理与使用
【5月更文挑战第9天】本文介绍了Docker容器中环境变量的管理与使用,环境变量用于传递配置信息和设置应用运行环境。设置方法包括在Dockerfile中使用`ENV`指令或在启动容器时通过`-e`参数设定。应用可直接访问环境变量或在脚本中使用。环境变量作用包括传递配置、设置运行环境和动态调整应用行为。使用时注意变量名称和值的合法性、保密性和覆盖问题。理解并熟练运用环境变量能提升Docker技术的使用效率和软件部署质量。
732 0
【Docker 专栏】Docker 容器内环境变量的管理与使用
|
前端开发 Java 容器
家族传承:Spring MVC中父子容器的搭建与管理指南
家族传承:Spring MVC中父子容器的搭建与管理指南
173 3
|
存储 Linux 文件存储
Linux使用Docker部署Traefik容器并实现远程访问管理界面-1
Linux使用Docker部署Traefik容器并实现远程访问管理界面
257 0
|
弹性计算 Shell 数据安全/隐私保护
动态管理Docker容器的自动扩展与缩减
【4月更文挑战第30天】
157 0
|
监控 Shell Docker
深入了解 Docker 容器操作命令:掌握容器化管理的关键
Docker 已经成为现代应用程序开发和部署的行业标准。它借助容器化技术,提供了一种轻量、可移植和可扩展的方式来构建、发布和运行应用程序。然而,最近我在工作中发现,一些家人们对 Docker 容器的操作命令还不太熟悉。因此,本文旨在深入介绍 Docker 容器操作的各个方面,包括对每个命令及其参数的详细解释。希望通过这篇文章,我们可以一起探讨和学习,进一步提高对 Docker 的理解和应用能力。
302 1
 深入了解 Docker 容器操作命令:掌握容器化管理的关键
|
Cloud Native Docker 容器
【云原生】一文秒会Docker容器企业化管理
【云原生】一文秒会Docker容器企业化管理
90 0
【云原生】一文秒会Docker容器企业化管理
|
数据采集 Kubernetes 应用服务中间件
OpenKruise x iLogtail:管理可观测数据采集Sidecar容器最佳实践
在Kubernetes集群中使用Sidecar容器采集业务容器的可观测性数据是一种常见的数据采集部署方式,然而Sidecar容器对业务部署的侵入性和生命周期管理的复杂性使得这种部署模式的管理代价不仅高昂而且容易出错。本文对Sidecar采集容器管理的难点进行分析,使用OpenKruise提供的管理能力逐一解决,并以iLogtail为例给出基于OpenKruise管理可观测数据采集Sidecar容器的最佳实践。
581 0
OpenKruise x iLogtail:管理可观测数据采集Sidecar容器最佳实践