docker volume的理解

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文件。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转载自 http://blog.opskumu.com/docker.html 一、Docker 简介 Docke...
    极客圈阅读 10,543评论 0 120
  • 五、Docker 端口映射 无论如何,这些 ip 是基于本地系统的并且容器的端口非本地主机是访问不到的。此外,除了...
    R_X阅读 1,796评论 0 7
  • 亲爱的女儿,你即将进入小学了,这是你人生的一次说重要也不是最重要的转折,爸爸有些话想对你说,在未来的5、6年中爸爸...
    肥鱼胡说阅读 15,791评论 2 3
  • 又是一年的5月,也又到了一年一度吃樱桃的时节。樱桃的时令大约有一周左右,珍稀度堪比昙花。如果不小心错过了时节,也只...
    易萧萧阅读 324评论 0 0
  • 斐波那契数列与黄金比例 但凡喜欢美术、设计或是数学的人,一定都对“斐波那契”这四个字有一定的了解。 斐波那契是生活...
    simoncos阅读 6,129评论 5 32