• Post author:
  • Post category:docker
Like
Like Love Haha Wow Sad Angry

一、概念

 容器中的数据管理主要有两种方式
   • 数据卷:容器内数据直接映射到本地主机环境
   • 数据卷容器:使用特定容器维护数据卷

 数据卷是一个可供容器使用的特殊目录,它将主机本地目录直接映射进容器,类似于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

这样数据就恢复到了数据卷容器里去了,当然前面备份时也可以只打包里面的数据,目录就不会重复了。

Like
Like Love Haha Wow Sad Angry