什么是容器数据卷
从docker的理念说起,docker将应用和环境打包成一个镜像,运行镜像(生成容器)就可以访问服务了。
- 如果数据都存在容器中,那么删除容器,数据就会丢失!需求:数据可以持久化
- MySQL容器删了,就相当于删库了。需求:MySQL数据可以本地存储
容器之间可以有一个数据共享的技术,docker容器产生的数据同步到本地或者别的地方。
这就是数据卷技术,就是目录挂载,将容器内的目录,挂载到虚拟机上或者Linux上
实现容器数据的持久化和同步操作。容器间也可以数据共享
数据的覆盖问题
- 如果挂载一个空的数据卷到容器中的一个非空目录中,那么这个目录下的文件会被复制到数据卷中。
- 如果挂载一个非空的数据卷到容器中的一个目录中,那么容器中的目录中会显示数据卷中的数据。如果原来容器中的目录中有数据,那么这些原始数据会被隐藏掉。
这两个规则都非常重要,灵活利用第一个规则可以帮助我们初始化数据卷中的内容。掌握第二个规则可以保证挂载数据卷后的数据总是你期望的结果。
使用数据卷
方式一:直接使用命令挂载 -v
docker run -it -v 主机目录:容器内目录
docker run -it -v /home/test:/home centos /bin/bash
测试挂载卷
1、在容器内部修改文件同步到Linux主机上
进入容器,在/home目录下创建123.sh文件
主机内可以查看在容器内部创建的文件
2、同样地,在Linux上修改挂在卷文件可以同步到容器内部
3、停止容器,修改Linux主机上的文件,同步到容器内
#1停止容器
exit
#2 查看容器是否还在运行
docker ps
#3 在Linux主机上修改对应目录的文件
#4 启动容器并查看
#4.1 查看历史运行的容器
docker ps -a
#4.2 启动容器
docker start CONTAINER ID
#4.3 进去容器
docker attach CONTAINER ID
#4.4 查看数据卷文件
方式二:Dockerfile文件
数据卷命令
docker volume
docker volume --help
Usage: docker volume COMMAND
Manage volumes
Commands:
create Create a volume
inspect Display detailed information on one or more volumes
ls List volumes
prune Remove all unused local volumes
rm Remove one or more volumes
Run 'docker volume COMMAND --help' for more information on a command.
具名挂载/匿名挂载
匿名挂载
-v 容器内路径
-P 自动分配端口号
docker run -d -P --name nginx02 -v /etc/nginx nginx
具名挂载
-v 卷名:容器内路径
docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx nginx
查看数据卷
方式一:docker inspect 容器ID
方式二:docker volume inspect juming-nginx
查看Linux主机docker工作目录 /var/lib/docker 所有docker容器内的卷,没有指定目录的情况下都是存放在 /var/lib/docker/volumes/xxx/_data 目录下
挂载三种方式
# 1
-v 容器内路径 # 匿名挂载
# 2
-v 卷名:容器内路径 # 具名挂载
# 3
-v 宿主机路径:容器内路径 # 指定路径挂载
扩展
# 通过-v 容器内路径 ro rw 改变读写权限
ro readonly 只读
rw readwrite 可读写
# 一旦设置了容器权限,容器对我们挂载出来的内容就有限定了
docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx:rw nginx
# ro 说明这个路径只能通过宿主机来操作,容器内无法操作