为什么

容器的数据只存在容器内,如果容器被删,数据也会被一并删掉
用卷技术可以将容器内数据映射到服务器上,达到同步
image.png
数据持久化和同步,容器之间数据共享!

数据卷挂载(创建容器时)

-v - volume全称

  1. docker run -it -v 本机目录:容器内目录

image.png

  1. //测试
  2. [root@d7e95b07ab8f home]# touch parallel.java
  3. [root@d7e95b07ab8f home]# ls
  4. parallel.java
  5. [root@d7e95b07ab8f home]# read escape sequence
  6. [root@izwz9i11llygg6kvs2igtmz ceshi]# cd /home/ceshi
  7. [root@izwz9i11llygg6kvs2igtmz ceshi]# ls
  8. parallel.java
  9. [root@izwz9i11llygg6kvs2igtmz ceshi]#
  10. //inspect命令检查
  11. //以下是挂载相关配置信息
  12. "Mounts": [
  13. {
  14. "Type": "bind",
  15. "Source": "/home/ceshi",
  16. "Destination": "/home",
  17. "Mode": "",
  18. "RW": true,
  19. "Propagation": "rprivate"
  20. }
  21. ],
  22. //这样我们的本机文件夹和容器文件夹是一个“双向绑定”关系了
  23. 相当于“硬链接”的概念

MySql同步数据

  1. 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
  1. -d 后台运行
  2. -p 本机端口:容器端口
  3. -v 本机目录:容器目录
  4. -e 环境配置
  5. --name 重命名容器名

image.png
这样我们就实现了数据持久化!

匿名挂载

可以看到它在volume name中是一个编码的形式,我们把这样的叫做匿名挂载。

  1. docker run -d -P -v /etc/nginx --name nginx02 nginx
  2. -P 随机端口
  1. //代码运行记录
  2. [root@izwz9i11llygg6kvs2igtmz mysql]# docker run -d -P -v /etc/nginx --name nginx02 nginx
  3. 4cb252a598aab63d77a22b27cae86fed9147cce2211a8c41373a99a46a731cf8
  4. [root@izwz9i11llygg6kvs2igtmz mysql]# docker volume ls
  5. DRIVER VOLUME NAME
  6. local 3b118d8f565bb9441d2640ed6b3325b1a11e7a9da68b48c9d2648061fe4c63f4
  7. local 5c0f49e2fb6b4cfc678a395e6fe7f139452814f1b66d98fa5f8a68015e98d95c
  8. local 2353adb8b0e506d39cf7a6d627d480e6247f8482b648a57f1e654e15d28eb45b
  9. local beb3ddb83851d2a6bfdde65ba41e860b818ef9e7b93e42efe4be4cf12bf763a4
  10. local c7a826f9f75bf8756a02a9a06cf106f36d3ebab82e767bfbec76a4c7a1a41424
  11. local ea98d50d4b9dc8d3ff81b0bae0007c0ad6265d1aecb7061e2c07b2d48c3c9d2c

具名挂载(推荐)

主要在 -v 具名:容器目录

  1. docker run -d -P -v 具体名字:/etc/nginx --name nginx02 nginx
  1. [root@izwz9i11llygg6kvs2igtmz mysql]# docker run -d -P -v specificName:/etc/nginx --name nginx03 nginx
  2. 7e12e95a7410a35fcb82176d37267f475a3cfef69b3d5f575496475e363e5da3
  3. [root@izwz9i11llygg6kvs2igtmz mysql]# docker volume ls
  4. DRIVER VOLUME NAME
  5. local 3b118d8f565bb9441d2640ed6b3325b1a11e7a9da68b48c9d2648061fe4c63f4
  6. local 5c0f49e2fb6b4cfc678a395e6fe7f139452814f1b66d98fa5f8a68015e98d95c
  7. local 2353adb8b0e506d39cf7a6d627d480e6247f8482b648a57f1e654e15d28eb45b
  8. local beb3ddb83851d2a6bfdde65ba41e860b818ef9e7b93e42efe4be4cf12bf763a4
  9. local c7a826f9f75bf8756a02a9a06cf106f36d3ebab82e767bfbec76a4c7a1a41424
  10. local ea98d50d4b9dc8d3ff81b0bae0007c0ad6265d1aecb7061e2c07b2d48c3c9d2c
  11. local specificName

查找挂载目录

查找挂载目录不论是具名还是匿名都可以查,根据volume name进行查找

  1. docker inspect specificName
  1. [root@izwz9i11llygg6kvs2igtmz mysql]# docker inspect specificName
  2. [
  3. {
  4. "CreatedAt": "2020-08-06T17:07:23+08:00",
  5. "Driver": "local",
  6. "Labels": null,
  7. "Mountpoint": "/var/lib/docker/volumes/specificName/_data",
  8. "Name": "specificName",
  9. "Options": null,
  10. "Scope": "local"
  11. }
  12. ]

这就是匿名挂载的本地数据路径
"Mountpoint": "/var/lib/docker/volumes/specificName/_data",

总结

  1. 具体路径挂载
  2. -v 宿主机路径:容器路径
  3. //匿名挂载
  4. -v 容器路径
  5. //匿名挂载
  6. -v 具名:容器路径

拓展权限

  1. docker run -d -P -v 具体名字:/etc/nginx:ro --name nginx02 nginx
  2. docker run -d -P -v 具体名字:/etc/nginx:rW --name nginx02 nginx
  3. RO 只能通过宿主机来修改
  4. RW 宿主机和容器都可修改

DockerFile(创建镜像时)

这种方式相当于是在创建镜像的时候通过命令来进行挂载操作,上面的-v 是在创建容器的时候进行挂载操作

核心操作

  1. //编辑一个文件
  2. vim dockerfile1
  3. //文件内容
  4. FROM centos
  5. VOLUME ["volume01","volume02"]
  6. CMD echo "----end----"
  7. CMD /bin/bash
  8. //构建镜像
  9. docker build -f /home/test_volume/dockerfile -t kuangshen/centos:1.0 .

运行结果

  1. 运行结果
  2. [root@izwz9i11llygg6kvs2igtmz test_volume]# docker build -f /home/test_volume/dockerfile -t sms/centos:1.0 .
  3. Sending build context to Docker daemon 2.048kB
  4. Step 1/4 : FROM centos
  5. ---> 831691599b88
  6. Step 2/4 : VOLUME ["volume01","volume02"]
  7. ---> Running in ef3b8edec5d6
  8. Removing intermediate container ef3b8edec5d6
  9. ---> 02bb64ce3956
  10. Step 3/4 : CMD echo "----end----"
  11. ---> Running in fcc14de27af0
  12. Removing intermediate container fcc14de27af0
  13. ---> 5a895f2b4e27
  14. Step 4/4 : CMD /bin/bash
  15. ---> Running in 2fbec8aada1d
  16. Removing intermediate container 2fbec8aada1d
  17. ---> 5303b29ad6f9
  18. Successfully built 5303b29ad6f9
  19. Successfully tagged sms/centos:1.0
  20. [root@izwz9i11llygg6kvs2igtmz test_volume]# docker images
  21. REPOSITORY TAG IMAGE ID CREATED SIZE
  22. sms/centos 1.0 5303b29ad6f9 4 seconds ago 215MB
  23. hello-world latest bf756fb1ae65 7 months ago 13.3kB
  24. [root@izwz9i11llygg6kvs2igtmz test_volume]#

inspect一下

  1. inspect一下镜像对应的容器
  2. "Volumes": {
  3. "volume01": {},
  4. "volume02": {}
  5. },
  6. //挂载详细
  7. "Mounts": [
  8. {
  9. "Type": "volume",
  10. "Name": "ed99b948e40fdf2c2d099f32e928d4e20c1231a15b94b50d9d331800b00934fb",
  11. "Source": "/var/lib/docker/volumes/ed99b948e40fdf2c2d099f32e928d4e20c1231a15b94b50d9d331800b00934fb/_data",
  12. "Destination": "volume01",
  13. "Driver": "local",
  14. "Mode": "",
  15. "RW": true,
  16. "Propagation": ""
  17. },
  18. {
  19. "Type": "volume",
  20. "Name": "34c8a98b85ab4d5b1020033851fbd35ebd7a6c8965140d56bda790deb3ea3191",
  21. "Source": "/var/lib/docker/volumes/34c8a98b85ab4d5b1020033851fbd35ebd7a6c8965140d56bda790deb3ea3191/_data",
  22. "Destination": "volume02",
  23. "Driver": "local",
  24. "Mode": "",
  25. "RW": true,
  26. "Propagation": ""
  27. }
  28. ],