Docker数据管理
本博主的docker文章基于Docker技术入门与实战(第三版)
容器中的管理数据主要有两种方式:
- 数据卷(Data Volumes):容器内数据直接映射到本地主机环境;
- 数据卷容器(Data VolumeContainers):使用特定容器维护数据卷。
介绍-数据卷
数据卷(Data Volumes)是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux中的mount行为。
数据卷可以提供很多有用的特性:
- 数据卷可以在容器之间共享和重用,容器间传递数据将变得高效与方便;
- 对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作;
- 对数据卷的更新不会影响镜像,解耦开应用和数据;
- 卷会一直存在,直到没有容器使用,可以安全地卸载它。
docker volume
使用docker volume命令创建一个数据卷,能发现在/var/lib/docker/volumes路径下有新建的test数据卷
[root@localhost /]# docker volume create -d local test
test
[root@localhost /]# ls -l /var/lib/docker/volumes/
总用量 24
drwxr-xr-x 3 root root 19 8月 11 2020 11664cd3fc411e5bb6c3e8ca3480433fc49a295543a9f0367b0dddd311c19318
drwxr-xr-x. 3 root root 19 8月 11 2020 8b086536b8a56324306a174bcad0ba322dcb8c48f4a3660e9007cc5b7a3c0a7c
-rw-------. 1 root root 32768 3月 22 17:25 metadata.db
drwxr-xr-x 3 root root 19 3月 22 17:25 test
除了create子命令外,docker volume还支持
- inspect(查看详细信息)
- ls(列出已有数据卷)
- prune(清理无用数据卷)
- rm(删除数据卷)
docker run -mount
除了使用volume子命令来管理数据卷外,还可以在创建容器时将主机本地的任意路径挂载到容器内作为数据卷,这种形式创建的数据卷称为绑定数据卷。
-mount选项支持三种类型的数据卷,包括:
- volume:普通数据卷,映射到主机/var/lib/docker/volumes路径下
- bind:绑定数据卷,映射到主机指定路径下
- tmpfs:临时数据卷,只存在于内存中
下面是使用docker.io/nginx镜像创建一个容器,并创建一个数据卷挂载到容器的/usr/share/nginx/html目录
[root@localhost docker]# dockerun -p 80:80 --mount type=bind,source=/u01/learn/docker/dist destination=/usr/share/nginx/html docker.io/nginx
上面命令等同于使用-v标记可以在容器内创建一个数据卷
[root@localhost docker]# docker run -p 80:80 -v /u01/learn/docker/dist:/usr/share/nginx/html docker.io/nginx
Docker挂载数据卷的默认权限是读写(rw),用户也可以通过ro指定为只读;加了:ro之后,容器内对所挂载数据卷内的数据就无法修改了。
[root@localhost docker]docker run -p 80:80 -v /u01/learn/docker/dist:/usr/share/nginx/html:ro docker.io/nginx
介绍-数据卷容器
如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载。
创建一个容器名为dbdata的容器
[root@localhost ~]# docker run -it -v /u01/learn/docker/dbdata/ --name dbdata docker.io/centos
[root@a461322e8886 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp u01 usr var
[root@a461322e8886 /]# cd /u01/learn/docker/
[root@a461322e8886 docker]# ll
bash: ll: command not found
[root@a461322e8886 docker]# ls
dbdata
[root@a461322e8886 docker]# cd dbdata/
[root@a461322e8886 dbdata]# ls
[root@a461322e8886 dbdata]# echo "hello world">readme.txt
[root@a461322e8886 dbdata]# ls
readme.txt
[root@a461322e8886 dbdata]#
使用--volumes-from
参数来挂载数据卷
[root@localhost ~]# docker run -it --volumes-from dbdata --name db1 docker.io/centos
[root@a6ad6edc903a /]# cd /u01/learn/docker/dbdata/
[root@a6ad6edc903a dbdata]# ls
readme.txt
[root@a6ad6edc903a dbdata]#
使用–volumes-from参数所挂载数据卷的容器自身并不需要保持在运行状态。
如果删除了挂载的容器(包括dbdata、db1和db2),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式使用docker rm -v命令来指定同时删除关联的容器。
介绍-数据卷迁移
备份dbdata数据卷容器内的数据卷,该命令首先利用docker.io/centos镜像创建了一个容器worker。使用–volumes-from dbdata参数来让worker容器挂载dbdata容器的数据卷(即dbdata数据卷);使用-v $PWD:/backup
参数来挂载本地的当前目录到worker容器的/backup目录。
worker容器启动后,使用tar cvf /backup/backup.tar /u01/learn/docker/dbdata/
命令将/u01/learn/docker/dbdata/
下的内容备份为容器内的/backup/backup.tar,即宿主主机当前目录下的backup.tar
[root@localhost ~]# docker run --volumes-from dbdata -v $PWD:/backup --name worker docker.io/centos tar cvf /backup/backup.tar /u01/learn/docker/dbdata/
恢复数据到一个容器,首先创建一个带有数据卷的容器dbdata2,切换目录到/root下,然后使用-v $PWD:/backup
将当前目录/root映射给容器内部的/backup目录,执行解压命令,压缩文件对应的是容器内部的位置。
该命令的思路就是:利用数据卷的关联特性,使用--volumes-from
来关联一个数据卷,再利用-v 宿主机目录:容器内目录
来将备份的文件映射到容器内部。
[root@localhost dbdata]# docker run -v /u01/learn/docker/dbdata/ --name dbdata2 docker.io/centos /bin/bash
[root@localhost ~]# pwd
/root
[root@localhost ~]# docker run --volumes-from dbdata2 -v $PWD:/backup busybox tar xvf /backup/backup.tar
u01/learn/docker/dbdata/
u01/learn/docker/dbdata/readme.txt