Docker容器数据持久化存储的三种方式
Docker容器数据持久化存储的三种方式
Docker容器的短暂性和可替换性使其在默认情况下不会保留数据。为了满足数据持久化的需求,Docker提供了多种存储方式,包括Docker卷、绑定挂载和网络存储。本文将详细介绍这三种存储方式的特点、适用场景和具体使用方法。
为什么Docker容器需要使用持久化存储
1.什么是Docker容器?
Docker是一种流行的容器化技术,它允许开发者将应用程序及其依赖打包在一个轻量级、可移植的容器中。与虚拟机不同,Docker容器共享主机操作系统的内核,因此更轻便和高效。
2.什么是持久化存储?
持久化存储指的是保存数据的方法,这些数据在应用程序或系统重启后仍然存在。在传统计算中,我们通常将数据存储在硬盘、数据库或外部存储设备上。
3.为什么Docker容器需要持久化存储?
Docker容器的设计初衷是短暂的和可替换的。所有在日常使用中容器常常处于用后即焚的状态,这意味着一旦容器停止运行或被删除,其中的数据会消失。这对于需要保存数据的应用来说是个大问题,比如数据库、日志文件或用户上传的内容。
4.Docker如何实现持久化存储?
Docker 提供了多种持久化存储方式,每种方式在不同环境和使用场景下有其独特的优势。本篇博客主要讲述Docker 卷(Volumes)、绑定挂载(Bind Mounts)和网络存储(Network Storage)的使用案例和实现方法。
注:需要提前安装docker
(1)、Docker卷(Volumes)
简介
Docker 卷是由 Docker 管理的存储,可以独立于容器生命周期存在,适合需要在多个容器之间共享或持久化数据的场景。
适用环境
- 持久化需求:数据需要在容器重启或删除后依然存在。
- 多容器共享:多个容器需要访问相同的数据。
- 数据备份与恢复:需要方便地对数据进行备份和恢复操作。
使用场景
- 数据库数据存储:例如 MySQL、PostgreSQL 等数据库的数据目录。
- 应用配置共享:多个容器共享配置文件或日志文件。
使用案例
本案例使用nginx作为挂载容器的镜像
1.创建数据卷
创建一名名称为nginx-vol的数据卷
docker volume create nginx-vol
查看以下创建好的数据卷
docker volume ls
查看数据卷的详细信息
docker volume inspect nginx-vol
可以看到关于nginx-vol这个卷的详细信息,其中就包括卷的默认存储位置
让我们查看一下
ls /var/lib/docker/volumes
2.使用数据卷
使用数据卷的方式有两种,分别是
运行web4容器,使用–mount选项,将容器内的/usr/share/nginx/html目录挂载到数据卷上,实现数据卷挂载
docker run -d -p 80:80 --name web3 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx:latest
或
常用的一般为下面这种
运行web3容器,使用–v选项,实现数据卷挂载将容器内的/usr/share/nginx/html目录挂载到数据卷上,实现数据卷挂载
docker rm -f web3
docker run -d -p 80:80 --name web3 -v nginx-vol:/usr/share/nginx/html nginx:latest
查看容器是否挂载到了数据卷上
ls /var/lib/docker/volumes/nginx-vol/_data/
修改index.html文件内容
echo "web3-running" > /var/lib/docker/volumes/nginx-vol/_data/index.html
查看
curl 本机ip
curl 192.168.10.11
查看数据持久化功能
docker rm -f web3
cat /var/lib/docker/volumes/nginx-vol/_data/index.html
可以看到即使删除了容器,nginx的页面文件依旧存在
(2)、绑定挂载(Bind Mounts)
简介
绑定挂载将主机文件系统中的一个目录挂载到容器中,允许容器直接访问和修改主机上的文件。
适用环境
- 开发环境:开发过程中需要频繁修改主机文件,并立即在容器中生效。
- 主机与容器数据共享:需要在主机和容器之间共享文件。
使用场景
- 开发和测试:挂载代码目录,以便在主机上编辑代码时容器能立即使用最新代码。
- 日志文件:将容器的日志文件直接写入主机目录,方便监控和分析。
使用案例
创建用于容器挂载的目录
mkdir /opt/test
运行web4容器并使用bind mount方法实现本地任意目录挂载
docker run -d -p 80:80 --name web4 --mount type=bind,src=/opt/test,dst=/usr/share/nginx/html nginx:latest
查看已挂载目录,里面没有任何数据
ls /opt/test/
添加内容至/opt/test/index.html中
echo "web4-running" > /opt/test/index.html
使用curl命令访问容器
curl 本机ip
curl 192.168.10.11
测试数据持久化功能
docker rm -f web4
ls /opt/test/
可以看到文件依旧存在
(3)、 网络存储(Network Storage)
简介
使用网络文件系统(如 NFS、CIFS 等)将远程存储挂载到容器中,适用于需要跨多个主机共享数据的场景。
适用环境
- 分布式系统:需要在多个主机上的容器之间共享数据。
- 集中式存储:数据集中存储在远程文件系统中,便于管理和备份。
使用场景
- 分布式应用:例如使用 NFS 挂载配置文件和数据目录,便于集群中的所有节点访问。
- 企业存储:集中存储企业级应用的数据,方便管理和备份。
使用案例
安装 NFS 并挂载:
假设使用 NFS 作为网络存储系统。
在另一台主机上上安装 NFS 客户端:
mkidr /nfsdata
yum install yum -y install nfs-utils rpcbind -y
vim /etc/exports
输入 /nfsdata *(rw,sync,no_root_squash)
:wq 保存退出
systemctl start rpcbind
systemctl enable rpcbind
systemctl start nfs-server
systemctl enable nfs-server
showmount -e
nfs成功部署
挂载 NFS 共享:
回到本机192.168.10.11
yum -y install nfs-utils.x86_64
mount -t nfs 192.168.10.14:/nfsdata /nfs
然后就和上面绑定挂载一样了,不再过多叙述
如何选择合适的持久化存储方式
在选择Docker容器的持久化存储方式时,需要考虑以下几个因素:
- 数据持久性:需要在容器重启或删除后保留数据,建议使用 Docker 卷或网络存储。
- 共享需求:如果需要多个容器或主机共享数据,网络存储或卷是较好的选择。
- 管理和备份:Docker 卷由于是 Docker 原生支持的,管理和备份更方便。
- 性能要求:对于需要高性能读写的场景,本地绑定挂载可能更合适。
- 安全性:需要考虑数据的安全性和访问控制,某些场景下网络存储可能需要额外的安全配置。
根据具体的应用场景和需求,选择最适合的存储方式,可以确保数据的安全性和系统的稳定性。