容器数据持久化

本文详细介绍了Docker中数据管理的两种方式:Volume和BindMounts。Volume提供了数据持久化的解决方案,多个容器可以共享数据,并且在容器删除后卷仍保留。BindMounts则允许直接将宿主机目录映射到容器,方便共享配置文件和源代码。在使用过程中需要注意,BindMounts若目标目录为空,不会自动创建,且会覆盖已有内容。
摘要由CSDN通过智能技术生成

一、挂载方式

Docker提供三种方式将数据从宿主机挂载到容器中:

  • volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)。保存数据的最佳方式。
  • bind mounts:将宿主机上的任意位置的文件或者目录挂载到容器中。
  • tmpfs:挂载存储在主机系统的内存中,而不会写入主机的文件系统。如果不希望将数据持久存储在任何位置,可以使用tmpfs,同时避免写入容器可写层提高性能。

在这里插入图片描述


二、Volume

#管理卷: 
docker volume ls
docker volume create nginx-vol 
docker volume inspect nginx-vol 

#用卷创建一个容器: 
docker run -d --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx   
docker run -d --name=nginx-test -v nginx-vol:/usr/share/nginx/html nginx

【说明】
1、--mount 和 -Vd都是挂载,只是版本不同用法不同
2、nginx-vol是创建的数据卷
3、/usr/share/nginx/html是容器的数据目录文件挂在到数据卷的路径。

#清理: 
docker stop nginx-test                     #停止容器nginx-test
docker rm nginx-test                       #删除容器nginx-test
docker volume rm nginx-vol                 #删除数据卷nginx-vol
1、挂载
docker run -d --name=nginx-test -v nginx-vol:/usr/share/nginx/html nginx

验是否挂在成功:

#查看数据nginx-vol
[root@master ~]# docker volume inspect nginx-vol
[
    {
        "CreatedAt": "2021-08-16T14:41:40+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/data/docker/volumes/nginx-vol/_data",
        "Name": "nginx-vol",
        "Options": {},
        "Scope": "local"
    }
]

#查看数据卷挂载目录下文件
[root@master ~]# ls /data/docker/volumes/nginx-vol/_data
50x.html  index.html

#登陆容器查看nginx容器文件是否对应
[root@master ~]# docker exec -it nginx-test /bin/bash
root@cdb030d9759e:/# ls /usr/share/nginx/html/
50x.html  index.html
2、没有指定卷,自动创建卷

操作:

#查看数据卷
[root@master ~]# docker volume ls
DRIVER              VOLUME NAME
local               nginx-vol

#将/usr/share/nginx/html挂载到nginx-vol-2卷上
[root@master ~]#  docker run -d --name=nginx-test2 -v nginx-vol-2:/usr/share/nginx/html nginx
e21b66dcc719eca2ed09b15266e39c9a6835d5ae061788936159a218119425d2

#发现自动生成卷nginx-vol-2
[root@master ~]# docker volume ls
DRIVER              VOLUME NAME
local               nginx-vol
local               nginx-vol-2

3、删除容器、卷是否存在

验证

#登陆nginx-test
[root@master ~]# docker exec -it nginx-test /bin/bash

#修改发布目录
root@cdb030d9759e:/# echo "jiawenchao" >/usr/share/nginx/html/index.html
root@cdb030d9759e:/# exit
exit

#查看ngixn-test的IP
[root@master ~]# docker inspect nginx-test |grep -i ipaddr
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.6",
                    "IPAddress": "172.17.0.6",

#访问IP地址,确认修改。
[root@master ~]# curl  172.17.0.6
jiawenchao

#查看数据卷是否变动
[root@master ~]# cat /data/docker/volumes/nginx-vol/_data/index.html
jiawenchao

#删除容器nginx-test
[root@master ~]# docker rm -f nginx-test
nginx-test

#重新启动新容器
docker run -d --name=jiawenchao -v nginx-vol:/usr/share/nginx/html nginx

#查看容器jiawenchao的IP地址
[root@master ~]# docker inspect jiawenchao |grep -i ipaddr
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.6",
                    "IPAddress": "172.17.0.6",

#访问发现还是之前的数据
[root@master ~]# curl 172.17.0.6
jiawenchao

二、Bind Mounts

1、宿主机目录映射
#用卷创建一个容器: 
 docker run -d --name=wenchao --mount type=bind,src=$PWD/wwwroot,dst=/usr/share/nginx/html nginx 
 docker run -d --name=wenchao  -v $PWD/wwwroot:/usr/share/nginx/html  nginx
 
 【说明】
 1、$PWD/wwwroot             #宿主机上的目录路径,有则直接使用、无则自动创建。
 2、/usr/share/nginx/html    #容器本身需要被映射数据路径

验证:

#启动一个容器wenchao
[root@master ~]#  docker run -d --name=wenchao  -v $PWD/wwwroot:/usr/share/nginx/html  nginx

#查看IP
[root@master ~]# docker inspect wenchao |grep -i ipaddr
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.8",
                    "IPAddress": "172.17.0.8",

#访问报错403,原因是没有数据也没有网页
[root@master ~]# curl  172.17.0.8
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.21.1</center>
</body>
</html>

#导入“hello wrod"html发布目录,并放到/wwwroot/下
[root@master ~]# echo "hello wrod" > wwwroot/index.html

#再次访问发现hello word
[root@master ~]# curl  172.17.0.8
hello wrod

注意:

  • 如果源文件/目录没有存在,不会自动创建,会抛出一个错误。
  • 如果挂载目标在容器中非空目录,则该目录现有内容将被隐藏。

三、总结知识点

【挂载官网】https://docs.docker.com/storage/bind-mounts/

Volume特点:

  • 多个运行容器之间共享数据,多个容器可以同时挂载相同的卷。
  • 当容器停止或被移除时,该卷依然存在。
  • 当明确删除卷时,卷才会被删除。
  • 将容器的数据存储在远程主机或其他存储上(间接)
  • 将数据从一台Docker主机迁移到另一台时,先停止容器,然后备份卷的目录(/var/lib/docker/volumes/)

Bind Mounts特点

  • 从主机共享配置文件到容器。默认情况下,挂载主机/etc/resolv.conf到每个容器,提供DNS解析。
  • 在Docker主机上的开发环境和容器之间共享源代码。例如,可以将Maven target目录挂载到容器中,每次在Docker主机上构建Maven项目时,容器都可以访问构建的项目包。
  • 当Docker主机的文件或目录结构保证与容器所需的绑定挂载一致时

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

烟雨话浮生

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

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

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

打赏作者

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

抵扣说明:

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

余额充值