09. Docker数据管理
容器中的管理数据主要有两种方式:
- 数据卷(Data Volumes): 容器内数据直接映射到本地主机环境;
- 数据卷容器(Data Volume Containers): 使用特定容器维护数据卷。
1. 数据卷⚓
数据卷(Data Volumes) 是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux中的mount行为。
-
数据卷可以在容器之间共事和重用,容器间传递数据将变得高效与方便;
-
对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作;
- 对数据卷的更新不会影响镜像,解藕开应用和数据;
- 卷会一直存在,直到没有容器使用,可以安全地卸载它。
1.1 绑定数据卷⚓
除了使用volume
子命令来管理数据卷外,还可以在创建容器时将主机本地的任意路径挂载到容器内作为数据卷,这种形式创建的数据卷称为绑定数据卷。
使用docker run
命令的--mount
选项达成此目的:
$ docker run -P -itd --name test_mount --mount type=bind,source=/home/amhello-1.0,destination=/home/mount_point changedcentos:latest /bin/bash
$ docker attach test_mount
$ [root@aa3cf2fe682f mount_point]# pwd
/home/mount_point
$ [root@aa3cf2fe682f mount_point]# ll
total 304
-rw-r--r-- 1 1000 1000 813 Dec 28 2018 Makefile.am
·······
--mount选项支持三种类型的数据卷:
- volume : 普通数据卷,映射到主机/var/lib/docker/volumes路径下;
- bind:绑定数据卷,映射到主机指定路径下;
- tmpfs:临时数据卷,只存在于内存中。
这个功能在进行应用测试的时候十分方便,比如用户可以放置一些程序或数据到本地目录中实时进行更新,然后在容器内运行和使用。 另外,本地目录的路径必须是绝对路径,容器内路径可以为相对路径。 如果目录不存在, Docker会自动创建。
推荐的方式是直接挂载文件所在的目录到容器内。
2. 数据卷容器⚓
数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载。
创建一个数据卷容器:
# -v 和 --mount 选项类似,都可以指定数据卷
# -v 的格式是这样的:/webapp:/opt/webapp:ro
# 使用“:”分隔source和destination,省略source时会自动创建一个新的volume
docker run -itd -v /shared_volume --name shared_container changedcentos /bin/bash
# --volumes-from 从指定的容器(s)挂载数据卷
docker run -itd --volumes-from shared_container --name test1 centos
# 此时两者中都可以看到/shared_volume目录,并且读写同步
3. 备份、恢复、迁移数据卷⚓
3.1 备份容器⚓
$ docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
- 登录一个新的容器并从
dbstore
容器挂载卷 - 挂在本地目录到
/backup
- 传递打包命令,将卷的内容进行打包到挂载点
3.2 从备份中恢复容器⚓
可以使用备份文件恢复到同一个或其它容器中。
- 创建新的容器
dbstore2
$ docker run -v /dbdata --name dbstore2 ubuntu /bin/bash
- 在新容器的数据卷中解包备份文件
$ docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"
你可以自由选择工具来使用上述的技术进行自动的备份、迁移和恢复。
4. 删除卷⚓
当容器删除时数据卷不会自动删除。
-
命名卷具有来自容器外部的特定源,例如
awsome:/bar
。 -
匿名卷没有特定的源,因此在删除容器时,指示Docker Engine守护程序删除它们。
4.1 移除匿名卷⚓
要自动删除匿名卷,使用--rm
选项。
例如,下面的命令创建匿名卷/foo
,当删除容器时,会删除/foo
卷而不是awsome
卷。
$ docker run --rm -v /foo -v awesome:/bar busybox top