docker的容器数据卷
概述
问题的产生:
- 我们使用docker的时候,数据是在容器中的,如果容器删除了,那么数据自然也就没有了。除非你使用
commit
来生成一个新的镜像。但是生成一个新的镜像实在是不合理。所以我们需要一种方式来保存我们容器所产生的数据
什么是容器数据卷
- 卷就是目录或文件,存在于一个或多个容器中,由
docker
挂载到容器,但不属于联合文件系统,因此能够绕过Union File System
提供一些用于持续存储或共享数据的特性:卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷 - 特点:
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
- 总结:
- 容器的持久化
- 容器间继承+数据共享
使用方式
命令形式
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
案例演示
将tomcat
中的webapps访问的页面,同步成我们自己的页面
docker run -d -p 8080:8080 --name=tomcat1 -v /usr/local/docker/tomcat/webapps:/usr/local/tomcat/webapps tomcat
查看容器细节
docker inspect df7499b811e3
查看8080端口发现没有内容
修改/usr/local/docker/webapps/ROOT
下index.html
文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<h2>this is index</h2>
</body>
</html>
访问tomcat发现页面已经被修改。
使用dockerfile形式
编写dockerfile文件tomcat-volume
FROM tomcat
VOLUME ["/usr/local/tomcat/webapps","/usr/local/tomcat/log"]
CMD echo "finished,--------success1"
CMD catalina.sh run
生成镜像
docker build -f tomcat-volume -t machoul/tomcat-volume:v1 .
启动容器
docker run -d -p 8081:8080 --name=tomcat-volume-1 78960223b717
查看容器的具体介绍
docker inspect 9f82810c263d
找到对应绑定的文件位置,创建ROOT/index.html
文件。返回查看页面
备注:
- 如果Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied,需要在挂载目录后面多加一个**–privileged=true**参数
数据卷容器
命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器
父容器挂载数据卷
docker run -d -p 8081:8080 --name=tomcat-volume-1 78960223b717
子容器挂载父容器
docker run -d -p 8082:8080 --name=tomcat-volume-2 --volumes-from tomcat-volume-1 78960223b717
容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止