什么是容器数据卷

docker的理念回顾

image-20200914223225639.png

使用数据卷

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

  1. docker run -v 主机目录:容器目录
  2. #测试
  3. docker run -it -v /home/ceshi:/home centos /bin/bash
  4. #查看容器挂载情况
  5. docker inspect b5d89da9ec01

image-20200914224919028.png
测试数据是否同步
image-20200914224621259.png
容器退出后,修改主机的同步目录下的东西,一样可以同步到容器中

实战:安装MySQL

  1. #获取镜像
  2. docker pull mysql:5.7
  3. #运行容器,需要数据挂载!
  4. #安装启动mysql,需要配置密码的,这是注意点
  5. #官方测试 docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
  6. #启动并挂载mysql配置目录和数据目录到本地
  7. docker run -d -p 3310: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
  8. #启动成功后,我们本地使用navicat工具连接数据库
  9. #在本地连接的数据库上创建数据库和表,测试主机挂载的目录数据是否挂载成功

image-20200916233129010.png

具名挂载和匿名挂载

  1. #匿名挂载
  2. [root@wise ~]# docker run -d -P --name nginx01 -v /etc/nginx nginx #匿名挂载nginx01容器的/etc/nginx目录到本地
  3. 8be0810dda8d944fd0824464540dbbe97e735016bef164017803e3988a56193a
  4. [root@wise ~]# docker volume ls #查看卷的信息(得到匿名卷名)
  5. DRIVER VOLUME NAME
  6. local 154a0daea7f7a93c7ebffe21e1213f892af8fa0eb1d870905eafa55e1c39a6aa
  7. #具名挂载
  8. [root@wise ~]# docker run -d -P --name nginx03 -v nginx03:/etc/nginx nginx #具名挂载nginx03容器/etc/nginx目录到本地(卷名nginx03)
  9. 31fa291f376305dd950c10b34ed9689f4e2d1b989517a47f3face404eadaada0
  10. [root@wise ~]# docker volume ls #查看卷的信息(得到具名卷名)
  11. DRIVER VOLUME NAME
  12. local 5ff0c8f210b4e99fc60f6e74c8e11dd776de37cb3cb2e39011a675d4993bcda9
  13. local 154a0daea7f7a93c7ebffe21e1213f892af8fa0eb1d870905eafa55e1c39a6aa
  14. local 515f03843e5682d8fef890885324596eecbe7c21f737fcdc936e19cc2469da01
  15. local nginx03 #具名卷名
  16. #通过 -v 卷名:容器内路径
  17. #查看卷挂载情况

所有docker容器的卷,没有指定主机路径的情况下,所有容器目录挂载在/var/lib/docker/volumes/xxx下

通过具名挂载方便找到我们的一个卷,大多数情况使用具名挂载

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

拓展:

  1. #通过 -v 容器内路径 ro rw 改变读写权限
  2. #ro read only 只读
  3. #rw readwrite 可读写
  4. #一旦设置了容器权限,容器对我们挂载出来的内容就有了限定!(对容器内容来说)
  5. docker run -d -P --name nginx03 -v nginx03:/etc/nginx:ro nginx
  6. docker run -d -P --name nginx03 -v nginx03:/etc/nginx:rw nginx
  7. #ro 即容器内部不能对这个路径进行写操作,这个路径只能在宿主机上操作

初识Dockerfile

Dockerfile就是用来构建docker镜像的构建文件!命令脚本!

通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个命令,每个命令就是一层!

  1. #
  2. [root@wise home]# ls
  3. ceshi mysql wise
  4. [root@wise home]# mkdir docker-teat-volume #创建测试目录
  5. [root@wise home]# cd docker-teat-volume/
  6. [root@wise docker-teat-volume]# vim dockerfile #在测试目录下编辑dockerfile(镜像创建脚本)
  7. [root@wise docker-teat-volume]# cat dockerfile
  8. FROM centos
  9. VOLUME ["volume01","volume02"]
  10. CMD echo "-----end-------"
  11. CMD /bin/bash
  12. #docker build -f [docerfile文件目录] -t [生成的镜像名] . #最后的.注意
  13. [root@wise docker-teat-volume]# docker build -f dockerfile -t wise/centos . #利用镜像创建脚本创建镜像
  14. Sending build context to Docker daemon 2.048kB
  15. Step 1/4 : FROM centos
  16. ---> 0d120b6ccaa8
  17. Step 2/4 : VOLUME ["volume01","volume02"]
  18. ---> Running in 097824ceba71
  19. Removing intermediate container 097824ceba71
  20. ---> 32fbbb6db1a7
  21. Step 3/4 : CMD echo "-----end-------"
  22. ---> Running in 47ca999b5d93
  23. Removing intermediate container 47ca999b5d93
  24. ---> d17fa7b9605c
  25. Step 4/4 : CMD /bin/bash
  26. ---> Running in b9758e5f26e2
  27. Removing intermediate container b9758e5f26e2
  28. ---> f3b2157173ae
  29. Successfully built f3b2157173ae
  30. Successfully tagged wise/centos:latest
  31. [root@wise docker-teat-volume]# docker images
  32. REPOSITORY TAG IMAGE ID CREATED SIZE
  33. wise/centos latest f3b2157173ae 11 seconds ago 215MB #自己创建的镜像
  34. tomcat latest f796d3d2c195 30 hours ago 647MB
  35. nginx latest 7e4d58f0e5f3 6 days ago 133MB
  36. mysql 5.7 ef08065b0a30 6 days ago 448MB
  37. centos latest 0d120b6ccaa8 5 weeks ago 215MB
  1. #启动自己创建的镜像
  2. docker run -it f3b2157173ae /bin/bash

image-20200917124725952.png
这个卷的目录和外部一定有个同步的目录

  1. [root@wise ~]# docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 01fd9626dc99 f3b2157173ae "/bin/bash" 3 minutes ago Up 3 minutes priceless_pasteur
  4. [root@wise ~]# docker inspect 01fd9626dc99 #查看容器的挂载情况

image-20200917125651491.png
测试一下刚才的文件是否同步出去

这种方式我们未来使用的十分多,因为我们通常会自己构建镜像!

假设构建镜像的时候没有挂载卷,要手动镜像挂载 -v 卷名:容器名

数据卷容器

image-20200917130207873.png

多个mysql同步数据

  1. #启动3个容器,通过我们自己刚才写的镜像启动
  2. #启动容器1并进入
  3. run -it --name docker01 wise/centos
  4. #启动容器2并用--volumes-from和容器1数据卷实现同步
  5. docker run -it --name docker02 --volumes-from docker01 wise/centos
  6. #启动容器2并用--volumes-from和容器1数据卷实现同步
  7. docker run -it --name docker03 --volumes-from docker01 wise/centos

测试:

  1. #docker02和docker03都挂载了docker01的数据卷,所有如何删除容器docker01
  2. #测试发现docker02和docker03和宿主机直接的数据卷目录数据依然能正常双向绑定

image-20200917134739480.png
我所理解的容器间的数据卷同步

注意

如果需要同步的目录时,容器中这个目录本来以后存在文件,则需要把这些文件先拷贝到宿主机对应的同步目录下,再使用挂载,否则容器内此目录的所有文件会被清空