什么是容器数据卷

数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可持久化
Mysql ,容器删除了,就是删库跑路了! 虚修:Mysql数据可以存储在本地
容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!
这就是卷技术,目录的挂载,将我们容器内的目录挂载到Linux上面!
总之:容器的持久化和同步操作!容器之间也是可以数据共享的

使用数据卷

  1. docker run -it -v 主机目录 : 容器内目录
  2. #测试
  3. liuyang@docker:~$ docker run -it -v /home/ceshi:/home centos /bin/bash

好处:我们以后修改文件直接在我们本地修改就可以

实战:安装Mysql

思考:Mysql数据持久化问题!

  1. # 获取镜像
  2. liuyang@docker:~$ docker pull mysql:5.7
  3. # 运行容器,需要做数据挂载! # 安装启动mysql,需要配置密码 这是要注意的点
  4. # 官方测试:docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
  5. # 启动我们的mysql
  6. -d 后台启动
  7. -p 端口映射
  8. -v 卷挂载
  9. -e 环境配置
  10. --name 容器名字
  11. liuyang@docker:~$ docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
  12. # 启动成功后 用我们的Navicat链接测试

把mysql容器删除,我们本地的数据卷依旧存在,这就是实现数据的持久化

具名和匿名挂载

匿名挂载

-v 容器内路径!

  1. # 命令
  2. docker run -d -P --name nginx01 -v /etc/nginx nginx
  3. # 查看所有的volume的情况
  4. liuyang@docker:/home/mysql/data$ docker volume ls
  5. DRIVER VOLUME NAME
  6. local 1f3d5e801bc190063497540445209e8fede19c5bc9572f81e5c927063b1e427a
  7. # 这里发现,这种就是匿名挂载,我们在-v只写了容器内的路径,没有写容器外的路径!

具名挂载

  1. liuyang@docker:/home/mysql/data$ docker run -d -P --name nginx02 -v juming-name:/etc/nginx nginx
  2. 3dbfc3172868568a165da218a0b18935b916dfffab4851e978ec516fa5632b25
  3. liuyang@docker:/home/mysql/data$ docker volume ls
  4. DRIVER VOLUME NAME
  5. local juming-name
  6. # 通过 -v 卷名:容器内路径
  7. # 查看一下这个卷
  8. liuyang@docker:/home/mysql/data$ docker volume inspect juming-name
  9. [
  10. {
  11. "CreatedAt": "2020-09-13T19:42:02+08:00",
  12. "Driver": "local",
  13. "Labels": null,
  14. "Mountpoint": "/var/lib/docker/volumes/juming-name/_data",
  15. "Name": "juming-name",
  16. "Options": null,
  17. "Scope": "local"
  18. }
  19. ]

所有的docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/xxxx/_data
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况在数据的 具名挂载
**

如何确定具名挂载还是匿名挂载,还是指定路径挂载?

-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /宿主机路径:容器内路径 # 指定路径挂载

拓展

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

初始Dockerfile

Dockerfile就是用来构建docker镜像的构建文件!命令脚本!先体验一下!
通过这个脚本可以生成镜像,镜像一层一层的,脚本一个个的命令,每个命令都是一层

创建dockerfile

  1. # 创建一个dockerfile文件,名字可以随机 建议dockerfile
  2. # 文件中的内容 指令(大写) 参数
  3. FROM centos
  4. VOLUME ["volume01", "volume02"]
  5. CMD echo "-------end-------"
  6. CMD /bin/bash
  7. # 这里的每个命令,就是镜像的一层!

image.png

启动下自己写的容器

image.png
这个卷和外部已经有一个同步的目录!
image.png
查看一下卷挂载的路径
image.png
测试一下刚才的文件是否同步出去了
这种方式未来使用的十分多,因为我们通常会构建自己的镜像!
假设构建镜像时候没有挂在卷,要手动镜像挂载 -v 卷名:容器内路径

数据卷容器

多个mysql同步数据

image.png

  1. # 启动3个容器,通过我们刚才自己的镜像启动

image.png

image.png
测试:可以删除docker01,查看一下docker02还可以访问这个文件
拷贝概念

结论

容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止
但是一旦持久化到了本地,这个时候,本地的数据是不会删除的!