docker中的数据卷
1.数据卷 volume
定义:用来实现宿主机和容器之间文件目录映射同步。
2.数据卷使用 -v 宿主机路径:容器内路径
注意:必须在容器首次启动时指定
a.使用绝对路径数据卷
docker run -v /root/data:/usr/local/tomcat/webapps .......
b.使用别名方式数据卷
docker run -v bb:/usr/local/tomcat/webapps .......
注意: 上述中的bb,代表一个数据卷别名
bb这个数据别名可以存在,也可以不存在 不存在Docker首次用到时候自动创建
第一次使用别名时将容器中原始数据保留下来 使用绝对路径方式不会保留容器中的原始数据
3.别名到底是啥?
别名代表一个docker,自身维护的数据卷
1)查看所有docker维护数据卷
docker volume ls
2) 查看数据卷详细内容
docker inspect 数据卷别名
3) 删除数据卷别名
docker volume rm 数据卷别名
4) 创建一个别名数据卷
docker volume create 数据卷别名
4.别名数据卷基本使用
# docker volume create edc-nginx-vol // 创建一个自定义容器卷 # docker volume ls // 查看所有容器卷 # docker volume inspect edc-nginx-vol // 查看指定容器卷详情信息
创建一个数据卷
docker volume create my_nginx
查看所有数据卷
docker volume ls
查看单个数据卷详细信息
docker volume inspect my_nginx
有了自定义容器卷,我们可以创建一个使用这个数据卷的容器,这里我们以nginx为例:
docker run -d --name=nginx2 -p 8800:80 -v my_nginx:/usr/share/nginx/html nginx:latest
其中,-v代表挂载数据卷,这里使用自定数据卷my_nginx,并且将数据卷挂载到 /usr/share/nginx/html (这个目录是yum安装nginx的默认网页目录)。
如果没有通过-v指定,那么Docker会默认帮我们创建匿名数据卷进行映射和挂载。
创建好容器之后,我们可以进入容器里面看看:
可以看到有两个默认页,这时我们新启动一个SSH连接到宿主机去到刚刚创建的数据卷里边看看:
可以看到,我们可以访问到容器里面的两个默认页面,由此可知,volume帮我们做的类似于一个软链接的功能。在容器里边的改动,我们可以在宿主机里感知,而在宿主机里面的改动,在容器里边可以感知到。
这时,如果我们手动stop并且remove当前nginx容器,我们会发现容器卷里面的文件还在,并没有被删除掉.
由此可以验证,在数据卷里边的东西是可以持久化的。如果下次还需要创建一个nginx容器,那么还是复用当前数据卷里面的文件。
此外,我们还可以启动多个nginx容器实例,并且共享同一个数据卷,复用性和扩展性较强。
5.别名数据卷清理
如果不再使用自定义数据卷了,那么可以手动清理掉:
# docker stop my_nginx // 暂停容器实例 # docker rm my_nginx // 移除容器实例 # docker volume rm my_nginx // 删除自定义数据卷
6.绝对路径数据卷挂载
docker run -d -it --name=edc-nginx -v /app/wwwroot:/usr/share/nginx/html nginx
这里指定了将宿主机上的 /app/wwwroot 目录(如果没有会自动创建)挂载到 /usr/share/nginx/html (这个目录是yum安装nginx的默认网页目录)。
这时我们再次进入容器内部看看:
可以看到,与volumes不同,bind mounts的方式会隐藏掉被挂载目录里面的内容(如果非空的话),这里是/usr/share/nginx/html 目录下的内容被隐藏掉了,因此我们看不到。
但是,我们可以将宿主机上的文件随时挂载到容器中:
Step1.新建一个index.html
Step2.在容器中查看
查看下:docker inspect edc-nginx
通过上述命令可以看到一大波配置,我们要关注的是:
数据卷清理
docker stop edc-nginx
docker rm edc-nginx
同volumes一样,当我们清理掉容器之后,挂载目录里面的文件仍然还在,不会随着容器的结束而消失,从而实现数据持久化。