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

相关推荐
朝九晚五ฺ5 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
Kkooe6 小时前
GitLab|数据迁移
运维·服务器·git
wuxingge6 小时前
k8s1.30.0高可用集群部署
云原生·容器·kubernetes
久醉不在酒6 小时前
MySQL数据库运维及集群搭建
运维·数据库·mysql
志凌海纳SmartX7 小时前
趋势洞察|AI 能否带动裸金属 K8s 强势崛起?
云原生·容器·kubernetes
锅总7 小时前
nacos与k8s service健康检查详解
云原生·容器·kubernetes
BUG弄潮儿8 小时前
k8s 集群安装
云原生·容器·kubernetes
意疏8 小时前
【Linux 篇】Docker 的容器之海与镜像之岛:于 Linux 系统内探索容器化的奇妙航行
linux·docker
虚拟网络工程师8 小时前
【网络系统管理】Centos7——配置主从mariadb服务器案例(下半部分)
运维·服务器·网络·数据库·mariadb
墨鸦_Cormorant8 小时前
使用docker快速部署Nginx、Redis、MySQL、Tomcat以及制作镜像
redis·nginx·docker