Docker容器数据持久化存储机制
运行web1容器,把/opt/web1root目录挂载到/usr/share/nginx/html目录中。是一个开源的分布式文件系统,支持高可用性和可扩展性,通过将多个存储节点连接起来形成统一命名空间。是一个开源的分布式存储系统,提供对象存储、块存储和文件系统存储等多种存储方式。查看数据卷数据(MySQL容器中创建的库和表都会存在宿主机的此目录下)运行web3容器,使用--mount选项,实现数据
Docker容器数据持久化存储机制
一、Docker容器数据持久化存储介绍
1、物理机或虚拟机数据持久化存储
由于物理机或虚拟机本身就拥有大容量的磁盘,所以可以直接把数据存储在物理机或虚拟机本地文件系统中,也可以通过使用额外的存储系统(NFS[华王1] 、GlusterFS[华王2] 、Ceph[华王3] 等)来完成数据持久化存储。
2、Docker容器数据持久化存储
由于Docker容器是由容器镜像生成的,所以一般容器镜像中包含什么文件或目录,在容器启动后,我们依旧可以看到相同的文件或目录。
由于Docker容器属于“用后即焚”型计算资源,因此Docker容器做数据持久化存储需挂载宿主机数据卷
总结:
- 用来实现容器与宿主机之间或容器与容器之间的数据共享
- 对于一些容器我们我往往需要经常的修改配置文件,频繁的进入容器显得很麻烦。
- 对于容器(mysql)中的数据,我们希望可以持久化到本地,作为一种备份。
二、Docker容器数据持久化存储方式
Docker提供三种方式将数据从宿主机挂载到容器中:
- docker run -v
运行容器时,直接挂载本地目录至容器中
- volumes 数据卷
Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)
是Docker默认存储数据方式
- bind mounts 绑定挂载
作用同docker run -v
绑定挂载的正式称呼,与第一种方式本质上相同,但更规范
Docker容器数据持久化存储案例
实验目的:不用进入容器,在宿主机就可以更改容器的网页文件
- 挂载本地目录
创建本地目录
[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 容器名称 命令查看
- 未创建本地目录(系统将自动创建)
运行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
- Volumes数据卷
常用命令:
查看数据卷
docker volume ls
创建数据卷
docker volume create data_vol
查看某个卷详情
docker volume inspect data_vol
删除数据卷
docker volume rm 数据卷名
删除未用的数据卷
docker volume prune
-
- 创建数据卷
创建一个名称为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
-
- 使用数据卷
运行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
- 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
- 下载MySQL 5.7镜像
[root@docker-01 ~]# docker pull mysql5.7
或者拖包
[root@docker-01 ~]# docker load -i mysql5.7.tar
- 启动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
- 查看MySQL版本
[root@docker-01 ~]# docker exec -it mysql1 /bin/bash
root@2fc67692a4c8:/# mysql -V
- 查看数据卷数据(MySQL容器中创建的库和表都会存在宿主机的此目录下)
[root@docker-01 ~]# ls /var/lib/docker/volumes/mysqldata/_data
- 使用navicat连接数据卷,创建测试表
连接失败的话,重启docker服务再重启容器
[root@docker-01 ~]# ls /var/lib/docker/volumes/mysqldata/_data/
- 删除mysql1容器
[root@docker-01 ~]# docker stop mysql1
[root@docker-01 ~]# docker rm mysql1
- 在navicat上查看表会报错,容器已被删除
[root@docker-01 ~]# ls /var/lib/docker/volumes/mysqldata/_data
- 新建容器,复用旧数据卷
删除所有容器
[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
- 连接数据库,查看旧数据表是否存在
- 再新建容器,以修改后的配置文件启动(方便后期修改配置文件)
删除所有容器
[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。
缺点
- 复杂性高:部署和管理复杂,需要较高技术门槛。
- 资源消耗大:对硬件资源要求较高。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)