一、什么是容器数据卷

docker的理念回顾

  • 总结一句话:容器的持久化和同步操作!容器间也是可以数据共享的

image.png

二、使用数据卷

  • 直接使用命令来挂载 ```shell docker run -it -v 主机目录:容器内目录

测试

[root@VM-0-15-centos ~]# docker run -it -v /home/ceshi:/home centos /bin/bash

启动起来时我们可以通过 docker inspect 容器id 查看挂载情况

[root@VM-0-15-centos ~]# cd /home [root@VM-0-15-centos home]# ls ceshi [root@VM-0-15-centos home]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES aa5de9eebf5e centos “/bin/bash” 2 minutes ago Up 2 minutes zen_bohr d93e31b351d5 portainer/portainer “/portainer” 46 hours ago Up 46 hours 0.0.0.0:8088->9000/tcp, :::8088->9000/tcp romantic_kepler 64dc6975f6e4 tomcat “catalina.sh run” 47 hours ago Up 47 hours 0.0.0.0:3355->8080/tcp, :::3355->8080/tcp tomcat01 d0850b4943fc nginx “/docker-entrypoint.…” 2 days ago Up 2 days 0.0.0.0:3344->80/tcp, :::3344->80/tcp nginx01 [root@VM-0-15-centos home]# docker inspect aa5d

  1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/2893488/1630542966825-f0791384-24af-4017-abae-425e57c69247.png#clientId=u643621d5-7859-4&from=paste&height=266&id=u9ea10666&margin=%5Bobject%20Object%5D&name=image.png&originHeight=287&originWidth=620&originalType=binary&ratio=1&size=18749&status=done&style=none&taskId=u61b39783-8a20-49d3-8b33-4f6b4b36124&width=574)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2893488/1630543153086-5a9e1cd4-1a62-4e50-bac7-81e911f1399c.png#clientId=u643621d5-7859-4&from=paste&height=291&id=u721f1c26&margin=%5Bobject%20Object%5D&name=image.png&originHeight=521&originWidth=1412&originalType=binary&ratio=1&size=496102&status=done&style=none&taskId=u5c1d9b72-a2a7-44a3-9d17-cf7bd0a4fcf&width=789)
  2. <a name="va1Xf"></a>
  3. # 三、实战:安装MySQL
  4. - 通过官方文档,可以看到安装启动MySQL,需要配置密码,这是要注意的!
  5. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/2893488/1630544611582-1dfed120-efca-42be-b498-68e381c2c93c.png#clientId=u643621d5-7859-4&from=paste&height=283&id=u517737d6&margin=%5Bobject%20Object%5D&name=image.png&originHeight=566&originWidth=1920&originalType=binary&ratio=1&size=107443&status=done&style=none&taskId=u791904b7-2fe9-48da-bdc5-c1571601f79&width=960)
  6. ```shell
  7. #启动MySQL
  8. [root@VM-0-15-centos ~]# 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
  9. 863db62d897742e0e62d6c8a4ef9507b00bc1b56071e7768920f645995e4b3f6
  10. #-d 后台运行
  11. #-p 端口映射
  12. #-v 卷挂载
  13. #-e 环境配置
  14. --name 容器名字
  • 注意安全组设置可以访问3310端口

image.png

  • 使用连接工具,可以看到连接服务器内容器的mysql成功

image.png

  • 在本地测试创建一个数据库,查看一下我们的映射路径是否ok
    • 一开始是没有test数据库的,我们创建一个test数据库

image.png
image.png

  • 再次查看目录,可以看到有test目录

image.png
image.png

  • 即使把容器删除,发现我们挂载到本地的数据卷依然没有丢失,这就实现了容器数据持久化功能

image.png

四、匿名挂载和具名挂载

1、匿名挂载

  • 只指定容器内,未指定容器外
  • **docker run -d -P --name nginx01 -v /etc/nginx nginx** | -v 容器内路径 | 不去写主机上的路径,会自动创建一个路径 | | —- | —- | | -P | 大写的P,随机指定端口 |

image.png

  • docker volume命令

image.png
image.png

  • 能够发现卷的名称是一串字符,这种就是匿名挂载
  • 在 -v 的时候只写了容器内的路径,没有写容器外的路径

    2、具名挂载

  • 通过 -v 卷名:容器内路径 来为卷命名

  • **docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx**

image.png

  • 查看卷名具体位置
  • **docker volume inspect juming-nginx**

image.png

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

image.png

  • 那么问题来了,我们该如何确定是具名挂载还是匿名挂载,亦或是指定路径挂载呢? | -v 容器内路径 | 匿名挂载 | | —- | —- | | -v 卷名:容器内路径 | 具名挂载 | | -v /宿主机路径:容器内路径 | 指定路径挂载 ,注意有/ |

五、容器权限

  • 有时候我们会遇到这样的一个命令,路径后面跟着一个 ro 或 rw

    1. docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
    2. docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
  • 一旦设置了容器的权限,容器对我们挂载出来的内容就有限定了

  • 只要看到 ro 就说明这个挂载路径只能通过宿主机来操作,容器内部是无法操作的,容器权限默认为 rw | ro | readonly,只读 | | —- | —- | | rw | readwrite,可读可写 |