在上一篇文章中我们已经知道了通过可以通过docker cp将容器内的文件拷贝到宿主机或者宿主机的文件拷贝到容器内,以此来达到修改各种配置文件的作用,但是如果你要修改的不单单是一个文件而是很多文件夹,明显我们这个命令就显得苍白无力。再比如我们要部署100个微服务,因为生产问题,修改了一个class类,则要去修改每个微服务的类工作量就很庞大,所以数据挂在应运而生。我最红修改一个文件而这100个服务都能同时引用。

数据卷

在容器中管理数据主要有两种方式: 数据卷(Volumes) 挂载主机目录 (Bind mounts)
数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:

  • 数据卷可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像
  • 数据卷默认会一直存在,即使容器被删除

Docker中提供了两种挂载方式,-v 和 –mount,但这里推荐使用-mount也就是通过挂在主机目录的方式
docker volume ls:查看数据卷列表
docker volume create 数据卷名称:创建数据卷
docker volume insepect 数据卷名称:查看数据卷的详情
docker volume rm my-volume :删除数据卷

  1. [root@iZwz96i7206s72f09w1sz3Z humm]# docker volume inspect hmmvo
  2. [
  3. {
  4. "CreatedAt": "2020-10-02T10:48:56+08:00",
  5. "Driver": "local",
  6. "Labels": {},
  7. #对应数据卷的目录你要放配置文件的地方-v用的到,一把你的文件一般放在自己自定义文件夹中
  8. "Mountpoint": "/var/lib/docker/volumes/hmmvo/_data",
  9. "Name": "hmmvo",
  10. "Options": {},
  11. "Scope": "local"
  12. }
  13. ]

启动一个挂载数据卷的容器,在用 docker run 命令的时候,使用 —mount 标记来将 数据卷 挂载到容器里。在 docker run 中可以挂载多个数据卷 那我们就一起进入怎么做到数据挂在吧!
数据挂载实战:
我们这里直接拿上一篇文章的index.html一样,直接拿它做测试

  1. 第一步先进入容器,找到index.html复制出来,然后然后进行更改

    docker exec -it angry_johnson bash
    cd /usr/share/nginx/html/
    exit
    cp angry_johnson:/usr/share/nginx/html/index.html /humm/config #此时宿主机就有了这个文件
    cd /humm/config
    vi index.html #改成welcome to nginx
    
  2. 挂在宿主机数据到容器中

    docker exec -it angry_johnson bash
    cd /usr/share/nginx/html/
    cat index.html
    #注意这是修改前的,现在准备将此文件的引用放到外面
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
     body {
         width: 35em;
         margin: 0 auto;
         font-family: Tahoma, Verdana, Arial, sans-serif;
     }
    </style>
    ........
    </body>
    </html>
    #将该文件的引用替换成外部引用
    docker run  -p 8080:80 -d --mount type=bind,source=/humm/config/index.html,destination=/usr/share/nginx/html/index.html nginx:latest
    

    屏幕快照 2020-10-02 下午4.16.57.png
    当服务停掉时,引用将不再生效,需要重新挂载数据!

    备注:

    数据卷是被设计用来持久化数据的,它的生命周期独立于容器,Docker不会在容器被删除后自动删除数据卷 ,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷。 如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用docker rm –v 这个命令:如 docker rm -v -f 容器
    无主的数据卷可能会占据很多空间,要清理请使用以下命令:docker volume prune
    docker run —name 镜像名称 -d -p 8888:8001 —mount source=数据卷名称,target=你要加载的容器内的具体哪个目录

参考资料:https://shichen.blog.csdn.net/article/details/106292036(-v与-mount的区别)