Docker的存储

本文详细介绍了Docker数据卷的两种挂载方式:挂载主机目录和数据卷容器。数据卷提供了数据共享和持久化的能力,即使容器删除,数据仍能保留。挂载主机目录可以直接使用宿主机目录,方便数据交互;数据卷容器则通过创建专用容器来共享数据。文章通过实例演示了如何创建、使用和删除数据卷,强调了数据卷在日志、静态页面、配置文件和多容器共享等场景的应用。
摘要由CSDN通过智能技术生成

一、简介

docker提供数据卷来实现数据共享与持久化,而数据卷的挂载有两种方式:
挂载主机目录(Bind mounts
数据卷容器(Data Volumes

数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性:
1、数据卷可以在容器之间共享和重用
2、数据卷是目录或者文件,而非没有格式化的磁盘(块设备)
3、对数据卷的修改会立马生效
4、对数据卷的更新不会影响镜像
5、卷会一直存在,只到没有容器使用

1、挂载主机目录

先删除全部容器


[root@Docker ~]# docker ps -aq|xargs docker rm -f                 

[root@Docker ~]# docker pull centos          #拉取镜像

创建一个数据卷


[root@Docker ~]# docker run -it --name centos -v /data centos /bin/bash           
[root@fdd9b47f43df /]# ls       
bin   dev  home  lib64       media  opt   root  sbin  sys  usr
data  etc  lib   lost+found  mnt    proc  run   srv   tmp  var
[root@fdd9b47f43df /]# cd data         

-v参数:创建一个数据卷,就是将本地的/var/lib/docker/volumes下的某个目录挂载到容器的/webapp,即便容器删除,/var/lib/docker/volumes下的数据也不会丢失(可以指定本地的目录)

新打开一个窗口

    查看本地的挂载到容器的路径
[root@Docker ]# docker inspect centos                
.....
..
        "Mounts": [
            {
                "Type": "volume",
                "Name": "a18417891ec9d2282cbb4b469bbb4c7b7cd0de6911ff095da20027862fec04e1",
                "Source": "/var/lib/docker/volumes/a18417891ec9d2282cbb4b469bbb4c7b7cd0de6911ff095da20027862fec04e1/_data",
                "Destination": "/data",
......
...

[root@Docker _data]# cd /var/lib/docker/volumes/a18417891ec9d2282cbb4b469bbb4c7b7cd0de6911ff095da20027862fec04e1/_data             
[root@Docker _data]# touch index.html         #创建一个文件

——————————————————————————————————————
[root@fdd9b47f43df data]# ls                  #在容器中查看,可以看见刚刚创建的文件
index.html
[root@fdd9b47f43df data]# echo "<h1>index.html</h1>" > index.html         #写入内容
[root@fdd9b47f43df data]# cat index.html 
<h1>index.html</h1>
[root@fdd9b47f43df data]# exit                 #退出容器
exit

[root@Docker ~]# docker rm a18417891ec9        #删除容器
[root@Docker ~]# docker ps                     
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

[root@Docker _data]# cat index.html            #在进行查看数据没有丢失
<h1>index.html</h1>


1.1、挂载一个宿主机指定的目录作为数据卷

     将宿主机根目录下的data目录挂载到容器的/data目录中
[root@Docker ~]# docker run -it --name centos -v /data:/data centos          
[root@5c11e3f083c9 /]# cd /data       
[root@5c11e3f083c9 data]# ls             
[root@5c11e3f083c9 data]# vi index2.html           
[root@5c11e3f083c9 data]# cat index2.html                 
cs8.4
[root@5c11e3f083c9 data]# exit                
exit
[root@Docker ~]# docker ps -a               
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                      PORTS     NAMES
5c11e3f083c9   centos    "/bin/bash"   6 minutes ago   Exited (0) 48 seconds ago             centos
[root@Docker ~]# docker rm 5c11e3f083c9        
5c11e3f083c9
[root@Docker ~]# docker ps -a                 
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
————————————————————————————————————————
[root@Docker ~]# cat /data/index2.html             #查看保存的数据
cs8.4

2、数据卷容器

(1)、数据卷实际上就是宿主机上的目录或者是文件,可以被直接mount 到容器当中使用 
(2)、实际生成 环境中,需要针对不同类型的服务、不同类型的数据存储要求做相应的规划, 最终保证服务的可扩展性、稳定性以及数据的安全性
(3)、docker run 命令使用-v 选项即可使用volume,其实也就是将宿主机的文件挂载到容器中,默认挂载为rw的权限

数据卷的特点及使用:
1、数据卷是目录或者文件,并且可以在多个容器之间共同使用 
2、对数据卷更改数据容器里面,会立即更新 
3、数据卷的数据可以持久保存,即使删除使用使用该容器卷的容器也不 影响 
4、 在容器里面的写入数据,不会影响到镜像本身

数据卷使用场景:
1、 日志输出
2、 静态web页面
3、应用配置文件
4、 多容器间目录或文件共享

2.1、创建一个数据卷容器

创建一个数据卷容器DataDB,并把宿主机/data挂载至容器的/DataDB目录中
[root@Docker ~]# docker run -it -v /data:/DataDB --name DataDB centos              
[root@ae3afad4f741 /]# cd /DataDB/                
[root@ae3afad4f741 DataDB]# ls                 
index2.html


[root@Docker ~]# docker run -it --volumes-from DataDB --name DB1 centos           
[root@a2c25f347896 /]# cd /DataDB/           
[root@a2c25f347896 DataDB]# ls        
index2.html
[root@a2c25f347896 DataDB]# cat index2.html         
cs8.4

--volume-from选项:指定从哪个容器主机进行复制,从多个容器挂载多个数据卷

如果删除了挂载的容器,数据卷并不会被自动删除,如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显示的使用docker rm -v 命令来指定同时删除关联的容器

2.2、删除数据盘

查看主机上现有的数据盘


[root@Docker ~]# docker volume ls                     
DRIVER    VOLUME NAME
local     6b780e3f8bbaacb0b616d8c3310377fccda4fe06f11a9142e95ca5f5f62c9d66
local     1802ba8fc204c70b958ee346474558e0d447361912648ee63fdc1b11cb940c8c
local     43728192d4ae01dae45ddeb93dd30b34ae958cd0863d0517b54b02e748f704d7
local     a18417891ec9d2282cbb4b469bbb4c7b7cd0de6911ff095da20027862fec04e1

默认情况下,在删除容器时,docker并不会删除其数据盘,查看没有容器在使用的数据盘方法如下:


[root@Docker ~]# docker volume ls -f dangling=true                    
DRIVER    VOLUME NAME
local     6b780e3f8bbaacb0b616d8c3310377fccda4fe06f11a9142e95ca5f5f62c9d66
local     1802ba8fc204c70b958ee346474558e0d447361912648ee63fdc1b11cb940c8c
local     43728192d4ae01dae45ddeb93dd30b34ae958cd0863d0517b54b02e748f704d7
local     a18417891ec9d2282cbb4b469bbb4c7b7cd0de6911ff095da20027862fec04e1

如果想要删除没有使用的数据盘,使用如下指令:


docker volume rm VOLUME_NAME          

删除掉容器时,同时删掉数据盘,则使用:


docker rm -v container_name          

3、案例

把本地的一个目录挂载到容器,修该本地的目录就可以达到修改容器的目的

3.1、创建一个挂载的容器


[root@Docker ~]# cat /data/index.html            #访问页面
<meta charset="UTF-8">
<h1>测试</h1>

[root@Docker ~]# docker run -d -p 80:80 -v /data:/usr/share/nginx/html nginx         
b5382b73c9d05c25ac2fe2ce6be0951aa8c387de80699b1a19da90437b1e402f

[root@Docker ~]# docker ps                
CONTAINER ID   IMAGE     COMMAND                  CREATED             STATUS             PORTS                               NAMES
b5382b73c9d0   nginx     "/docker-entrypoint.…"   About an hour ago   Up About an hour   0.0.0.0:80->80/tcp, :::80->80/tcp   wonderful_brown

访问:192.168.2.17

 3.2、在物理机写入数据


[root@Docker ~]# echo "<meta charset="UTF-8"><h1>今天有太阳....!</h1>" > /data/index.html                              

 完成!!!~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乘浪初心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值