卷(Volume)
众所周知卷(Volume)是容器中的一个数据挂载点,卷可以绕过联合文件系统,从而为Docker 提供持久数据,所提供的数据还可以在宿主机-容器或多个容器之间共享。通过卷,我们可以可以使修改数据直接生效,而不必重新构建镜像。
一、数据卷
数据卷是一个可以绕过联合文件系统的,专门指定的可在一或多个容器间共享目录。卷为提供为持久化或共享数据提供了一些有用的特性。
数据卷设计的初哀是提供持久化数据,而与容器的生命周期无关。因此,在删除容器时,Docker不会自动删除卷,直到没有容器再引用。
1.1 添加数据卷
可以在docker create
和docker create
命令创建容器时,通过-v参数为容器添加数据卷。-v参数参数可以多次使用,以添加多个数据卷。
如,可以像下面这样为容器添加一个卷:
$ sudo docker run -t -i -v /home/test --name test itbilu/test /bin/bash
这样就会在容器内/webapp位置创建一个卷。
除了在创建容器时添加数据卷外,还可以通过Dockerfile文件中通过Volume指令添加,Volume可以多次使用以添加多个数据卷。
说明:本文中使用的示例镜像(itbilu/test)通过以下Dockerfile文件创建:
# Version: 0.0.3 FROM ubuntu:16.04 MAINTAINER 何民三 "cn.liuht@gmail.com" RUN apt-get update RUN apt-get install -y nginx RUN echo 'Hello World, 我是个容器' \ > /var/www/html/index.html RUN mkdir /home/itbilu/ ENV ITBILU_PATH /home/itbilu/ VOLUME [$ITBILU_PATH] EXPOSE 80
1.2 卷位置
添加卷后,可以通过docker inspect
来查看数据卷在容器中的位置:
$ sudo docker inspect test
docker inspect
可以用来查看容器或镜像的详细配置信息。可以在容器的Mounts节点下,查看容器的卷信息:
... "Mounts": [{ "Type": "volume", "Name": "5f869c580c06e6079b0de2c5ce682c1c9467286c76b506703d87bf11d1271c24", "Source": "/var/lib/docker/volumes/5f869c580c06e6079b0de2c5ce682c1c9467286c76b506703d87bf11d1271c24/_data", "Destination": "/home/test", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" }, { "Type": "volume", "Name": "e4fd6c3a91ba2e03b14cf174c2023f366abbe9f2f73ca07e6bac223f68e47773", "Source": "/var/lib/docker/volumes/e4fd6c3a91ba2e03b14cf174c2023f366abbe9f2f73ca07e6bac223f68e47773/_data", "Destination": "[/home/itbilu/]", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" }], ...
在以上示例中,有两个挂载卷,一个是在docker run
创建容器时创建的,而另一个是在创建运行容器镜像的Dockerfile文件中通过VOLUME指令创建。其中,Source表示宿主机源文件位置,Destination表示数据卷在容器中的挂载位置,而RW表示卷是否可读/写。
1.3 挂载本地数据到容器数据卷
在前面示例中,我们运行容器时并没有指定要挂载到容器中数据卷的本地目录,所在Docker使用一个默认数据目录。 -v
参数除了可以在容器中创建数据卷外,还可以将宿主机中的目录挂载到容器中的数据卷。
如,运行容器,并将本地的~/code/itbilu目录挂载到容器的/home/itbilu数据卷上:
$ sudo docker run -t -i -v ~/code/itbilu:/home/itbilu --name test itbilu/test /bin/bas
注意:挂载本地目录到容器内的挂载目录时,如果容器内的数据卷中已经存在数据,那么本地内容将与数据卷中的数据重叠,而不会删除数据。
其中,容器目录必须使用绝对路径,而本地目录可以使用绝对路径或其它形式。
挂载共享存储
除了可以载挂本地目录到容器数据卷外,一些Docker卷插件让你可以挂载共享存储到容器的数据卷,如:iSCSI、NFS、FC。使用共享卷的好处是它们是独立于主机的,这意味着,只要有访问共享存储权限,并安装插件,就可以在任何容器上启动卷。
详细参考:
Mount a shared-storage volume as a data volume
挂载本地文件到容器数据卷
-v
参数不仅可挂载目录,还可以挂载单个文件。如:
$ sudo docker run -t -i -v ~/.bash_history:/root/.bash_history --name test itbilu/test /bin/bash
以上会把本地的~/.bash_history文件挂载到新容器中,这样你就可以在容器内访问宿主上的bash历史记录。
二、数据卷容器
如果你有一些要在容器之间共享的持久性数据,或者希望在非持久容器中使用,那么最好创建一个命名的数据卷容器,然后从其挂载数据。
接下来,我们创建一个新的命名的共享容器。这个容器不运行一个应用程序,它利用training/postgres镜像在所有的容器之间创建了一个共享层,以节省磁盘空间。
$ sudo docker create -v /dbdata --name dbstore training/postgres /bin/true
注意:training/postgres是Docker 官方文档中提供的一个镜像,本文拿来直接使用了。
使用数据卷容器
创建数据卷容器后,我们可以通过--volumes-from
选项,将一个数据容器挂载到其它容器:
$ sudo docker run -d --volumes-from dbstore --name db1 training/postgres
也可以在多个容器间共享。如,挂载到另一个容器:
$ sudo docker run -d --volumes-from dbstore --name db2 training/postgres
这时,如果training/postgres镜像内有名/dbdata的目录,则会从dbstore容器挂载卷,并会隐藏training/postgres镜像中/dbdata下的文件。最终只有dbstore容器中的文件可见。
还可以扩展挂载链,从已经存在的dbstore容器(如:db1、db2)来挂载卷:
$ sudo docker run -d --name db3 --volumes-from db1 training/postgres
这种情况下,如果移除己挂载卷的容器,无论是最初的dbstore容器,还是其后的db1或db2容器,卷都不会被移除。要将卷从硬盘上移除,必须使用docker rm -v
命令删除最后一个引用了该卷的容器。
三、备份、恢复与迁移数据卷
除上述操作外,数据卷的常用操作还有数据卷备份、恢复、合并操作。以下是一些常用操作:
3.1 备份数据卷
在前面介绍数据卷容器时,我们创建了一个名为dbdata容器,并在容器中创建了一个/dbdata的数据卷。接下来,可以在创建容器使用--volumes-from
参数来挂载这个数据卷,并对数据进行备份:
$ sudo docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
在这个操作中,我们通过ubuntu镜像创建了一个容器,创建容器时通过--volumes-from
参数共享了数据卷容器中的数据,并将当前目录($(pwd) )挂载到了数据卷中。容器运行后,使用tar命令对数据卷进行了备份。
命令执行结束后,容器就会停止,之后就可以在本地当前操作目录下找到所备份的数据。
3.2 备份数据卷
数据备份后,可以在创建容器恢复备份数据到容器内的数据卷中,从而实现数据的迁移。
首先,创建并运行容器并添加一个数据卷:
$ sudo docker run -i -t -v /dbdata --name dbdata2 ubuntu /bin/bash
然后通过tar
命令恢复备份数据:
$ sudo docker run --rm --volumes-from dbdata2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"
这样,数据就被恢复到了容器dbdata2的/dbdata目录下,我们可以容器中操作和使用这些数据。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新动态
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]