volume的创建

为了能够保存(持久化)数据以及共享容器间的数据,Docker提出了Volume的概念.简单来说,Volume就是目录或者文件,它可以绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上.

我们可以通过两种方式来初始化Volume,这两种方式有些细小而又重要的差别.我们可以在运行时使用-v来声明Volume:

[root@node1 volume]# docker run -it --name container-test -h CONTAINER -v /data busybox /bin/sh

/ #

/ # ls /data

上面的命令会将/data挂载到容器中,并绕过联合文件系统,我们可以在主机上直接操作该目录.任何在该镜像/data路径的文件的文件都会被复制到Volume.我们可以使用docker inspect命令找到Volume在主机上的存储位置:

$docker inspect container-test

"Mounts": [

{

"Name": "6407cbb6700a4076cdeeef60629f1748ff34310102480a3f702fd3fee9e69134",

"Source": "/var/lib/docker/volumes/6407cbb6700a4076cdeeef60629f1748ff34310102480a3f702fd3fee9e69134/_data",

"Destination": "/data",

"Driver": "local",

"Mode": "",

"RW": true

}

],

这说明Docker把在/var/lib/docker下的某个目录挂载到了容器内的/data目录下.让我们从主机添加文件都此文件夹下:

root@node1:~# touch /var/lib/docker/volumes/6407cbb6700a4076cdeeef60629f1748ff34310102480a3f702fd3fee9e69134/_data/test-file

进入容器

root@node1:~# docker exec -it container-test /bin/sh

root@CONTAINER:/# ls /data/

test-file

只要将主机的目录挂载到容器的目录上,那改变就会立即生效.我们可以在Dockerfile中通过使用VOLUME指令来达到相同的目的:

FROM ubunut VOLUME /data

但是还有另一件只有-v参数能够做到而Dockerfile是做不到的事情就是在容器上挂载指定的主机目录.例如:

(冒号前面是主机的目录 : 冒号后面是docker容器的目录)

root@node1:~# docker run -v /data/mysql:/data/mysql busybox

该命令将挂载主机的/data/mysql目录到容器内的/data目录上.任何在/data/mysql目录下的文件都会出现在容器内.这对于在主机和容器之间共享文件是非常有用的,例如挂载需要编译的源代码.为了保证可移植性,挂载主机目录不需要从Dockerfile指定.当使用-v参数时,镜像目录下的任何文件都不会被复制到Volume中.

数据共享

如果要授权一个容器访问另一个容器的Volume,我们可以使用-volumes-from参数来执行docker run

root@node1:~# docker run -it -h NEWCONTAINER --volumes-from container-test busybox /bin/bash

root@NEWCONTAINER:/# ls /data/

test-file

值得注意的是,就算你这个时候把container-test停止了,它仍然会起作用.只要有容器连接Volume,他就不会被删除,如果这个时候你执行:

root@node1:~# docker rm container-test

Error response from daemon: Conflict, You cannot remove a running container. Stop the container before attempting removal or use -f

Error: failed to remove containers: [container-test]

数据容器

通常使用数据容器来持久化数据库和数据文件。

$ docker run --name dbdata mysql echo "data only"

创建了一个名为dbdata的数据容器,运行完echo之后就停止了。数据容器是不需要运行的,只要创建好了就可以了。

$ docker run -d --volumes-from dbdata --name db1 mysql

启动一个数据库服务容器,连接到dbdata数据容器上。

注意:

数据容器不需运行,纯粹是在浪费资源

不需为数据容器单独使用一个小的镜像,直接使用数据库镜像本身就可以了

删除Volumes

这个功能太重要了,如果你已经使用docker run来删除你的容器,那可能会有很多孤立的Volume仍在占用着空间.

Voulume可以被删除的条件:

1.该容器可以用docker rm -v来删除且没有其他容器连接到该Volume(以及主机目录是也没被指定为Volume).注意,-v是必不可少的.

2.docker run中使用rm参数.

数据备份

如果要备份mysql数据库,我们需要备份数据容器中的/var/lib/mysql文件夹。

$ docker run --rm --volumes-from dbdata -v $(pwd):/backup ubuntu tar zcvf /backup/mysql.tar.gz /var/lib/mysql

此时就会在当前目录下生成一个mysql.tar.gz文件。

docker volume mysql_docker volume的理解相关推荐

  1. docker mysql volum_Docker Volume

    什么是数据卷Volume呢? 首先需要明确Docker内的文件系统是如何工作的,Docker镜像被存储在一系列的只读层. Docker镜像是由多个文件系统(只读层)叠加而成,当启动一个容器的时候,Do ...

  2. 解决 Windows Docker 安装 Gitlab Volume 权限问题

    解决 Windows Docker 安装 Gitlab Volume 权限问题 参考文章: (1)解决 Windows Docker 安装 Gitlab Volume 权限问题 (2)https:// ...

  3. Docker Networking Data Volume

    Overlay Network 叠加网络 Docker Network Docker 安装完成后有三种网络 bridge host none ~]#docker network ls NETWORK ...

  4. Docker - Docker Volume及Volume命令详解

    Docker - Docker Volume及Volume命令详解 什么是数据卷(Volume) Docker镜像被存储在一系列的只读层中.当我们创建一个容器时,Docker会读取镜像(只读),并在其 ...

  5. Docker数据管理 Named volume

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Dock ...

  6. Docker存储卷(Volume)

    简介 想要了解Docker Volume,首先我们需要知道Docker的文件系统是如何工作的.Docker镜像是由多个文件系统(只读层)叠加而成.当我们启动一个容器的时候,Docker会加载只读镜像层 ...

  7. docker中的Volume

    简介 ​ Volume是计算机存储技术中的一个术语,用于表示一块独立的存储空间.在操作系统中,一个硬盘可以被分为多个分区,每个分区可以被格式化为一个独立的卷,这个卷就被称为Volume. Volume ...

  8. 08. Volume Framework||Volume Profile

    可以对照着现有文档观看,如果有误,已现有官方文档为准 文章目录 Volume Profile Creating and customizing a Volume Profile / 创建和自定义Vol ...

  9. 09. Volume Framework||Volume Overrides

    可以对照着现有文档观看,如果有误,已现有官方文档为准 文章目录 Volume Overrides Using Volume Overrides Volume Overrides Volume Over ...

  10. docker mysql volum_docker volume 使用

    docker volume 可以理解成一个container中的磁盘,既可以跟随container的生命周期(在Dockerfile 中定义使用VOLUME关键字),也可以单独创建,永久存储,直到用d ...

最新文章

  1. matlab程序崩溃怎么解决,java – 如何避免MATLAB崩溃打开太多的数字?
  2. Nginx解决跨域问题的具体实现
  3. mynewt 编译环境搭建
  4. Javafx的WebEngine的url加载不输出结果坑,gc回收了局部变量
  5. flush privileges
  6. .net 事务处理的三种方法
  7. 今天的在一旁看电视的蜡笔小新
  8. JAVA中整数类型数据溢出问题研究
  9. linux PCI驱动调用字符设备驱动方式
  10. hive join on 条件 与 where 条件区别
  11. SQL分页查询的写法总结-MySQL、SQL Server、Oracle
  12. matlab矩阵的函数,MATLAB矩阵运算函数
  13. C++泛型编程基本概念
  14. 发送短信功能-联通接口
  15. 电影下载合并教程 (转)
  16. matlab牛顿法求区间根程序,MATLAB用二分法、不动点迭代法及Newton迭代(切线)法求非线性方程的根...
  17. Java基础 —— 编程入门
  18. 电信高清语音服务器,电信VoLTE高清通话来了,来电秒接通、打电话4G不掉线!...
  19. pps服务器没有响应,为什么pps服务器未响应,停止播放我家用的是Avira AntiVir 控制中心...
  20. 计算机职称证书退休工资,职称就像是一座大山,相同教龄不同职称的教师退休工资相差多少?...

热门文章

  1. 一文总结熵,交叉熵与交叉熵损失
  2. 20191104_1_相关性分析
  3. 面向对象编程——实战1
  4. 深度学习-激活函数总结
  5. 据说学会这款数据分析工具,会被各大名企高薪哄抢
  6. 测试的第一重境界:围着Bug转
  7. 你是否需要购买网站重构?
  8. 机器学习:维度灾难(Curse of Dimensionality)
  9. python模块:时间处理模块
  10. svn拉取文件失败_转自: linux svn命令行无法拉取中文名称的文件