什么是容器数据卷

从docker的理念说起,docker将应用和环境打包成一个镜像,运行镜像(生成容器)就可以访问服务了。

  • 如果数据都存在容器中,那么删除容器,数据就会丢失!需求:数据可以持久化
  • MySQL容器删了,就相当于删库了。需求:MySQL数据可以本地存储

容器之间可以有一个数据共享的技术,docker容器产生的数据同步到本地或者别的地方。
这就是数据卷技术,就是目录挂载,将容器内的目录,挂载到虚拟机上或者Linux上
image.png
实现容器数据的持久化和同步操作。容器间也可以数据共享

数据的覆盖问题

  1. 如果挂载一个空的数据卷到容器中的一个非空目录中,那么这个目录下的文件会被复制到数据卷中。
  2. 如果挂载一个非空的数据卷到容器中的一个目录中,那么容器中的目录中会显示数据卷中的数据。如果原来容器中的目录中有数据,那么这些原始数据会被隐藏掉。

这两个规则都非常重要,灵活利用第一个规则可以帮助我们初始化数据卷中的内容。掌握第二个规则可以保证挂载数据卷后的数据总是你期望的结果。

使用数据卷

方式一:直接使用命令挂载 -v

  1. docker run -it -v 主机目录:容器内目录
  2. docker run -it -v /home/test:/home centos /bin/bash

docker inspect 命令查看容器信息
image.png

测试挂载卷

1、在容器内部修改文件同步到Linux主机上

进入容器,在/home目录下创建123.sh文件
image.png
主机内可以查看在容器内部创建的文件
image.png

2、同样地,在Linux上修改挂在卷文件可以同步到容器内部

image.png

3、停止容器,修改Linux主机上的文件,同步到容器内

  1. #1停止容器
  2. exit
  3. #2 查看容器是否还在运行
  4. docker ps
  5. #3 在Linux主机上修改对应目录的文件
  6. #4 启动容器并查看
  7. #4.1 查看历史运行的容器
  8. docker ps -a
  9. #4.2 启动容器
  10. docker start CONTAINER ID
  11. #4.3 进去容器
  12. docker attach CONTAINER ID
  13. #4.4 查看数据卷文件

image.png

方式二:Dockerfile文件

请查看下一章节

数据卷命令

  1. docker volume
  2. docker volume --help
  3. Usage: docker volume COMMAND
  4. Manage volumes
  5. Commands:
  6. create Create a volume
  7. inspect Display detailed information on one or more volumes
  8. ls List volumes
  9. prune Remove all unused local volumes
  10. rm Remove one or more volumes
  11. Run 'docker volume COMMAND --help' for more information on a command.

image.png

具名挂载/匿名挂载

匿名挂载

  1. -v 容器内路径
  2. -P 自动分配端口号
  3. docker run -d -P --name nginx02 -v /etc/nginx nginx

具名挂载

  1. -v 卷名:容器内路径
  2. docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx nginx

image.png

查看数据卷

方式一:docker inspect 容器ID

image.png

方式二:docker volume inspect juming-nginx

image.png

查看Linux主机docker工作目录 /var/lib/docker 所有docker容器内的卷,没有指定目录的情况下都是存放在 /var/lib/docker/volumes/xxx/_data 目录下

image.png

挂载三种方式

  1. # 1
  2. -v 容器内路径 # 匿名挂载
  3. # 2
  4. -v 卷名:容器内路径 # 具名挂载
  5. # 3
  6. -v 宿主机路径:容器内路径 # 指定路径挂载

扩展

  1. # 通过-v 容器内路径 ro rw 改变读写权限
  2. ro readonly 只读
  3. rw readwrite 可读写
  4. # 一旦设置了容器权限,容器对我们挂载出来的内容就有限定了
  5. docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx:ro nginx
  6. docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx:rw nginx
  7. # ro 说明这个路径只能通过宿主机来操作,容器内无法操作