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技术入门与实践》

相关推荐
ulias2126 小时前
Linux系统中的权限问题
linux·运维·服务器
青花瓷7 小时前
Ubuntu下OpenClaw的安装(豆包火山API版)
运维·服务器·ubuntu
问简8 小时前
docker 镜像相关
运维·docker·容器
Dream of maid8 小时前
Linux(下)
linux·运维·服务器
齐鲁大虾8 小时前
统信系统UOS常用命令集
linux·运维·服务器
Benszen9 小时前
Docker容器化技术实战指南
运维·docker·容器
ZzzZZzzzZZZzzzz…9 小时前
Nginx 平滑升级:从 1.26.3 到 1.28.0,用户无感知
linux·运维·nginx·平滑升级·nginx1.26.3·nginx1.28.0
Hommy889 小时前
【开源剪映小助手】Docker 部署
docker·容器·开源·github·aigc
一叶知秋yyds10 小时前
Ubuntu 虚拟机安装 OpenClaw 完整流程
linux·运维·ubuntu·openclaw
斯普信云原生组11 小时前
Prometheus 环境监控虚机 Redis 方案(生产实操版)
运维·docker·容器