目 录CONTENT

文章目录

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

Sakura
2023-10-28 / 0 评论 / 0 点赞 / 26 阅读 / 4658 字 / 正在检测是否收录...

一: 持久化介绍

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

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

  • Docker 容器数据持久化存储

    • 由于 Docker 容器是由容器镜像生成的,所以一般容器镜像中包含什么文件或目录,在容器启动后,我们依旧可以看到相同的文件或目录。

    • 由于 Docker 容器属于 “用后即焚” 型计算资源,因此 Docker 容器不适合做数据持久化存储

二: 持久化方式

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

  • docker run -v

    • 运行容器时,直接挂载本地目录至容器中

  • volumes

    • Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)

    • 是Docker默认存储数据方式

  • bind mounts

    • 将宿主机上的任意位置文件或目录挂载到容器中

三: 演示

1. docker run -v

未挂载文件

# 1. 首先启动nginx
docker run -d  --name nginx1 nginx:latest

# 2. 访问默认页面
curl http://172.17.0.3:80
<h1>Welcome to nginx!</h1>

# 3. 使用docker cp 将本地文件复制过去
docker cp index.html nginx1:/usr/share/nginx/html/index.html

# 4. 继续访问默认端口
curl http://172.17.0.3:80
Sakura

# 5. 停止容器,删除容器
docker stop nginx1
docker rm nginx1

# 6. 启动后再次访问
docker run -d --name nginx1 nginx:latest
curl http://172.17.0.3:80
<h1>Welcome to nginx!</h1>
# 可以看到网页又还原回去了

挂载本地目录

# 1. 准备好套挂载的文件
root@VM-8-13-debian:~# mkdir www/
root@VM-8-13-debian:~# echo "Sakura" > www/index.html

# 2. 使用 docker run -v 挂载
docker run -d --name nginx2 -v ~/www/:/usr/share/nginx/html/ nginx:latest


root@VM-8-13-debian:~# curl http://172.17.0.3:80
Sakura

# 3. 把容器删了,文件依旧是存在的

容器中改变挂的载文件内容,本地也是发送变化的

未创建本地目录

# 1. 如果挂载的目录中没有文件
docker run -d --name nginx2 -v ~/www/:/usr/share/nginx/html/ nginx:latest

# 2. 那么是访问不了的
403 forbideen

# 3. 此时在容器不关闭的时候,把文件加到挂载的目录容器是可以访问的
curl ......

2. docker volumes

root@VM-8-13-debian:~# docker volume --help

Usage:  docker volume COMMAND

Manage volumes

Commands:
  create      Create a volume
  inspect     Display detailed information on one or more volumes
  ls          List volumes
  prune       Remove unused local volumes
  rm          Remove one or more volumes

Run 'docker volume COMMAND --help' for more information on a command.

创建数据卷

# 1. 创建数据卷
docker volume create

# 3. 查看数据卷
root@VM-8-13-debian:~# docker volume ls
DRIVER    VOLUME NAME
local     logs_etcd_data
local     nginx-vol
local     uuwaf_wafdata
local     uuwaf_wafshared

# 4. 数据卷所在的位置一定是 /var/lib/docker/volumes
ls /var/lib/docker/volumes/

root@VM-8-13-debian:~# ls /var/lib/docker/volumes/nginx-vol/
_data

# 5. 查看数据卷详细信息
root@VM-8-13-debian:~# docker volume inspect nginx-vol
[
    {
        "CreatedAt": "2023-10-29T01:14:06+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data",
        "Name": "nginx-vol",
        "Options": null,
        "Scope": "local"
    }
]

使用数据卷

docker run -d --name nginxTest --mount src=nginx-vol,dst=/usr/share/nginx/html nginx:latest

# 能访问 
curl http://172.17.0.3
welecome nginx

# 可以看到自动把容器中的文件传了过去
root@VM-8-13-debian:~# ls /var/lib/docker/volumes/nginx-vol/_data/
50x.html  index.html

和 docker run -v 不一样 , volume 会自动把 docker 中的数据存到 volume 中

3. bind mounts

# 1. 运行nginx容器使用bind mount实现本地任意目录挂载
docker run -d --name web5 --mount type=bind,src=~/www/,dst=/usr/share/nginx/html nginx:latest

# 2. 将对应内容添加到目录中
echo "bing mounts" > /www/index.html

# 3. 使用 curl 命令访问
curl .... 

注意: 不同于 volume , bind mounts 感慨是不会将容器中的文件加到目录中,需要自己手动添加

0

评论区