Docker的数据持久化是什么?

@

目录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

进入容器,检查挂载情况

docker exec -it nfs-container bash

cd /data

ls -l

cat test.txt

5.使用第三方存储解决方案

如Minio, Google Cloud Storage等云存储服务也可以用来持久化存储容器中的数据。这种方式通常用于备份或者需要高可用性的场景。

这种情况使用不太多,这里就不再赘述啦~~小伙伴们可以自由选择

结语

今天就写到这里啦~

小伙伴们,( ̄ω ̄( ̄ω ̄〃 ( ̄ω ̄〃)ゝ我们明天再见啦~~

大家要天天开心哦

欢迎大家指出文章需要改正之处~

学无止境,合作共赢

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