一: 持久化介绍
物理机或虚拟机数据持久化存储
由于物理机或虚拟机本身就拥有大容量的磁盘,所以可以直接把数据存储在物理机或虚拟机本地文件系统中,亦或者也可以通过使用额外的存储系统( 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 感慨是不会将容器中的文件加到目录中,需要自己手动添加
评论区