2018-05-02 深入理解Docker Volume

想要了解Docker

Volume,首先我们需要知道Docker的文件系统是如何工作的.Docker镜像是由多个文件系统(只读层)叠加而成.当我们启动一个容器的时候,Docker会加载镜像层并在其上添加一个读写层.如果运行中的容器修改了现有的一个已存在的文件,那该文件将会从读写层下的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏.当删除Docker容器,并通过该镜像重新启动时,之前的更改将会丢失.Docker,只读层以及在顶部的读写层的组合被称为Union

FIle System(联合文件系统).

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

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

1.       root@syx-VB:/home/syx#dockerrun -it --name container-test -h CONTAINER -v /data ubuntu /bin/bash

2.       root@CONTAINER:/# ls /data/

3.       root@CONTAINER:/#

root@syx-VB:/home/syx#dockerrun -it --name container-test -h CONTAINER -v /data ubuntu /bin/bash

root@CONTAINER:/# ls /data/

root@CONTAINER:/#

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

inspect命令找到Volume在主机上的存储位置:

1.       $dockerinspect container-test

2.       "Mounts": [

3.       {

]4.       "Name": "6407cbb6700a4076cdeeef60629f1748ff34310102480a3f702fd3fee9e69134",

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

6.       "Destination": "/data",

7.       "Driver": "local",

8.       "Mode": "",

9.       "RW": true

10.   }

11.   ],

$dockerinspect container-test

"Mounts": [

{

"Name": "6407cbb6700a4076cdeeef60629f1748ff34310102480a3f702fd3fee9e69134",

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

"Destination": "/data",

"Driver": "local",

"Mode": "",

"RW": true

}

],

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

1.       root@syx-VB:~# touch /var/lib/docker/volumes/6407cbb6700a4076cdeeef60629f1748ff34310102480a3f702fd3fee9e69134/_data/test-file

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

进入容器

1.       root@syx-VB:~#dockerattach container-test

2.       root@CONTAINER:/# ls /data/

3.      test-file

root@syx-VB:~#dockerattach container-test

root@CONTAINER:/# ls /data/

test-file

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

1.       FROM ubunut VOLUME /data

FROM ubunut VOLUME /data

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

1.       root@syx-VB:~#dockerrun -v /home/syx/dockerfile:/data ubuntu ls /data

2.       df_test1

root@syx-VB:~#dockerrun -v /home/syx/dockerfile:/dataubuntu ls /data

df_test1

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

数据共享

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

1.       root@syx-VB:~#dockerrun -it -h NEWCONTAINER --volumes-from container-test ubuntu /bin/bash

2.       root@NEWCONTAINER:/# ls /data/

3.       test-file

root@syx-VB:~#dockerrun -it -h NEWCONTAINER--volumes-from container-test ubuntu /bin/bash

root@NEWCONTAINER:/# ls /data/

test-file

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

1.      root@syx-VB:~#dockerrm container-test

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

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

root@syx-VB:~#dockerrm container-test

Error response from daemon: Conflict, Youcannot remove a running container. Stop the container before attempting removalor use -f

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

数据容器

常见的使用场景是使用纯数据容器来持久化数据库,配置文件或者数据文件等.例如:

1.      $dockerrun --name dbdate postgres echo “Data-Only container for postgres”

$dockerrun --name dbdate postgres echo“Data-Only container for postgres”

该命令将会创建一个已经包含在Dockerfile里定义过Volume的postgres镜像,运行echo命令然后退出.当我们运行docker

ps命令时,echo可以帮助我们识别某镜像的用途.我们可以用-volume-from命令来识别其他容器的Volume:

1.       $dockerrun -d --volumes-from dadate --name db1 postgres

$dockerrun -d --volumes-from dadate--name db1 postgres

使用数据容器的两个注意点:

1.不要运行数据容器,这纯属是在两非自愿

2.不要为了数据容器而使用最小的镜像”,busyboxscratch,只使用数据库镜像本身就可以了.你已经拥有了该镜像,所以不需要占用额外的空间.

备份

如果你在用数据容器,那做备份是相当容易的.

1.       root@syx-VB:~#dockerrun --rm --volumes-from dbdate -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /var/lib/postgresql/data

root@syx-VB:~#dockerrun --rm --volumes-from dbdate -v$(pwd):/backup ubuntu tar cvf /backup/backup.tar /var/lib/postgresql/data

该命令会将Volume里所有的东西压缩为一个tar包(官方的postgres

Dockerfile在/var/lib/postgresql/data目录下定义了一个Volume).

1.      root@syx-VB:~# ls

2.       backup.tar


root@syx-VB:~# ls

backup.tar

删除Volumes

这个功能太重要了,如果你已经使用docker

run来删除你的容器,那可能会有很多孤立的Volume仍在占用着空间.

Voulume可以被删除的条件:

1.该容器可以用docker

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

2.dockerrun中使用rm参数.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,012评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,589评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,819评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,652评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,954评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,381评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,687评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,404评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,082评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,355评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,880评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,249评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,864评论 3 232
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,007评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,760评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,394评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,281评论 2 259

推荐阅读更多精彩内容

  • 转载自 http://blog.opskumu.com/docker.html 一、Docker 简介 Docke...
    极客圈阅读 10,404评论 0 120
  • 五、Docker 端口映射 无论如何,这些 ip 是基于本地系统的并且容器的端口非本地主机是访问不到的。此外,除了...
    R_X阅读 1,670评论 0 7
  • 一、Docker 简介 Docker 两个主要部件:Docker: 开源的容器虚拟化平台Docker Hub: 用...
    R_X阅读 4,342评论 0 27
  • Docker学习总结之Run命令介绍 - vikings`s blog - 博客园http://www.cnblo...
    葡萄喃喃呓语阅读 1,118评论 0 1
  • 我是一坨牛粪,生活在偏远的地方,任风吹雨打,无怨世执念,生活本美,满是芬芳。感上天恩赐,头顶的鲜花,真美。我愿集全...
    李修名阅读 828评论 2 3