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

3 阅读3分钟

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

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

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

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

Docker容器数据持久化存储

  • 由于Docker容器是由容器镜像生成的,所以一般容器镜像中包含什么文件或目录,在容器启动后,我们依旧可以看到相同的文件或目录。
  • 由于Docker容器属于“用后即焚”型计算资源,因此Docker容器不适合做数据持久化存储

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

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

  • docker run -v 运行容器时,直接挂载本地目录至容器中
  • volumes
    • Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)
    • 是Docker默认存储数据方式
  • bind mounts 将宿主机上的任意位置文件或目录挂载到容器中

应用案例演示

docker run -v

未挂载本地目录

# 运行一个容器,未挂载本地目录
docker run -d --name web1 nginx:latest
# 查看容器的ip
docker inspect web1 | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
                    "IPAddress": "172.17.0.2",

curl http://172.17.0.2
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
...

# 查看容器中/usr/share/nginx/html目录
docker exec web1 ls /usr/share/nginx/html
50x.html
index.html

挂载本地目录

# 创建本地目录
mkdir -p /data/test/wwwroot
# 向本地目录中添加index.html文件
echo 'kubetest' > /data/test/wwwroot/index.html
# 运行web2容器,把/data/test/wwwroot目录挂载到/usr/share/nginx/html目录
docker run -d --name web2 -v /data/test/wwwroot/:/usr/share/nginx/html/ nginx:latest
# 查看容器的ip
docker inspect web2 | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.3",
                    "IPAddress": "172.17.0.3",

curl http://172.17.0.3
kubetest

未创建本地目录

# 运行web3容器,挂载未创建的本地目录,启动容器时将自动创建本地目录
docker run -d --name web3 -v /data/test/web3root/:/usr/share/nginx/html/ nginx:latest
# 往自动创建的目录中添加一个index.html文件
echo "kubetest web3" > /data/test/web3root/index.html
# 在容器中执行查看文件命令
docker exec web3 cat /usr/share/nginx/html/index.html
kubetest web3

# 查看容器的ip
docker inspect web3 | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.4",
                    "IPAddress": "172.17.0.4",

curl http://172.17.0.4
kubetest web3

volumes

创建数据卷

# 创建一个名称为nginx-vol的数据卷
docker volume create nginx-vol
# 确认数据卷创建后的位置,/data/docker,是启动服务时配置的docker数据目录,默认是/var/lib/docker
ls /data/docker/volumes/
backingFsBlockDev  metadata.db  nginx-vol

# 查看已经创建数据卷
docker volume ls
DRIVER    VOLUME NAME
local     nginx-vol

# 查看数据卷详细信息
docker volume inspect nginx-vol
[
    {
        "CreatedAt": "2023-09-14T09:43:15+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/data/docker/volumes/nginx-vol/_data",
        "Name": "nginx-vol",
        "Options": null,
        "Scope": "local"
    }
]

使用数据卷

# 运行web4容器,使用--mount选项,实现数据卷挂载
docker run -d --name web4 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx:latest
# 或者,运行web4容器,使用-v选项,实现数据卷挂载
docker run -d --name web4 -v nginx-vol:/usr/share/nginx/html/ nginx:latest
# 查看容器运行后数据卷中文件或子目录
ls /data/docker/volumes/nginx-vol/_data
50x.html  index.html

# 查看容器的ip
docker inspect web4 | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.5",
                    "IPAddress": "172.17.0.5",

curl http://172.17.0.5
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
...

# 修改index.html文件内容
echo "web4" > /data/docker/volumes/nginx-vol/_data/index.html

curl http://172.17.0.5
web4

bind mounts

# 创建用于容器挂载的目录web5root
mkdir -p /data/test/web5root
# 运行web5容器并使用bind mount方法实现本地任意目录挂载
docker run -d --name web5 --mount type=bind,src=/data/test/web5root,dst=/usr/share/nginx/html nginx:latest
# 查看已挂载目录,里面没有任何数据
ls /data/test/web5root
# 添加内容至/data/test/web5root/index.html中
echo "web5" > /data/test/web5root/index.html
# 查看容器的ip
docker inspect web5 | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.6",
                    "IPAddress": "172.17.0.6",

curl http://172.17.0.6
web5