docker数据管理
一、概念
容器中的数据管理主要有两种方式
• 数据卷:容器内数据直接映射到本地主机环境
• 数据卷容器:使用特定容器维护数据卷
数据卷是一个可供容器使用的特殊目录,它将主机本地目录直接映射进容器,类似于mount动作。
数据卷容器也是一个容器,但是它的作用是专门提供数据卷给其它容器挂载。
二、数据卷基本操作
docker volume COMMAND
(1)创建数据卷
docker volume create [OPTIONS] [VOLUME]
参数 | 含义 |
---|---|
-d, --driver string | 指定卷驱动程序名称,默认为本地 |
-o, --opt map | 设置卷的自定义选项 |
注:创建的数据卷放在/var/lib/docker/volumes目录下,而数据是放在数据卷的_data目录里面。如果不指定卷的的名字会随机生成一串字符。
例:
创建一个名为test的数据卷,并配置容器将卷test挂载到/cp目录
root@cp:~# docker volume create test
test
root@cp:~# touch /var/lib/docker/volumes/test/_data/66
root@cp:~# docker run -it -v test:/cp ubuntu:latest
root@fd0e19633837:/# ls /cp
66
创建一个tmpfs数据卷,大小为100m,名字为test1。
root@cp:~# docker volume create -o type=tmpfs -o device=tmpfs -o o=size=100m test1
test1
root@cp:~# docker run -it -v test1:/cp ubuntu:latest
root@6c71bff0a0ce:/# cd cp/
root@6c71bff0a0ce:/cp# dd if=/dev/zero of=test_file count=1 bs=120M
dd: error writing 'test_file': No space left on device
1+0 records in
0+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.159968 s, 655 MB/s
root@6c71bff0a0ce:/cp# du -h
100M .
(2)列出数据卷
docker volume ls [OPTIONS]
参数 | 含义 |
---|---|
-f, --filter filter | 过滤输出信息 |
–format string | 使用Go模板美化打印输出信息 |
-q, --quiet | 仅输出数据卷的名字 |
例:
root@cp:~# docker volume ls
DRIVER VOLUME NAME
local test
local test1
local test2
local test3
使用-q选项只输出数据卷名字
root@cp:~# docker volume ls -q
test
test1
test2
test3
使用-f选项过滤列出的数据卷
root@cp:~# docker volume ls -f name=test[0-2]
DRIVER VOLUME NAME
local test1
local test2
(3)查看数据卷详细信息
docker volume inspect [OPTIONS] VOLUME [VOLUME...]
参数 | 含义 |
---|---|
-f, --format string | 使用Go模板打印出指定格式的列表。 |
例:
root@cp:~# docker volume inspect test1
[
{
"CreatedAt": "2019-07-28T19:37:16+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/test1/_data",
"Name": "test1",
"Options": {
"device": "tmpfs",
"o": "size=100m",
"type": "tmpfs"
},
"Scope": "local"
}
]
使用-f打印出指定格式的列表
root@cp:~# docker volume inspect test1 -f {{.CreatedAt}}
2019-07-28T19:37:16+08:00
root@cp:~# docker volume inspect test1 -f "{{.Name}}-{{.Options.o}}"
test1-size=100m
(4)删除数据卷
docker volume rm [OPTIONS] VOLUME [VOLUME...]
参数 | 含义 |
---|---|
-f, --force | 强制删除 |
例:
使用ls -q和rm -f强制删除所有的的数据卷
root@cp:~# docker volume rm -f `docker volume ls -q`
test
test1
test2
test3
(5)清理数据卷
docker volume prune [OPTIONS]
参数 | 含义 |
---|---|
–filter filter | 只清理符合过滤条件的镜像 |
-f, --force | 强制删除进行,而不进行提示确认 |
注:清理的对象是没有被用到的数据卷
例:
root@cp:~# docker volume prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
test
test1
test2
test3
Total reclaimed space: 0B
补充:
在使用run命令的时候还可以用-mount选项来创建使用数据卷
-mount选项支持三种类型的数据卷
• volume:普通数据卷,映射到/var/lib/docker/volumes路径下
• bind:绑定数据卷,映射到主机指定路径下
• tmpfs:临时数据卷,只存在于内存中
最初,-v用于独立容器,--mount用于群集服务。但是,从Docker 17.06开始,也可以使用--mount挂载独立容器。所以两者间基本没啥差异,一般来说, --mount更明确和详细。
例:
创建一个容器的同时创建并挂载数据卷/root/test-bind到/cp上。注意本地目录要存在。
root@cp:~# docker run -it --mount type=bind,source=/root/test-bind,destination=/cp ubuntu:latest
root@7c70af29b0ee:/# ls -d cp
cp
使用-v参数也可以达成这样的效果
root@cp:~# docker run -it -v /root/test:/cp ubuntu:latest
root@956db517a56c:/# ls -d cp
cp
三、数据卷容器基本用法
先创建一个数据卷容器dbdata,并同时创建一个test数据卷挂载到/cp上。
root@cp:~# docker run -it -v test:/cp --name dbdata ubuntu:latest
root@7e3d76aafb5b:/# ls -d cp
cp
然后可以再创建其它容器使使用–volumes-from来挂载dbdata容器中的数据卷。
root@cp:~# docker run -it --volumes-from dbdata --name db1 ubuntu:latest
root@46b1c5a28fbb:/# ls
bin boot cp dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
这个时候数据卷里的信息是同步的。二个容器任何一方写入,其它容器都可以看到。
四、利用数据卷容器来迁移数据
首先备份dbdata数据卷容器中的数据
root@cp:~# docker run --volumes-from dbdata -v $(pwd):/backup --name backup ubuntu:latest tar cvf /backup/backup.tar /cp
/cp/
/cp/66
tar: Removing leading `/' from member names
root@cp:~# ls
backup.tar
分析下这条命令,首先是创建了一个容器,其中要挂载要备份的数据卷也就是–volumes-from dbdata(映射在容器里为cp目录),然后使用-v选项把当前目录映射为这个容器里的/backup目录,接着用tar命令把cp目录打包放在/backup里,最后备份包就到了当前目录下。
恢复前面备份的数据到一个容器,首先要创建一个数据卷容器,然后再创建一个容器恢复数据到数据卷容器中。
root@cp:~# docker run -it -v dbdata:/cp --name dbdata ubuntu:latest
root@cp:~# docker run -it --volumes-from dbdata -v $(pwd):/recover --name recover ubuntu:latest tar xvf /recover/backup.tar -C /cp
cp/
cp/66
root@cp:~# docker attach b
root@b625f0475a72:/# cd cp
root@b625f0475a72:/cp# ls
cp
root@b625f0475a72:/cp# ls cp/
66
这样数据就恢复到了数据卷容器里去了,当然前面备份时也可以只打包里面的数据,目录就不会重复了。