什么是容器数据卷

思考一个问题,我们为什么要使用 Docker?

主要是为了可以将应用和环境进行打包成镜像,一键部署。

再思考一个问题,容器之间是相互隔离的,如果我们在容器中部署类似 mysql 这样的组件,如果把该容器删除掉,那么 mysql 的数据也会被删掉了,数据丢失了,咱们删库跑路真刺激

事实上,我们可不能让这么有风险的事情存在,因此有了卷技术

卷技术是容器之间可以共享数据的技术,Docker 容器中产生数据,将数据同步到本地

例如咱们将 Docker mysql 容器中的 /usr/mysql 目录挂载到宿主机的/home/mysql 目录

使用卷技术,我们就可以让数据得以持久化

实际上操作起来就是挂载目录,将 Docker 容器里面的目录,挂载到宿主机上的某个目录,这就可以将数据持久化和同步了, Docker 容器间的数据共享仍然是这样做的

咱们如何使用数据卷?

启动容器的时候,直接使用 -v命令就可以进行数据卷的挂载

docker run -it -v 宿主机目录:容器目录 镜像名

我们来尝试启动一个 nginx,并将宿主机的 /home/test 目录和 nginx 的/home目录挂载起来

#docker run -d -v /home/test:/home nginx

此时我们在宿主机的/home/test目录下建一个 test.txt 并且写入一些字符串,再查看容器的 /home 目录 是否有 test.txt

# 宿主机
root@iZuf66y3tuzn4wp3h02t7pZ:/home/test# echo xiaomotong >> test.txt# 容器
root@c8405d03a9a1:/home# ls
test.txtroot@c8405d03a9a1:/home# cat test.txt
xiaomotong

我们在容器的/home 目录下创建一个test2.txt 文件,同样写入一些字符串,再查看 宿主机的 /home/test 目录是否有 test2.txt

# 容器
root@c8405d03a9a1:/home# echo xiaozhu >> test2.txt# 宿主机
root@iZuf66y3tuzn4wp3h02t7pZ:/home/test# ls
test2.txt  test.txtroot@iZuf66y3tuzn4wp3h02t7pZ:/home/test# cat test2.txt
xiaozhu

查看上述效果,果然是挂载 ok,数据确实同步了,哪怕是我们把 docker 容器删除掉,数据也不会丢失

docker inspect 容器ID ,查看一下我们创建的容器的挂载情况

# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                  NAMES
c8405d03a9a1   nginx     "/docker-entrypoint.…"   9 minutes ago   Up 9 minutes   80/tcp                 nginx2# docker inspect c8405d03a9a1[..."Mounts": [{"Type": "bind","Source": "/home/test","Destination": "/home","Mode": "","RW": true,"Propagation": "rprivate"}],...
]

使用容器数据卷的便利之处:

以后我们只需要修改宿主机里面的目录和文件,即可和容器中的指定目录保持同步

mysql 实战一波

咱们再来一个实战,我们一起来看看数据卷如何使用

下载 5.7 版本的 mysql docker 镜像,也可以下载其他版本,这个没有关系

# docker pull mysql:5.7
5.7: Pulling from library/mysql     # 5.7版本
33847f680f63: Already exists        # 本层级已经之前已经下载过了
5cb67864e624: Pull complete
1a2b594783f5: Pull complete
b30e406dd925: Pull complete
48901e306e4c: Pull complete
603d2b7147fd: Pull complete
802aa684c1c4: Pull complete
5b5a19178915: Pull complete
f9ce7411c6e4: Pull complete
f51f6977d9b2: Pull complete
aeb6b16ce012: Pull complete
Digest: sha256:be70d18aedc37927293e7947c8de41ae6490ecd4c79df1db40d1b5b5af7d9596
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7         # 真实的mysql 镜像地址

启动镜像,直接使用 -v 来挂载目录

使用方式

docker run -it -v 主机目录:容器的目录

开始启动镜像

咱们可以参考 dockerhub 上的文档

# docker run  -d -p 8888:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql1 mysql:5.7
23c31b285804cd95130e36ad40d3c07239fe744845ca464b9c80e42c84848bfb# 解释一下上述命令
-d 后台运行
-p 宿主机端口:容器端口  端口映射
-v 宿主机目录:容器目录  挂载卷
-e 设置环境变量
--name 设置启动容器的名字

咱们可以通过window 的 workbench 来远程连接一下 mysql

我的是云服务器,因此输入云服务器的地址,端口填入 8888 端口

默认用户名是 root , 密码是 123456

测试连接 ok ,我们可以来进入数据库

咱们在 workbench 中新建一个数据库

看看这个数据库是否会在我们的宿主机上面有同步

查看我们挂载宿主机的目录 /home/mysql/data

root@iZuf66y3tuzn4wp3h02t7pZ:/home/mysql/data#ls
auto.cnf    ca.pem           client-key.pem  ibdata1      ib_logfile1  mysql               private_key.pem  server-cert.pem  sys
ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile0  ibtmp1       performance_schema  public_key.pem   server-key.pem   test

果然是有的,再次 nice,这就达到了数据持久化的效果,这就是咱们从认识数据卷到使用数据卷的一个简单流程,咱们可以慢慢的深入下去

具名挂载和匿名挂载

以启动一个 nginx 为例子:

具名挂载:

# docker run -d  --name nginx3 -v JM:/etc/nginx:rw nginx

匿名挂载:

# docker run -d  --name nginx3 -v /etc/nginx:rw nginx

上述的 rw也可以写成ro

  • rw

可读可写

  • ro

只读,只能宿主机才能写

查看数据挂载卷

root@iZuf66y3tuzn4wp3h02t7pZ:/home/mysql# docker volume ls
DRIVER    VOLUME NAME
local     JM        # 具名挂载 ,下面的为匿名挂载
local     bd2b9ea00eb7d95bb69bdd39a63769ce906a0bb17fae2e29b726f9b92cbcb008
local           d67ba49109dfd654173b8d05f8602b99751066483a357c654b63ba46ec72d5c0

查看挂载具体目录

l# docker volume inspect JM
[{"CreatedAt": "2021-08-04T23:48:05+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/JM/_data","Name": "JM","Options": null,"Scope": "local"}
]

查看该目录下的挂载文件,是否是和 nginx 容器中的 /etc/nginx目录下内容一致

root@iZuf66y3tuzn4wp3h02t7pZ:/var/lib/docker/volumes/JM/_data# ll
total 36
drwxr-xr-x 3 root root 4096 Aug  4 23:48 ./
drwx-----x 3 root root 4096 Aug  4 23:48 ../
drwxr-xr-x 2 root root 4096 Aug  4 23:48 conf.d/
-rw-r--r-- 1 root root 1007 Jul  6 22:59 fastcgi_params
-rw-r--r-- 1 root root 5290 Jul  6 22:59 mime.types
lrwxrwxrwx 1 root root   22 Jul  6 23:11 modules -> /usr/lib/nginx/modules
-rw-r--r-- 1 root root  648 Jul  6 23:11 nginx.conf
-rw-r--r-- 1 root root  636 Jul  6 22:59 scgi_params
-rw-r--r-- 1 root root  664 Jul  6 22:59 uwsgi_params

果然一毛一样,nice

再来看看 docker 默认的挂载目录 /var/lib/docker/volumes,我们可以看到每一个匿名挂载,和具名挂载的目录和数据都存放于此

root@iZuf66y3tuzn4wp3h02t7pZ:/var/lib/docker/volumes# ll
total 44
drwx-----x  5 root root   4096 Aug  4 23:48 ./
drwx--x--x 13 root root   4096 Aug  3 22:58 ../
brw-------  1 root root 252, 1 Aug  3 22:58 backingFsBlockDev
drwx-----x  3 root root   4096 Aug  1 21:36 bd2b9ea00eb7d95bb69bdd39a63769ce906a0bb17fae2e29b726f9b92cbcb008/
drwx-----x  3 root root   4096 Aug  3 23:32 d67ba49109dfd654173b8d05f8602b99751066483a357c654b63ba46ec72d5c0/
drwx-----x  3 root root   4096 Aug  4 23:48 JM/
-rw-------  1 root root  32768 Aug  4 23:48 metadata.db

我们来小结一下

  • 指定挂载

-v 宿主机的绝对路径:容器路径

  • 具名挂载

-v 卷名:容器路径

  • 匿名挂载

作者:小魔童哪吒
链接:https://juejin.cn/post/6993495393338146852
来源:掘金

【Docker 系列】我们来看看容器数据卷到底是个啥相关推荐

  1. Marco's Java【Docker入门(四) 之 Dockerfile容器数据卷详解】

    前言 咱们上节已经接触过Dockerfile并使用Dockerfile创建容器数据卷,但是Dockerfile的作用远远不止如此! 因此本节会更深入的了解Dockerfile以及它的诸多使用方式, & ...

  2. Docker小白到实战之容器数据卷,整理的明明白白

    前言 上一篇把常用命令演示了一遍,其中也提到容器的隔离性,默认情况下,容器内应用产生的数据都是由容器本身独有,如果容器被删除,对应的数据文件就会跟着消失.从隔离性的角度来看,数据就应该和容器共存亡:但 ...

  3. Docker之快速搞定容器数据卷

      前面我们介绍了镜像和容器,通过镜像我们可以启动多个容器,但是我们发现当我们的容器停止获取删除后,我们在容器中的应用的一些数据也丢失了,这时为了解决容器的数据持久化,我们需要通过容器数据卷来解决这个 ...

  4. docker -用-v方式创建容器数据卷

    一.什么是容器数据卷 1.先回顾一下什么是镜像:是应用和应用所需要环境的一个包 2.数据:如果数据放在容器中,只要容器删除,那数据也就完蛋了,比如说费劲巴拉整了10000条测试用例放到容器里,结果别人 ...

  5. docker mysql data_Docker 安装mysql容器数据卷挂载到宿主机

    环境 Centos:7 Docker: 17.05-ce Mysql: 5.7 1. Mysql外部数据和配置文件路径 msyql配置文件路径:/etc/mysql mysql数据卷路径:/var/l ...

  6. 自己动手写Docker系列 -- 4.3实现volume数据卷

    简介 在上篇中对容器和镜像实现了进一步的文件隔离,是容器内的修改不影响到宿主机.本篇中将实现docker中的volume,提供持久化存储能力 源码说明 同时放到了Gitee和Github上,都可进行获 ...

  7. docker学习-基础篇6-docker容器数据卷-使用dockerfile

    使用dockerfile进行数据绑定 根目录下 #根目录下(ls /的目录下)创建一个mydocker文件夹 mkdir mydocker#进入mydocker文件夹 cd mydocker#编辑并创 ...

  8. docker入门,镜像,容器,数据卷,dockerfile,docker网络,springboot微服务打包docker镜像[狂神yyds]

    docker学习大纲 docker概述 docker安装 docker命令 镜像命令 容器命令 操作命令 - docker镜像 容器数据卷 dockerfile docker网络原理 IDEA整合do ...

  9. Docker系列 五.Docker容器数据卷

    五.Docker容器数据卷 环境&工具: 阿里云轻量级服务器.CentOS 7系统.FinalShell(其他连接客户端也可以) 是什么 docker的理念将运行的环境打包形成容器运行,运行可 ...

最新文章

  1. ubuntu 中vi的使用方法
  2. idea debug调试_大牛都会用的 IDEA 调试技巧!!!
  3. ibm服务器hyper-v搭建的虚拟机操作系统数据如何导出到本机,将虚拟机从Hyper-V转移到KVM|导出完整vhdx磁盘转换qcow2...
  4. linux之find命令,Linux基础知识之find命令详解
  5. 一个离开某门户网站人员自爆黑幕
  6. 【转】微软Azure Functions使用入门
  7. 移动应用开发商的生存之道
  8. mysql面试题分组并合并列
  9. 探讨【IGE】的源代码【二】。
  10. 利用python搭建socket server服务器
  11. [转]struct和class的区别 观察者模式 https连接 点击button收到点
  12. java企业员工管理系统_基于JavaWeb的企业员工信息管理系统的设计任务书
  13. flask-SQLAlchemy数据库密码加密
  14. 【NLP】Transformer框架原理详解-1
  15. mysql 删除恢复_MySQL之delete 忘加where条件误删除恢复
  16. Cascadeur笔记:导出非ASC II格式FBX的方法
  17. 微信聊天记录不小心被删了怎么办?看看如何恢复吧!
  18. DM36x IPNC远程升级
  19. 崔老哥python scrapy爬虫框架入门
  20. RabbitMQ与Erlang版本对应关系

热门文章

  1. GPT转MBR分区格式
  2. BQB 蓝牙无线技术
  3. 最新芒果TV视频下载方法-马赛克视频助手
  4. Shader学习第六篇:Lambert (兰伯特)光照模型
  5. C语言零基础入门习题(七)谁在说谎
  6. ubuntu16.04安装avago megaraid-9460-16i驱动(raid卡驱动)
  7. 【转载】谈SCI、EI、ISTP三大索引收录号的检索
  8. ubuntu gcc 安装 使用
  9. Pandas玩转数据(九) -- 时间序列的采样和画图
  10. matlab打开.mat文件