Docker系列-5种方案超详细讲解docker数据存储持久化(volume,bind mounts,NFS等)

简介: Docker系列-5种方案超详细讲解docker数据存储持久化(volume,bind mounts,NFS等)

目录
Docker的数据持久化是什么?
1.数据卷(Data Volumes)
使用Docker 创建数据卷
创建数据卷
创建一个容器,将数据卷挂载到容器中的 /data 目录。
进入容器,查看数据卷内容
停止并重新启动容器,数据卷中的数据仍然存在
再次进入容器,检查文件是否存在
使用 Docker Compose 创建数据卷
编写docker-compose.yml 文件
启动 Docker Compose
进入容器,创建测试文件
停止并重新启动容器,进行测试
再次进入容器,检查文件是否存在
2.挂载主机目录(Bind Mounts)
在主机上创建一个目录,用于挂载到容器中
使用Docker
创建一个容器,并将主机目录挂载到容器中。
进入容器,查看挂载目录的内容
在容器内,创建一些测试文件
退出容器
在主机上查看挂载目录中的内容
停止并重新启动容器进行测试
进入容器,检查文件是否存在
使用 Docker Compose
编写docker-compose.yml
启动 Docker Compose
进入容器,创建一些测试文件
退出容器
在主机上查看挂载目录中的内容
停止并重新启动容器进行测试
再次进入容器,检查文件是否存在
3.使用数据卷容器(Volumes from Containers)
使用Docker
创建一个数据卷容器
创建另一个容器,并使用 --volumes-from 参数挂载数据卷容器中的数据卷
进入数据卷容器
在容器内,创建一些测试文件
退出容器
进入另一个容器
在另一个容器中查看挂载的数据卷
重新启动容器
并检查文件是否存在
使用 Docker Compose
编写一个docker-compose.yml文件
启动
进入数据卷容器,创建一些测试文件
退出容器
进入另一个容器中查看挂载的数据卷
停止并重新启动容器进行测试
再次进入容器,检查文件是否存在
4.NFS(Network File System)挂载
什么是 NFS?
安装并配置 NFS 服务器
使用Docker ,在 Docker 容器中挂载 NFS 共享
创建并启动容器
进入容器
挂载 NFS 共享
在容器内检查挂载情况
在容器内创建文件
退出容器
在 NFS 服务器上查看挂载目录中的内容
使用 Docker Compose 管理 NFS 挂载
编写docker-compose.yml文件
yml文件解释说明
启动 Docker Compose
进入容器,检查挂载情况
5.使用第三方存储解决方案
结语
欢迎路过的小哥哥小姐姐们提出更好的意见哇~~
Docker的数据持久化是什么?
简单理解,就是为了数据安全-不易丢失。
在容器运行过程中产生的数据能够被保存下来,即使容器停止或重启后这些数据也不会丢失。
1.数据卷(Data Volumes)
数据卷是一种容器间共享和持久化数据的机制。数据卷直接绕过Union File System,因此对数据卷中的任何变更都会立即生效,不会受到容器内运行程序的影响。
创建数据卷非常简单,可以通过docker volume create命令创建一个新卷,或者在启动容器时通过-v选项指定一个已存在的卷。

使用Docker 创建数据卷
创建数据卷
docker volume create my-data-volume
创建一个容器,将数据卷挂载到容器中的 /data 目录。
docker run -d --name my-container -v my-data-volume:/data nginx:latest
进入容器,查看数据卷内容
docker exec -it my-container bash
停止并重新启动容器,数据卷中的数据仍然存在
docker stop my-container
docker start my-container
再次进入容器,检查文件是否存在
docker exec -it my-container bash
cd /data
cat test.txt
使用 Docker Compose 创建数据卷
编写docker-compose.yml 文件
version: '3'

services:
web:
image: nginx:latest
volumes:

  - my-data-volume:/data
ports:
  - "80:80"

volumes:
my-data-volume:
启动 Docker Compose
docker-compose up -d
进入容器,创建测试文件
docker exec -it web bash
cd /data
touch test.txt
echo "I am xiaojin." > test.txt
停止并重新启动容器,进行测试
docker-compose down
docker-compose up -d
再次进入容器,检查文件是否存在
docker exec -it web bash
cd /data
cat test.txt
2.挂载主机目录(Bind Mounts)
可以将宿主机上的目录挂载到容器内部作为一个数据卷。这种方式下,数据实际上是存储在宿主机上的某个目录中,因此容器删除后数据仍然存在。
使用-v选项可以将宿主机的一个绝对路径目录挂载到容器内的一个绝对路径目录上。

在主机上创建一个目录,用于挂载到容器中
mkdir -p /mnt/data
使用Docker
创建一个容器,并将主机目录挂载到容器中。
docker run -d --name my-container \
-v /mnt/data:/data \
nginx:latest
这里 -v /mnt/data:/data 表示将主机上的 /mnt/data 目录挂载到容器内的 /data 目录。

进入容器,查看挂载目录的内容
docker exec -it my-container bash
在容器内,创建一些测试文件
cd /data
touch test.txt
echo "Hello, this is a test file." > test.txt
退出容器
exit
在主机上查看挂载目录中的内容
ls -l /mnt/data
cat /mnt/data/test.txt
停止并重新启动容器进行测试
docker stop my-container
docker start my-container
进入容器,检查文件是否存在
docker exec -it my-container bash
cd /data
cat test.txt
使用 Docker Compose
编写docker-compose.yml
version: '3'

services:
web:
image: nginx:latest
volumes:

  - /mnt/data:/data
ports:
  - "80:80"

启动 Docker Compose
docker-compose up -d
进入容器,创建一些测试文件
docker exec -it web bash
cd /data
touch test.txt
echo "Hello, this is a test file." > test.txt
退出容器
exit
在主机上查看挂载目录中的内容
ls -l /mnt/data
cat /mnt/data/test.txt
停止并重新启动容器进行测试
docker-compose down
docker-compose up -d
再次进入容器,检查文件是否存在
docker exec -it web bash
cd /data
cat test.txt
3.使用数据卷容器(Volumes from Containers)
数据卷容器是一种特殊的容器,它主要用于共享数据卷。这种机制允许你在多个容器之间共享数据卷,而不需要显式地创建和管理数据卷。
这种方法是指将一个容器的整个文件系统作为另一个容器的数据卷挂载点。当两个容器共享同一个数据卷容器时,它们之间就可以共享数据。
通过--volumes-from参数可以实现这一功能。
使用Docker
创建一个数据卷容器
创建 data-container 容器,里边有一个名为 /data 的数据卷。

docker run -d --name data-container -v /data nginx:latest
创建另一个容器,并使用 --volumes-from 参数挂载数据卷容器中的数据卷
docker run -d --name app-container --volumes-from data-container nginx:latest
其中-v /data 表示将数据卷容器 data-container 中的 /data 目录挂载到 app-container 中的相同位置。

进入数据卷容器
docker exec -it data-container bash
在容器内,创建一些测试文件
cd /data
touch test.txt
echo "Hello, this is a test file." > test.txt
退出容器
exit
进入另一个容器
docker exec -it app-container bash
在另一个容器中查看挂载的数据卷
cd /data
ls -l
cat test.txt
重新启动容器
docker stop app-container
docker start app-container
并检查文件是否存在
docker exec -it app-container bash
cd /data
cat test.txt
使用 Docker Compose
编写一个docker-compose.yml文件
version: '3'

services:
data-container:
image: nginx:latest
volumes:

  - /data

app-container:
image: nginx:latest
volumes_from:

  - data-container
ports:
  - "80:80"

启动
docker-compose up -d
进入数据卷容器,创建一些测试文件
docker exec -it data-container bash
cd /data
touch test.txt
echo "Hello, this is a test file." > test.txt
退出容器
exit
进入另一个容器中查看挂载的数据卷
docker exec -it app-container bash
cd /data
ls -l
cat test.txt
停止并重新启动容器进行测试
docker-compose down
docker-compose up -d
再次进入容器,检查文件是否存在
docker exec -it app-container bash
cd /data
cat test.txt
4.NFS(Network File System)挂载
对于需要跨多台主机共享数据的情况,可以考虑使用NFS来挂载远程服务器上的文件系统作为数据存储位置。这种方式需要在宿主机层面配置NFS客户端,并将NFS共享目录挂载到容器中。
关于非常详细的图文并茂步骤以及讲解,请参考我的另外一篇文章2分钟教会你NFS文件服务器及客户端挂载
什么是 NFS?
NFS(Network File System)网络文件系统
目标:实现计算机之间通过网络共享资源
将NFS主机分享的目录,挂载到自己电脑,我们就可以用自己电脑使用NFS的硬盘存储资源
大白话说,就像百度云盘差不多哦~~
安装并配置 NFS 服务器
关于非常详细的安装并配置 NFS 服务器图文并茂步骤以及讲解,请参考我的另外一篇文章2分钟教会你NFS文件服务器及客户端挂载,文中包含以下详细步骤:

NFS实现原理是什么?
服务器端(共享硬盘方)安装NFS
安装NFS 和 rpcbind
通过systemctl 设置服务自启动(RPC要先于NFS启动)
查看应用进程(使用 linux 的 ps aux |grep 命令)
验证是否自启动
NFS定义共享文件目录
通过/etc/exports文件定义共享目录,vi编辑exports文件,这个步骤一定要使用root权限,否则无法编辑
修改后重启或者 重新加载共享文件列表
查看共享目录
查看NFS服务器共享目录,挂载情况
客户端挂载
客户端环境准备
新建挂载点
挂载
设置开机挂载
将挂载命令加入文件即可
验证挂载
使用Docker ,在 Docker 容器中挂载 NFS 共享
创建并启动容器
假如192.168.1.10 是你的 NFS 服务器,/mnt/nfs 是你的共享目录。
这里 -v /mnt/nfs:/data 表示将 NFS 服务器上的 /mnt/nfs 目录挂载到容器内的 /data 目录
docker run -d --name nfs-container \
-v /mnt/nfs:/data \
-e NFS_SERVER=192.168.1.10 \
-e NFS_PATH=/mnt/nfs \
ubuntu:latest
进入容器
docker exec -it nfs-container bash
挂载 NFS 共享
mkdir -p /data

mount -t nfs 192.168.1.10:/mnt/nfs /data

在容器内检查挂载情况
df -h
在容器内创建文件
cd /data
touch test.txt
echo "Hello, this is a test file." > test.txt
退出容器
exit
在 NFS 服务器上查看挂载目录中的内容
ls -l /mnt/nfs
cat /mnt/nfs/test.txt
执行后,会发现容器中创建的文件也出现在了 NFS 服务器的共享目录中

使用 Docker Compose 管理 NFS 挂载
编写docker-compose.yml文件
version: '3'

services:
nfs-container:
image: ubuntu:latest
environment:
NFS_SERVER: 192.168.1.10
NFS_PATH: /mnt/nfs
volumes:

  - type: bind
    source: ${NFS_SERVER}:${NFS_PATH}
    target: /data
command: >
  sh -c "mkdir -p /data && 
         mount -t nfs ${NFS_SERVER}:${NFS_PATH} /data &&
         tail -f /dev/null"

yml文件解释说明
volumes

定义数据卷
type: bind: 指定这是一个绑定挂载。
source: ${NFS_SERVER}😒{NFS_PATH}: 指定源路径为环境变量 NFS_SERVER 和 NFS_PATH 组合而成的 NFS 共享路径。
target: /data: 指定目标路径为容器内的 /data 目录。
command

定义容器启动时执行的命令。
mkdir -p /data: 创建容器内的 /data 目录(如果不存在)。
mount -t nfs ${NFS_SERVER}😒{NFS_PATH} /data: 将 NFS 共享路径挂载到容器内的 /data 目录。
tail -f /dev/null: 让容器持续运行,不立即退出。
启动 Docker Compose
docker-compose up -d
进入容器,检查挂载情况
[kod.xinanfuzhuang.com)
[kod.youmishiguang.com)
[kod.yts9.com)
[kod.jersey8.com)
[kod.economistbook.com)
[kod.ibcgj.com)
[kod.caihui315.com)
[kod.dddpb.com)
docker exec -it nfs-container bash
cd /data
ls -l
cat test.txt
5.使用第三方存储解决方案
如Minio, Google Cloud Storage等云存储服务也可以用来持久化存储容器中的数据。这种方式通常用于备份或者需要高可用性的场景。
这种情况使用不太多,这里就不再赘述啦小伙伴们可以自由选择
结语
今天就写到这里啦~
小伙伴们,( ̄ω ̄( ̄ω ̄〃 ( ̄ω ̄〃)ゝ我们明天再见啦

大家要天天开心哦
欢迎大家指出文章需要改正之处~
学无止境,合作共赢

在这里插入图片描述

欢迎路过的小哥哥小姐姐们提出更好的意见哇~~

相关文章
|
5天前
|
存储 NoSQL 大数据
大数据-51 Redis 高可用方案CAP-AP 主从复制 一主一从 全量和增量同步 哨兵模式 docker-compose测试
大数据-51 Redis 高可用方案CAP-AP 主从复制 一主一从 全量和增量同步 哨兵模式 docker-compose测试
18 3
|
2月前
|
Docker 容器
【Azure 应用服务】App Service for Container 无法拉取Docker Hub中的镜像替代方案
【Azure 应用服务】App Service for Container 无法拉取Docker Hub中的镜像替代方案
|
2月前
|
存储 Linux Go
Docker Volume - 目录挂载以及文件共享
Docker Volume - 目录挂载以及文件共享
43 0
|
4月前
|
Docker 容器
蓝易云 - Docker修改容器ulimit的全部方案及各方案的详细步骤
以上就是修改Docker容器ulimit的全部方案及其详细步骤。
218 2
|
5月前
|
Web App开发 安全 前端开发
百度搜索:蓝易云【Docker WebRTC容器部署方案】
以上是一个简单的Docker WebRTC容器部署方案。在实际应用中,你可能需要根据自己的需求进行更复杂的配置和优化。此外,要确保你的WebRTC应用程序在Docker容器中能够正确运行,可能需要处理一些网络和安全方面的问题。
153 6
|
5月前
|
Java Docker Windows
Windows下部署SpringBoot的实践方案(Docker & Docker Desktop)
Windows下部署SpringBoot的实践方案(Docker & Docker Desktop)
295 0
|
5月前
|
存储 Kubernetes Docker
k8s持久化储存:pv,pvc和nfs等相关技术
k8s持久化储存:pv,pvc和nfs等相关技术
|
5月前
|
JavaScript 关系型数据库 MySQL
一文详解Docker数据卷(volume)
一文详解Docker数据卷(volume)
|
3天前
|
网络协议 网络安全 Docker
docker容器间无法通信
【10月更文挑战第4天】
13 3
|
2天前
|
Docker 容器
docker中检查容器的网络模式
【10月更文挑战第5天】
5 1