Ubantu docker学习笔记(六)容器数据卷

简介: Ubantu docker学习笔记(六)容器数据卷

一、容器数据卷

由于我们rootfs机制与我们的namespce,构建出来的文件分离系统,会导致我们产生数据文件,但是数据文件会随着我们容器的关闭而关闭,但是我们用户希望我们所产生的数据可以持久化,不同容器之间可以互通,也就是我们容器数据卷要解决的问题。

Docker绑定的就是Linux的绑定挂在机制,允许用户将一个目录或者文件挂载到一个文件系统中,原挂载点会被隐藏没有任何影响,从而实现共享。

(1)容器启动时初始化,如果容器使用的镜像包含数据卷,这些数据也会复制到数据卷中。

(2)容器对数据卷的修改是直接生效的。

(3)数据卷的变化不会影响镜像的更新。数据卷独立于联合文件系统,像基于联合文件系统,镜像与数据卷不会相互影响。

(4)数据卷是宿主机中的一个目录,与容器生命周期隔离。

二、容器卷挂载

2.1 在命令行挂载数据卷

使用-v加载一个数据卷

docker run -it --name volume -v /web/app centos
ls web/
exit

然后我们就可以通过如下命令看到挂载信息啦

docker inspect volume

我们再来看一个后台运行的列子

docker run -it -d --name test -v /webapp:/app nginx
docker inspect test 

下面,我们来进行一下测试吧

重启启动一个

docker run -it --name volume2 -v /webapp:/app centos
ls /

我们另外开一个控制台

在我们宿主机上进入webapp这个目录,然后新建两个文件

sudo su
cd /webapp
touch c.txt d.txt
ls

然后返回我们容器进行观察

ls /app

很明显进行了挂载

同理,我们如果在容器里面创建,我们本机也会进行更新,有点类似于我们的共享目录,这样在我们启动多台容器时,可以进行数据共享

此项操作,我们一般用于配置文件的共享,为了避免容器内部修改,我们会对文件进行权限设置

加入只读属性ro

docker run -it --name volume3 -v /webapp:/app:ro centos
ls /
cd app
echo hello world >a.txt

可以看到

同样对于创建文件也是同理,因为我们添加了只读属性

2.2 通过dockerfile挂载数据卷

dockerfile可以创建多个数据卷,但是不能映射到本地已经有的目录,在启动容器时,才会创建dockefile中指定的数据卷,然后以dockerfile中指定名称命名,所创建地址不一样,容器没有办法共享数据。

vim Dockerfile
#选择使用的image
FROM centos/vim
#执行的命令
VOLUME /root/data
VOLUME /work
VOLUME test
docker build -t volume .
ls

ctrl+p+q暂停退出

docker inspect 3dad75

现在就可以看到我们容器的挂载啦

三、数据卷容器

运行容器时宿主机会随机生成挂载目录,无法保持地址一致性,所以无法容器数据共享。数据卷,可以将已经命名的容器挂载数据卷,其他容器再通过挂载这个容器数据实现共享,挂载数据的容器的叫做容器数据卷。

docker run -it --name volume-container -v /volume1 -v /volume2 centos
ctrl+p+q暂停退出
docker inspect volume-container | grep volume

我们就可以看到我们所在的这个目录

cd /var/lib/docker/volumes/1f889275343587271abe22ec55878fefd25bec783e5c0ba30624fc4989893989/_data
echo hello world > a.txt
echo hello world2 > b.txt

然后我们再回到我们容器

docker attach b38d15

我们就可以在这里看到我们刚刚的容器目录啦

删除之后还是会继续保存

四、备份数据卷

人们通常会对数据进行一次或者多次备份,以确保数据的安全,下面我们来试一试吧

docker run -it --name volume-container -v /var/volume1 -v /var/volume2 centos

在其数据卷下创建文件并添加内容

echo hello world1 > /var/volume1/a.txt
echo hello world2 > /var/volume2/b.txt

我们备份的话,简单的来说,就是用–volumes-from参数来挂载数据卷,从宿主机挂载要放在备份数据的目录到容器的备份目录,然后用–rm删除容器

docker run --rm --volumes-from volume-container(你要备份的容器名)   -v /root/backup:/backup centos tar cvf /backup/backup1.tar /var/volume1
docker run --rm --volumes-from volume-container(你要备份的容器名)   -v /root/backup:/backup centos tar cvf /backup/backup2.tar /var/volume2

五、数据卷的恢复和迁移

5.1 恢复数据卷

由于我们之前已经对于数据卷做好了恢复,下面我们来对模拟的数据卷来进行恢复

进入数据卷

docker attach volume-container
rm -rf /var/volume1/a.txt
rm -rf /var/volume2/b.txt

然后我们用代码来恢复

docker run --rm --volumes-from volume-container -v /root/backup/:/backup centos tar xvf /backup/backup1.tar -C /
docker run --rm --volumes-from volume-container -v /root/backup/:/backup centos tar xvf /backup/backup2.tar -C /

完成!

5.2 迁移数据卷

我们新建一个数据卷容器

docker run -it --name new-container -v /volume1 -v /volume2 centos
ctrl+p+q
docker run --rm --volumes-from new-container -v /root/backup/:/backup centos tar xvf /backup/backup1.tar -C /volume1 
docker run --rm --volumes-from new-container -v /root/backup/:/backup centos tar xvf /backup/backup2.tar -C /volume2

在容器路劲和原来路劲相同时,可以直接导入,-C后面不用加参数,但是如果和源路劲不一样,我们需要在—C后面指定参数,不然会迁移失败

六、管理数据卷

6.1 与容器关联

命令 含义
docker rm -v 删除容器时添加-v会将数据卷一起删除
docker rm --rm 运行结束时数据卷会和容器一起删除

(1)例子一

docker run -it -v /data --name test centos
docker inspect test | grep Source

进入到你那个目录

cd /var/lib/docker/volumes/22df6c5c6990231a9983cd9646a9115a3a5cd3bdd3260f187896205aa53036df/_data
docker rm test
docker inspect test | grep Source

可以看到数据卷还在

(2)例子二

docker run -it -v /data --name test2 centos
docker inspect test2 | grep Source
docker stop test2
docker rm -v test2

可以看到数据卷也随之删除

(3)例子三

docker run -it --rm -v /data --name test2 centos

退出容器时会自动删除容器和数据卷

6.2 命令管理

命令 含义
creat 创建容器卷 docker volume creat test
ls 列出容器卷 docker volume ls
inspect 显示一个或者多个数据卷的详细信息 docker inspect 容器名
rm 删除一个或者多个容器
prune 暂停容器 docker volume prune


相关文章
|
24天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
183 77
|
6天前
|
搜索推荐 安全 数据安全/隐私保护
7 个最能提高生产力的 Docker 容器
7 个最能提高生产力的 Docker 容器
75 35
|
5天前
|
Ubuntu Linux 开发工具
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖项打包成标准化单元(容器),确保在任何支持 Docker 的操作系统上一致运行。容器共享主机内核,提供轻量级、高效的执行环境。本文介绍如何在 Ubuntu 上安装 Docker,并通过简单步骤验证安装成功。后续文章将探讨使用 Docker 部署开源项目。优雅草央千澈 源、安装 Docker 包、验证安装 - 适用场景:开发、测试、生产环境 通过以上步骤,您可以在 Ubuntu 系统上成功安装并运行 Docker,为后续的应用部署打下基础。
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
|
11天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
72 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
16天前
|
关系型数据库 应用服务中间件 PHP
实战~如何组织一个多容器项目docker-compose
本文介绍了如何使用Docker搭建Nginx、PHP和MySQL的环境。首先启动Nginx容器并查看IP地址,接着启动Alpine容器并安装curl测试连通性。通过`--link`方式或`docker-compose`配置文件实现服务间的通信。最后展示了Nginx配置文件和PHP代码示例,验证了各服务的正常运行。
43 3
实战~如何组织一个多容器项目docker-compose
|
11天前
|
Unix Linux Docker
CentOS停更沉寂,RHEL巨变限制源代:Docker容器化技术的兴起助力操作系统新格局
操作系统是计算机系统的核心软件,管理和控制硬件与软件资源,为用户和应用程序提供高效、安全的运行环境。Linux作为开源、跨平台的操作系统,具有高度可定制性、稳定性和安全性,广泛应用于服务器、云计算、物联网等领域。其发展得益于庞大的社区支持,多种发行版如Ubuntu、Debian、Fedora等满足不同需求。
39 4
|
26天前
|
数据建模 应用服务中间件 nginx
docker替换宿主与容器的映射端口和文件路径
通过正确配置 Docker 的端口和文件路径映射,可以有效地管理容器化应用程序,确保其高效运行和数据持久性。在生产环境中,动态替换映射配置有助于灵活应对各种需求变化。以上方法和步骤提供了一种可靠且易于操作的方案,帮助您轻松管理 Docker 容器的端口和路径映射。
81 3
|
1月前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序
|
1月前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
100 7
|
2月前
|
持续交付 开发者 Docker
探索容器化技术Docker及其在现代软件开发中的应用
探索容器化技术Docker及其在现代软件开发中的应用