一、使用容器的数据管理原因
1. 对数据进行持久化
2. 在多个容器之间进行数据共享
容器中的管理数据的两种方式:数据卷—容器内的数据直接映射到本地主机环境;数据卷容器—使用特定容器维护数据卷
二、数据卷
数据卷是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射到容器,类似Linux的mount行为。
1.创建数据卷
[root@web01 ~]# docker volume create -d local test
test
[root@web01 ~]# ll /var/lib/docker/volumes/
total 24
-rw------- 1 root root 32768 Sep 12 18:09 metadata.db
drwxr-xr-x 3 root root 19 Sep 12 18:09 test
其他命令
查看数据卷列表: docker volume ls
删除一个数据卷: docker volume rm
查看一个数据卷的属性: docker volume inspect
清理无用的卷:docker volume prune
[root@web01 ~]# docker volume ls
DRIVER VOLUME NAME
local test
[root@web01 ~]# docker volume inspect test
[
{
"CreatedAt": "2020-09-12T18:09:45+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/test/_data",
"Name": "test",
"Options": {},
"Scope": "local"
}
]
#将test卷挂载在容器上
[root@web01 ~]# docker run -d -p 8080:80 -v test:/usr/share/nginx/html nginx:latest
bf31b432b674c736c7998023f65b208a2070d59301c2b9d03a5bb4ab01f248fa
[root@web01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bf31b432b674 nginx:latest "/docker-entrypoint.…" 11 seconds ago Up 8 seconds 0.0.0.0:8080->80/tcp reverent_bardeen
[root@web01 ~]# cd /var/lib/docker/volumes/test/_data
[root@web01 _data]# ll
total 8
-rw-r--r-- 1 root root 494 Aug 11 22:50 50x.html
-rw-r--r-- 1 root root 612 Aug 11 22:50 index.html
#删除原有的文件,重新编写自己的文件
[root@web01 _data]# rm -rf *
[root@web01 _data]# vim index.html
[root@web01 _data]# cat index.html
hello world!
#刷新页面,查看结果
#删除容器,重新启动新容器查看数据是否还在
[root@web01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bf31b432b674 nginx:latest "/docker-entrypoint.…" 12 minutes ago Up 12 minutes 0.0.0.0:8080->80/tcp reverent_bardeen
[root@web01 ~]# docker stop bf31b432b674
bf31b432b674
[root@web01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bf31b432b674 nginx:latest "/docker-entrypoint.…" 13 minutes ago Exited (0) 2 seconds ago reverent_bardeen
[root@web01 ~]# docker rm `docker ps -a -q`
bf31b432b674
[root@web01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@web01 ~]# docker run -d -p 8081:80 -v test:/usr/share/nginx/html nginx:latest
af36acedd25c29bd96479c60022a9784b7497bff199af8141b524850da969d5e
[root@web01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
af36acedd25c nginx:latest "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 0.0.0.0:8081->80/tcp ecstatic_tu
数据没有丢失!!!
2. 绑定数据卷
在创建容器时将主机本地的任意路径挂载到容器内作为数据卷,这种形式创建的数据卷称为绑定数据卷。
在使用docker run 命令的时候,可以使用-mount 选项来使用数据卷。
-mount选项支持三种类型的数据卷,包括:volume(普通数据卷,映射到主机/var/lib/docker/volumes路径下),bind(绑定数据卷,映射到主机指定的路径),tmpfs(临时数据卷,只存在于内存中)。
#本地创建目录
[root@web01 ~]# cd /opt
[root@web01 opt]# mkdir test01
[root@web01 opt]# cd test01
[root@web01 test01]# vim index.html
[root@web01 test01]# cat index.html
<h1>
welcome to learn Linux!
</h1>
#启动容器
[root@web01 test01]# docker run -d -p 8082:80 -v /opt/test01:/usr/share/nginx/html nginx:latest
48bda97cd0cfafa3072bbc685722ae230840e42dd073fa15f91157d63b6341df
[root@web01 test01]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
48bda97cd0cf nginx:latest "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 0.0.0.0:8082->80/tcp brave_kalam
af36acedd25c nginx:latest "/docker-entrypoint.…" 5 minutes ago Up 5 minutes 0.0.0.0:8081->80/tcp ecstatic_tu
三、数据卷容器
数据卷容器也是一个容器,它的目的是专门提供数据卷给其他容器挂载
1. 创建一个数据卷容器,并且在其中创建一个数据卷挂载到/dbdata
[root@web01 ~]# docker run -it -v /dbdata --name dbdata centos:6.8
[root@fbf8fd9bedb0 /]# ll
total 20
dr-xr-xr-x 2 root root 4096 Jun 2 2016 bin
drwxr-xr-x 2 root root 6 Sep 12 10:49 dbdata
drwxr-xr-x 5 root root 360 Sep 12 10:49 dev
drwxr-xr-x 1 root root 66 Sep 12 10:49 etc
drwxr-xr-x 2 root root 6 Sep 23 2011 home
dr-xr-xr-x 7 root root 81 Jun 2 2016 lib
dr-xr-xr-x 5 root root 8192 Jun 2 2016 lib64
drwx------ 2 root root 6 Jun 2 2016 lost+found
drwxr-xr-x 2 root root 6 Sep 23 2011 media
drwxr-xr-x 2 root root 6 Sep 23 2011 mnt
drwxr-xr-x 2 root root 6 Sep 23 2011 opt
dr-xr-xr-x 121 root root 0 Sep 12 10:49 proc
dr-xr-x--- 2 root root 159 Jun 2 2016 root
dr-xr-xr-x 2 root root 4096 Jun 2 2016 sbin
drwxr-xr-x 2 root root 6 Jun 2 2016 selinux
drwxr-xr-x 2 root root 6 Sep 23 2011 srv
dr-xr-xr-x 13 root root 0 Sep 12 10:49 sys
drwxrwxrwt 2 root root 46 Jun 2 2016 tmp
drwxr-xr-x 13 root root 155 Jun 2 2016 usr
drwxr-xr-x 17 root root 197 Jun 2 2016 var
[root@fbf8fd9bedb0 /]# ll /dbdata/
total 0
2. 在其他容器上挂载dbdata容器中的数据卷
[root@web01 ~]# docker run -it --volumes-from dbdata --name db1 centos:6.8
[root@ecfc16b3a8ff /]#
[root@web01 ~]# docker run -it --volumes-from dbdata --name db2 centos:6.8
[root@da4b3349e959 /]#
3. 在dbdata容器上创建一个test01文件
[root@fbf8fd9bedb0 /]# cd dbdata/
[root@fbf8fd9bedb0 dbdata]# touch test01
[root@fbf8fd9bedb0 dbdata]# ll
total 0
-rw-r--r-- 1 root root 0 Sep 12 10:52 test01
在db1和db2容器内查看
[root@ecfc16b3a8ff /]# ll /dbdata/
total 0
-rw-r--r-- 1 root root 0 Sep 12 10:52 test01
[root@da4b3349e959 /]# ll dbdata/
total 0
-rw-r--r-- 1 root root 0 Sep 12 10:52 test01
注:使用--volume-from 参数所挂载数据卷的容器自身并不需要保持在运行状态
如果删除了挂载的容器(如dbdata),数据卷并不会自动删除。要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显示使用docker rm -v命令来指定同时删除关联的容器
#删除dbdata数据卷容器
[root@web01 ~]# docker rm dbdata
dbdata
[root@web01 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
da4b3349e959 centos:6.8 "/bin/bash" 16 hours ago Exited (0) 16 hours ago db2
ecfc16b3a8ff centos:6.8 "/bin/bash" 16 hours ago Up About a minute db1
48bda97cd0cf nginx:latest "/docker-entrypoint.…" 17 hours ago Exited (0) 5 minutes ago brave_kalam
af36acedd25c nginx:latest "/docker-entrypoint.…" 17 hours ago Exited (0) 5 minutes ago ecstatic_tu
#查看db1容器数据卷是否还在
[root@web01 ~]# docker exec -it db1 /bin/bash
[root@ecfc16b3a8ff /]# ll
total 20
dr-xr-xr-x 2 root root 4096 Jun 2 2016 bin
drwxr-xr-x 2 root root 20 Sep 12 10:52 dbdata
drwxr-xr-x 5 root root 360 Sep 13 03:17 dev
drwxr-xr-x 1 root root 66 Sep 12 10:51 etc
drwxr-xr-x 2 root root 6 Sep 23 2011 home
dr-xr-xr-x 7 root root 81 Jun 2 2016 lib
dr-xr-xr-x 5 root root 8192 Jun 2 2016 lib64
drwx------ 2 root root 6 Jun 2 2016 lost+found
drwxr-xr-x 2 root root 6 Sep 23 2011 media
drwxr-xr-x 2 root root 6 Sep 23 2011 mnt
drwxr-xr-x 2 root root 6 Sep 23 2011 opt
dr-xr-xr-x 115 root root 0 Sep 13 03:17 proc
dr-xr-x--- 1 root root 27 Sep 12 10:58 root
dr-xr-xr-x 2 root root 4096 Jun 2 2016 sbin
drwxr-xr-x 2 root root 6 Jun 2 2016 selinux
drwxr-xr-x 2 root root 6 Sep 23 2011 srv
dr-xr-xr-x 13 root root 0 Sep 12 10:49 sys
drwxrwxrwt 2 root root 46 Jun 2 2016 tmp
drwxr-xr-x 13 root root 155 Jun 2 2016 usr
drwxr-xr-x 17 root root 197 Jun 2 2016 var
[root@ecfc16b3a8ff /]# ll dbdata/
total 0
-rw-r--r-- 1 root root 0 Sep 12 10:52 test01
三、利用数据卷容器迁移数据
可以利用数据卷容器对其中的数据卷进行备份、恢复以及实现数据的迁移
1.创建数据卷容器
[root@web01 ~]# docker run -it -v /dbdata --name dbdata centos:6.8
[root@ba74939c6679 /]# ll dbdata/
total 0
[root@ba74939c6679 /]# echo "hello world" >dbdata/test01.txt
[root@ba74939c6679 /]# ll dbdata/
total 4
-rw-r--r-- 1 root root 12 Sep 13 03:30 test01.txt
[root@ba74939c6679 /]# touch dbdata/test0{2..5}.log
[root@ba74939c6679 /]# ll dbdata/
total 4
-rw-r--r-- 1 root root 12 Sep 13 03:30 test01.txt
-rw-r--r-- 1 root root 0 Sep 13 03:31 test02.log
-rw-r--r-- 1 root root 0 Sep 13 03:31 test03.log
-rw-r--r-- 1 root root 0 Sep 13 03:31 test04.log
-rw-r--r-- 1 root root 0 Sep 13 03:31 test05.log
2. 备份数据
备份/dbdata数据卷容器内的数据
[root@web01 ~]# docker run --volumes-from dbdata -v $(pwd):/backup --name backup centos:6.8 tar cvf /backup/backup.tar /dbdata
tar: Removing leading `/' from member names
/dbdata/
/dbdata/test01.txt
/dbdata/test02.log
/dbdata/test03.log
/dbdata/test04.log
/dbdata/test05.log
[root@web01 ~]# ll
total 16
-rw-------. 1 root root 1604 May 24 17:40 anaconda-ks.cfg
-rw-r--r-- 1 root root 10240 Sep 13 11:38 backup.tar
3.恢复
恢复数据到一个容器
a. 创建一个带有数据卷的容器dbdata1
[root@web01 ~]# docker run -it -v /dbdata --name dbdata1 centos:6.8 /bin/bash
[root@4e9f0d6f04d6 /]# ll dbdata/
total 0
b.创建一个新的容器,挂载dbdata1的容器,并使用untar解压备份文件到所挂载的容器卷内
[root@web01 ~]# docker run --volumes-from dbdata1 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
dbdata/
dbdata/test01.txt
dbdata/test02.log
dbdata/test03.log
dbdata/test04.log
dbdata/test05.log
#在dbdata1上查看恢复的数据
[root@4e9f0d6f04d6 /]# ll dbdata/
total 4
-rw-r--r-- 1 root root 12 Sep 13 03:30 test01.txt
-rw-r--r-- 1 root root 0 Sep 13 03:31 test02.log
-rw-r--r-- 1 root root 0 Sep 13 03:31 test03.log
-rw-r--r-- 1 root root 0 Sep 13 03:31 test04.log
-rw-r--r-- 1 root root 0 Sep 13 03:31 test05.log