Data Volumes
数据卷将主机操作系统目录直接映射进容器,类似于Linux中的mount行为。
数据卷的特点
1.数据卷可以在容器之间共享和重用,容器间传递数据将变得高效与方便;
2.对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作;
3.对数据卷的更新不会影响镜像,解耦开应用和数据;
4.卷会一直存在,直到没有容器使用,可以安全地卸载它。
数据卷的三种类型
volume:普通数据卷,映射到主机/var/lib/docker/volumes路径下;
bind:绑定数据卷,映射到主机指定路径下;
tmpfs:临时数据卷,只存在于内存中
创建数据卷\
[root@yz117 docker]# docker volume create -d local test
test
查看
[root@yz117 docker]# ls /var/lib/docker/volumes/
273c807fee28903c904a01b9f15535cccd7385bd43013cf07cfc20a4486ce07e a200447803044defe8a1d5e851d8999e8d3d0c8c9c0b9bfc097a0c06524ec953 metadata.db test
723a1f53574ed857a75521bf8caeccf2bb02da5730acf373de347bdff003808d backingFsBlockDev
Tips: 除了create子命令外,docker volume还支持inspect(查看详细信息)、ls(列出已有数据卷)、prune(清理无用数据卷)、rm(删除数据卷)等
绑定数据卷
除了使用volume子命令来管理数据卷外,还可以在创建容器时将主机本地的任意路径挂载到容器内作为数据卷,这种形式创建的数据卷称为绑定数据卷。
使用training/webapp镜像创建一个Web容器,并创建一个数据卷挂载到容器的/opt/test:
[root@yz117 docker]# docker run -d -P --name web --mount type=bind,source=/etc/docker/test,destination=/opt/test training/webapp python app.py
Unable to find image 'training/webapp:latest' locally
latest: Pulling from training/webapp
Image docker.io/training/webapp:latest uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/
e190868d63f8: Pull complete
909cd34c6fd7: Pull complete
0b9bfabab7c1: Pull complete
a3ed95caeb02: Pull complete
10bbbc0fc0ff: Pull complete
fca59b508e9f: Pull complete
e7ae2541b15b: Pull complete
9dd97ef58ce9: Pull complete
a4c1b0cb7af7: Pull complete
Digest: sha256:06e9c1983bd6d5db5fba376ccd63bfa529e8d02f23d5079b8f74a616308fb11d
Status: Downloaded newer image for training/webapp:latest
a7de68676483ac297b2e16db333c2811d36d9afd64fe487d836ed496bf752032
简化写法
[root@yz117 docker]# docker run -d -P --name web -v /etc/docker/test:/opt/test training/webapp python app.py
Docker挂载数据卷的默认权限是读写(rw),用户也可以通过ro指定为只读
[root@yz117 docker]# docker run -d -P --name web -v /etc/docker/test:/opt/test:ro training/webapp python app.py
数据卷容器
数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载,类似一个共享数据中心。
1.创建一个数据卷容器dbdata,并在其中创建一个数据卷挂载到/dbdata
[root@yz117 docker]# docker run -it -v /dbdata --name dbdata ubuntu
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
125a6e411906: Pull complete
Digest: sha256:26c68657ccce2cb0a31b330cb0be2b5e108d467f641c62e13ab40cbec258c68d
Status: Downloaded newer image for ubuntu:latest
root@2bec62ad2351:/# ls dbdata/
2.可以在其他容器中使用--volumes-from来挂载dbdata容器中的数据卷,例如创建db1和db2两个容器,并从dbdata容器挂载数据卷:
docker run -it -v /dbdata --name dbdata ubuntu
docker run -it --volumes-from dbdata/ --name db1 ubuntu
docker run -it --volumes-from /dbdata --name db2 ubuntu
如果我们在数据卷容器中的dbdata目录中增加文件,在db1和db2中都能看到。
使用--volumes-from参数所挂载数据卷的容器自身并不需要保持在运行状态
Tips: 如果删除了挂载的容器(包括dbdata、db1和db2),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式使用docker rm -v命令来指定同时删除关联的容器。
利用数据卷容器来迁移数据
1.备份
1.首先利用ubuntu镜像创建了一个容器worker。
2.使用--volumes-from dbdata参数来让worker容器挂载dbdata容器的数据卷(即dbdata数据卷);
3.使用-v $(pwd):/backup参数来挂载本地的当前目录到worker容器的/backup目录。
4.worker容器启动后,使用tar cvf /backup/backup.tar/dbdata命令将/dbdata下内容备份为容器内的/backup/backup.tar,即宿主主机当前目录下的backup.tar。
[root@yz117 ~]# docker run --volumes-from dbdata -v ${pwd}:/backup --name backup_worker ubuntu tar cvf /backup/backup.tar /dbdata
2.恢复
1.创建一个带有数据卷的容器dbdata2:
[root@yz117 ~]# docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
2.创建另一个新的容器,挂载dbdata2的容器,并使用untar解压备份文件到所挂载的容器卷中
[root@yz117 ~]# docker run --volumes-from dbdata2 -v &{pwd}:/backup/ busyboy tar xvf /backup/backup.tar