Docker(五)之数据卷
2018-04-26
约 1728 字
预计阅读 4 分钟
次阅读
简介
容器有时候需要使用数据库,但是又希望它的数据能保存在本地,Docker
中提供了数据卷可以供你方便的操作数据;
数据卷是一个可供一个或多个容器使用的特殊目录,可以提供很多有用的特性:
数据卷可以在容器之间共享和重用;
对数据卷的修改会立即生效;
对数据卷的更新,不会影响镜像;
数据卷默认会一直存在,即使容器已被删除;
数据卷(Data Volumes
):容器内数据直接映射到本地主机环境,你讲会学到如何在容器内创建数据卷,并且把本地的目录或文件挂载到容器内;
数据卷容器(Data Volume Containers
):使用特定的容器维护数据卷,你将学到如何使用数据卷容器在容器和主机、容器和容器之间共享数据,并实现数据的备份和恢复;
实验环境
宿主机:Ubuntu-14.04_X64
;
Docker
:1.12.6
;
数据卷
拉取镜像
方式一
该操作会在容器内创建一个/data
目录,并加载一个数据卷到容器的/data
目录;
1
$ docker run -d -it --name busybox_1 -v /data/ busybox
获取挂载信息
1
2
$ docker exec -it busybox_1 /bin/sh
$ ls -l /data
1
2
# 形如:/var/lib/docker/volumes/<Container-ID>/_data
$ docker inspect -f '{{ .Mounts }}' busybox_1
此时无论在映射目录还是在容器目录中操作数据,数据都是同步的;
数据卷的使用,类似于Linux
下对目录或文件进行mount
,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的数据卷;
数据卷是被设计用来持久化数据的,它的生命周期独立于容器,Docker
不会在容器被删除后自动删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷。
若需要在删除容器的同时移除数据卷,可以在删除容器的时候使用docker rm -v
命令;
1
2
$ docker stop CONTAINER
$ docker rm -v CONTAINER
方式二(推荐)
使用-v
选项也可以指定挂载一个本地主机的目录到容器中作为数据卷,相较方式一,这样更便于操作:
1
$ docker run -it --name busybox_2 -v /data:/data busybox /bin/sh
1
docker run --rm -it --name busybox_3 -v /data:/data:ro busybox sh
方式三
使用-v
选项也可以指定挂载一个本地文件到容器中作为数据卷;
1
$ docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
如此就可以记录在容器中输入的命令历史了,如果直接挂载文件到容器中,当在容器中修改文件时,可能造成文件的inode
改变,而导致报错;
故不推荐挂载文件到容器中并修改文件,可以选择以只读方式挂载文件到容器中作为数据卷。
数据卷容器
使用方式
若有一些持续更新的数据需要在容器之间共享,建议创建数据卷容器;
创建数据卷容器:
1
$ docker run -d -it -v /data:/data/ --name busybox_data_1 busybox
在其他容器中使用-volumes-from
来挂载dbdata
容器中的数据卷;
1
2
$ docker run -d -it --volumes-from busybox_data_1 --name busybox_4 busybox
$ docker run -d -it --volumes-from busybox_data_1 --name busybox_5 busybox
此时容器busybox_4
与busybox_5
都挂载了同一个数据卷,即/data
目录,并且它们之间是同步的;
同时还允许使用多个--volumes-from
来挂载来自多个容器的多个数据卷;
使用--volumes-from
选项所挂载数据卷的容器,本身并不需要保持在运行状态;
在数据卷容器在创建时,可以选择创建数据卷中三种方式的任意一种;
备份数据
首先利用busybox
镜像创建1个容器worker
,使用--volumes-from
选项挂载数据卷容器busybox_data
;
使用-v
选项挂载本地目录/backup
到worker
容器目录/backup
;
启动成功后,执行tar -cvf /backup/backup.tgz /data
命令,将/data
目录下的内容备份到/backup/backup.tgz
,即宿主机的/backup/backup.tgz
;
1
2
# 忽略警告:tar: removing leading '/' from member names
$ docker run --rm --volumes-from busybox_data_1 -v /backup:/backup busybox tar -cvf /backup/backup.tgz /data
还原数据
若还原数据到一个容器,首先创建一个带有空数据卷的容器busybox_data_2
;
1
$ docker run -d -it -v /data2:/data --name busybox_data_2 busybox
创建新的容器,挂载busybox_data_2
容器卷中的数据卷,并使用tar
解压备份文件到挂载的容器卷中;
1
$ docker run --rm --volumes-from busybox_data_2 -v /backup:/backup busybox tar -xvf /backup/backup.tgz -C /
为了查看/验证还原的数据,可以再启动一个容器挂载同样的容器卷来查看;
1
$ docker run --volumes-from busybox_data_2 --name busybox_6 busybox /bin/ls /data