在Docker中,数据卷(data volumes)和数据卷容器(data volume containers)是用于在容器之间共享和持久化数据的两种不同的机制。
一、数据卷
数据卷是一个特殊的目录或目录,可以绕过容器文件系统的常规层,直接在主机的文件系统上进行管理。数据卷可以在容器之间共享,并且可以持久存在,即使容器被删除,数据卷仍然存在。数据卷可以用于存储应用程序的数据、配置文件或其他需要在容器之间传递和持久化的内容。数据卷可以由Docker主机或其他容器创建和管理,而且可以在容器的生命周期中被挂载和卸载。
使用 -v 选项指定路径,格式 <host path>:<container path>
docker run -it -v 主机目录:容器目录
下面使用training/webapp镜像创建一个web容器,应创建一个数据卷挂载到容器的/opt/webapp目录:
1.先拉取镜像
docker pull nginx:vl
2.运行docker并挂载
默认挂载的权限是rw
只读的话/web:/usr/local/nginx/html:ro
[root@master ~]# docker run -d -P --name web -v /web:/usr/local/nginx/html nginx:v1 /bin/bash
e18ba9b88b3cccd9c8fd8c06bc4e7e4ececaf995dbd189ee62d8b13d360b167b
3.进入web容器,写一个测试页面
[root@master ~]# docker exec -it web /bin/bash
root@231750af858b:/# ls
bin dev docker-entrypoint.sh home lib64 mnt proc run srv tmp var
boot docker-entrypoint.d etc lib media opt root sbin sys usr
root@231750af858b:/# echo "test" >/usr/local/nginx/html/index.html
4.在宿主机/web目录查看
/web目录不用事先创建 。删除web容器宿主机/web还在
二、数据卷容器
数据卷容器是专门用于创建和管理数据卷的容器。数据卷容器本身不运行应用程序,而是用作数据卷的持久化存储和共享点。首先,你可以创建一个数据卷容器并将其挂载到主机或其他容器中。然后,其他容器可以通过挂载相同的数据卷容器来共享数据。数据卷容器提供了一个中心化的位置来管理和维护数据卷,使得容器之间的数据共享更加方便和可控。
1.创建一个数据卷容器dbdata,并在其中创建数据卷挂载到/dbdata;
docker run -it -v /dbdata --name dbdata ubuntu
没有做关联挂载,在宿主机上就没有,做了关联挂载在宿主机上才存在对应目录
docker run -it -v /db:/dbdata --name dbdata ubuntu
做了关联挂载
其他容器中使用--volumes-from来挂载dbdata容器中的数据卷
2.创建db1和db2两个容器,并从dbdata容器挂载数据卷
docker run -it --volumes-from dbdata --name db1 ubuntu
docker run -it --volumes-from dbdata --name db2 ubuntu
db1和db2中都会有/dadata
3.在db2的/dbdata下创建一个测试文件
dbdata中也会有
4.如果删除挂载内容的容器(dbdata,db1,db2),数据卷并不会被自动删除。如果要删除一个数据卷,必须再删除最后一个还挂载着它的容器是使用docker rm -v命令来指定同时删除关联的容器
①首先删除dbdata和db1
[root@master ~]# docker rm -f dbdata db1
dbdata
db1
删除列dbdata和db1,db3中的数据卷还在
②删除数据卷
[root@master ~]# docker rm -f -v db2
db2
总结一下两者的区别:
- 数据卷是一个特殊的目录,直接在主机的文件系统上进行管理,可以在容器之间共享和持久存在。
- 数据卷容器是用于创建和管理数据卷的容器,本身不运行应用程序,而是提供一个中心化的位置来管理和维护数据卷,使得容器之间的数据共享更加方便和可控。