Docker容器数据持久化存储机制

一、Docker容器数据持久化存储介绍

1、物理机或虚拟机数据持久化存储

由于物理机或虚拟机本身就拥有大容量的磁盘,所以可以直接把数据存储在物理机或虚拟机本地文件系统中,也可以通过使用额外的存储系统(NFS[华王1] 、GlusterFS[华王2] 、Ceph[华王3] 等)来完成数据持久化存储。

2、Docker容器数据持久化存储

由于Docker容器是由容器镜像生成的,所以一般容器镜像中包含什么文件或目录,在容器启动后,我们依旧可以看到相同的文件或目录。

由于Docker容器属于“用后即焚”型计算资源,因此Docker容器做数据持久化存储需挂载宿主机数据卷

总结:

  1. 用来实现容器与宿主机之间或容器与容器之间的数据共享
  2. 对于一些容器我们我往往需要经常的修改配置文件,频繁的进入容器显得很麻烦。
  3. 对于容器(mysql)中的数据,我们希望可以持久化到本地,作为一种备份。

二、Docker容器数据持久化存储方式

Docker提供三种方式将数据从宿主机挂载到容器中:

  1. docker run -v

运行容器时,直接挂载本地目录至容器中

  1. volumes 数据卷

Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)

是Docker默认存储数据方式

  1. bind mounts  绑定挂载

作用同docker run -v

绑定挂载的正式称呼,与第一种方式本质上相同,但更规范

Docker容器数据持久化存储案例

实验目的:不用进入容器,在宿主机就可以更改容器的网页文件

  1. 挂载本地目录

创建本地目录

[root@docker-01 ~]# mkdir /opt/web1root

向本地目录中添加index.html文件

[root@docker-01 ~]# echo 'This is web1' >/opt/web1root/index.html

运行web1容器,把/opt/web1root目录挂载到/usr/share/nginx/html目录中

[root@docker-01 ~]# docker run -d --name web1 -v /opt/web1root/:/usr/share/nginx/html/ nginx

查看容器IP

[root@docker-01 ~]# docker inspect web1

使用curl命令访问容器

[root@docker-01 ~]# curl http://172.17.0.2

如果忘记将网页挂载到哪个目录下可以使用docker inspect 容器名称 命令查看

  1. 未创建本地目录(系统将自动创建)

运行web2容器,挂载未创建的本地目录,启动容器时将自动创建本地目录

[root@docker-01 ~]# docker run -d --name web2 -v /opt/web2root/:/usr/share/nginx/html/ nginx

往自动创建的目录中添加一个index.html文件

[root@docker-01 ~]# echo 'This is web2' >/opt/web2root/index.html

在容器中执行查看文件命令

[root@docker-01 ~]# docker exec web2 cat /usr/share/nginx/html/index.html

查看容器IP

[root@docker-01 ~]# docker inspect web2

使用curl命令访问容器

[root@docker-01 ~]# curl http://172.17.0.3

  1. Volumes数据卷

常用命令:

查看数据卷

docker volume ls

创建数据卷

docker volume create data_vol

查看某个卷详情

docker volume inspect data_vol

删除数据卷

docker volume rm 数据卷名

删除未用的数据卷

docker volume prune

    1. 创建数据卷

创建一个名称为nginx-vol的数据卷

[root@docker-01 ~]# docker volume create nginx-vol

确认数据卷创建后的位置

[root@docker-01 ~]# ls /var/lib/docker/volumes/   固定位置

查看已经创建数据卷

[root@docker-01 ~]# docker volume ls

查看数据卷详细信息

[root@docker-01 ~]# docker volume inspect nginx-vol

    1. 使用数据卷

运行web3容器,使用--mount选项,实现数据卷挂载

[root@docker-01 ~]# docker run -d --name web3 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx

运行web3容器,使用-v选项,实现数据卷挂载

# docker run -d --name web3 -v nginx-vol:/usr/share/nginx/html/ nginx:latest

查看容器运行后数据卷中文件或子目录

[root@docker-01 ~]# ls /var/lib/docker/volumes/nginx-vol/_data/

查看容器IP

[root@docker-01 ~]# docker inspect web3

使用curl命令访问容器

[root@docker-01 ~]# curl http://172.17.0.4

     

修改index.html文件内容

[root@docker-01 ~]# echo "This is web3" > /var/lib/docker/volumes/nginx-vol/_data/index.html

再次使用curl命令访问容器

[root@docker-01 ~]# curl http://172.17.0.4

  1. bind mounts(同docker run -v)

创建用于容器挂载的目录web4root

[root@docker-01 ~]# mkdir /opt/web4root

运行web4容器并使用bind mount方法实现本地任意目录挂载

[root@docker-01 ~]# docker run -d --name web4 --mount type=bind,src=/opt/web4root,dst=/usr/share/nginx/html nginx

查看已挂载目录,里面没有任何数据

[root@docker-01 ~]# ls /opt/web4root/

添加内容至/opt/web4root/index.html中

[root@docker-01 ~]# echo "This is web4" > /opt/web4root/index.html

查看容器IP

[root@docker-01 ~]# docker inspect web4

使用curl命令访问容器

[root@docker-01 ~]# curl http://172.17.0.5

数据挂载MySQL

  1. 下载MySQL 5.7镜像

[root@docker-01 ~]# docker pull mysql5.7

或者拖包

[root@docker-01 ~]# docker load -i mysql5.7.tar

  1. 启动mysql容器,映射端口、设置密码、挂载自动数据卷

[root@docker-01 ~]# docker run -itd --name mysql1 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123.com -v mysqldata:/var/lib/mysql mysql:5.7

  1. 查看MySQL版本

[root@docker-01 ~]# docker exec -it mysql1 /bin/bash

root@2fc67692a4c8:/# mysql -V

  1. 查看数据卷数据(MySQL容器中创建的库和表都会存在宿主机的此目录下)

[root@docker-01 ~]# ls /var/lib/docker/volumes/mysqldata/_data

  1. 使用navicat连接数据卷,创建测试表

连接失败的话,重启docker服务再重启容器

[root@docker-01 ~]# ls /var/lib/docker/volumes/mysqldata/_data/

  1. 删除mysql1容器

[root@docker-01 ~]# docker stop mysql1

[root@docker-01 ~]# docker rm mysql1

  1. 在navicat上查看表会报错,容器已被删除

[root@docker-01 ~]# ls /var/lib/docker/volumes/mysqldata/_data

  1. 新建容器,复用旧数据卷

删除所有容器

[root@docker-01 ~]# docker rm -f $(docker ps -aq)

[root@docker-01 ~]# docker run -itd --name mysql1 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123.com -v mysqldata:/var/lib/mysql mysql:5.7

  1. 连接数据库,查看旧数据表是否存在

  1. 再新建容器,以修改后的配置文件启动(方便后期修改配置文件)

删除所有容器

[root@docker-01 ~]# docker rm -f $(docker ps -aq)

      [root@docker-01 ~]# docker run -itd --name mysql1 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123.com -v mysqldata:/var/lib/mysql -v mysqlconf:/etc/ mysql:5.7

[root@docker-01 ~]# cd /var/lib/docker/volumes/

[root@docker-01 volumes]# ls

[root@docker-01 mysqlconf]# ls

[root@docker-01 mysqlconf]# cd _data/

[root@docker-01 _data]# ls

[root@docker-01 _data]# cd mysql/

[root@docker-01 mysql]# ls

是MySQL最新版本的话,my.cnf 路径就不同


 [华王1]NFS(Network File System)

定义

NFS 是一种基于网络的文件系统协议,允许不同机器之间共享文件系统资源。

优点

  • 简单易用:配置和使用简单,适合快速部署。
  • 广泛兼容:几乎兼容所有操作系统。
  • 性能稳定:在小型和中型集群中表现良好。

缺点

  • 扩展性差:依赖单点 NFS 服务器,高并发性能不足。
  • 可靠性低:存在单点故障风险。
  • 安全性低:数据传输未加密。

 [华王2]GlusterFS

定义

GlusterFS 是一个开源的分布式文件系统,支持高可用性和可扩展性,通过将多个存储节点连接起来形成统一命名空间。

优点

  • 高可用性:支持故障转移和自我修复。
  • 可扩展性强:能够轻松扩展到多个节点。
  • 灵活性高:支持多种存储模式,如复制、分布式和条带化。
  • 成本效益高:对硬件要求较低。

缺点

  • 性能波动:在小文件处理和元数据操作方面表现不稳定。
  • 管理复杂:配置和管理难度较高。

 [华王3]Ceph

定义

Ceph 是一个开源的分布式存储系统,提供对象存储、块存储和文件系统存储等多种存储方式。

优点

  • 高性能:采用 CRUSH 算法,高效分配和检索数据。
  • 高可靠性:支持数据多副本和纠删码。
  • 可扩展性强:能够轻松扩展到数十 PB 的存储容量。
  • 功能丰富:支持多种存储协议,如 iSCSI、NFS 和 S3。

缺点

  • 复杂性高:部署和管理复杂,需要较高技术门槛。
  • 资源消耗大:对硬件资源要求较高。
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐