转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。
我们在使用Docker的过程中,往往需要能查看容器内应用产生的数据,或者需要把容器内的数据进行备份,甚至多个容器之间进行数据的共享,这必然涉及容器的数据管理操作。
容器中管理数据主要有两种方式:
→ 数据卷(Data Volumes)
→ 数据卷容器(Data Volume Containers)
本文将首先梳理如何在容器内创建数据卷,并且把本地的目录或文件挂载到容器内的数据卷中。
接下来梳理如何使用数据卷容器在容器和主机、容器和容器之间共享数据,并实现数据的备份和恢复。
1. 数据卷
数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性:
→ 数据卷可以在容器之间共享和重用;
→ 对数据卷的修改会立马生效;
→ 对数据卷的更新,不会影响镜像;
→ 卷会一直存在,直到没有容器使用;
数据卷的使用,类似于Linux下对目录或文件进行mount操作。
1.1 在容器内创建一个数据卷
在用docker run命令的时候,使用-v标记可以在容器内创建一个数据卷。
docker run -d -P --name nginx -v /tmp/nginx nginx
查看数据卷:
多次使用-v标记可以创建多个数据卷:
docker run -d -P --name nginx -v /tmp/nginx1 -v /tmp/nginx2 nginx
查看数据卷:
1.2 挂载数据目录作为数据卷
使用-v标记也可以指定挂载一个本地的已有目录到容器中去作为数据卷:
# 将主机目录/tmp/nginx挂载到容器目录/data docker run -d --name nginx -v /tmp/nginx:/data nginx
注意:本地目录路径需是绝对路径,如目录不存在,docker会自动创建。
创建一个文件检查挂载情况:
Docker 挂载数据卷的默认权限是读写(rw),用户也可以通过,ro指定为只读:
#挂载加上ro让容器内挂载的数据卷只读 docker run -d --name nginx -v /tmp/nginx:/data:ro nginx
验证只读权限:
1.3 挂载一个本地文件作为数据卷
有时候我们需要从本地挂载一些文件到容器内部,就可以使用这种方法,例如将本地的localtime文件挂载到容器,使容器和宿主机时间保持一致:
docker run -d --name nginx -v /etc/localtime:/etc/localtime nginx
2. 数据卷容器
如果用户需要在容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。
数据卷容器其实就是一个普通的容器,专门用它提供数据卷供其他容器挂载使用方法如下:
首先,创建一个数据卷容器data,并在其中创建一个数据卷挂载到 /data:
docker run -d -v /data --name data nginx
然后其他容器使用--volumes-from来挂载data容器中的数据卷:
docker run -d --volumes-from data --name nginx-1 nginx docker run -d --volumes-from data --name nginx-2 nginx
容器 nginx-1和 nginx-2 都挂载同一个数据卷到相同的/ata目录。三个容器任何一方在该目录下的写入数据,其他容器都可以看到:
可以多次使用--volumes-from参数来从多个容器挂载多个数据卷。还可以从其他已经挂载了容器卷的容器来挂载数据卷:
docker run -d --volumes-from nginx-1 --name nginx-3 nginx
挂载进去后,能看到之前的数据:
注意:使用 --volumes-from参数所挂载数据卷的容器自身并不需要保持在运行状态。
如果删除了挂载的容器(包括data、nginx-1和nginx-2),并不会删除整个数据卷,nginx-3挂载的数据卷,里面还能看到数据:
3. 数据迁移/恢复
使用数据卷容器可以让用户在容器之间自由地升级和移动数据卷,可以利用数据卷容器对其中的数据卷进行备份、恢复,以实现数据的迁移。
3.1 利用数据卷容器迁移数据
3.1.1 备份数据
docker run --volumes-from data -v $(pwd):/tmp --name worker nginx tar cvf /tmp/bak.tar.gz /data # 命令解说: --volumes-from data:挂载数据卷data $(pwd):/tmp:把宿主机当前目录挂载到容器的/tmp下 tar cvf /tmp/bak.tar.gz /data:把数据卷data下的文件打成压缩包/tmp/bak.tar.gz。这个压缩包会通过-v命令再同步到宿主机目录
宿主机上执行命令当前目录下就有了备份tar包:
3.1.2 导入数据到挂载了另一个数据卷的容器里
A. 创建一个数据卷data1:
docker run -d -v /data --name data1 nginx
B. 将刚刚导出来的/tmp/bak.tar.gz数据包导入到data1中:
# 注意下面的命令要和1)在相同目录执行,同时使用--rm删除迁移数据时生成的容器 docker run --rm --volumes-from data1 -v $(pwd):/tmp nginx tar xvf /tmp/bak.tar.gz # 如果不和1)在相同目录下,-v后面就要执行路径,如: docker run --rm --volumes-from data1 -v /tmp:/tmp nginx tar xvf /tmp/bak.tar.gz
C. 启动一个nginx-2挂载data1这个数据卷,点进去会看到数据已经迁移过来了:
注意点:
数据卷容器可以不启动(即容器退出停止)进行备份/恢复操作;
数据从数据卷data迁移到data1中,注意data和data1两个数据卷挂载到容器的路径需要是一致的,否则会迁移失败。对比这两个数据卷创建的命令:
docker run -d -v /data --name data nginx docker run -d -v /data --name data1 nginx
至此,数据迁移完毕。
3.2 利用数据卷容器恢复数据
3.2.1 备份数据
步骤同3.1.1
3.2.2 删除文件,模拟数据丢失
3.2.3 恢复数据
docker run --rm --volumes-from data -v /tmp:/tmp nginx tar xvf /tmp/bak.tar.gz
检查数据恢复:
参考:《docker技术入门与实践》