Docker容器的数据管理

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。


我们在使用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技术入门与实践》

相关推荐
容器魔方4 小时前
华为云亮相 KubeCon China 2025,开源生态引领 AI 时代技术跃迁
云原生·容器·云计算
K·Herbert8 小时前
最新CentOS 7 yum源失效的解决方案(2025年6月)
linux·运维·centos
老兵发新帖8 小时前
Kubernetes架构解析
容器·架构·kubernetes
别骂我h8 小时前
部署KVM虚拟化平台
linux·运维·服务器
showmethetime9 小时前
优化nginx参数(基本通用参数)
运维·nginx
老六ip加速器9 小时前
获取ip地址安全吗?如何获取静态ip地址隔离ip
运维·网络·智能路由器
净心净意17 小时前
浅谈DaemonSet
运维·jenkins
Apex Predator1 天前
jenkins流水线打包vue无权限
运维·jenkins
容器魔方1 天前
Volcano v1.12 正式发布!驱动云原生AI与批量计算向智能高效新阶段演进
云原生·容器·云计算
Johny_Zhao1 天前
CentOS Stream 8 高可用 Kuboard 部署方案
linux·网络·python·网络安全·docker·信息安全·kubernetes·云计算·shell·yum源·系统运维·kuboard