Docker容器数据持久化存储机制
物理机或虚拟机数据持久化存储由于物理机或虚拟机本身就拥有大容量的磁盘,所以可以直接把数据存储在物理机或虚拟机本地文件系统中,亦或者也可以通过使用额外的存储系统(NFS、GlusterFS、Ceph等)来完成数据持久化存储。Docker容器数据持久化存储由于Docker容器是由容器镜像生成的,所以一般容器镜像中包含什么文件或目录,在容器启动后,我们依旧可以看到相同的文件或目录。由于Docker容器属
这里写目录标题
一、Docker容器数据持久化存储介绍
物理机或虚拟机数据持久化存储
- 由于物理机或虚拟机本身就拥有大容量的磁盘,所以可以直接把数据存储在物理机或虚拟机本地文件系统中,亦或者也可以通过使用额外的存储系统(NFS、GlusterFS、Ceph等)来完成数据持久化存储。
Docker容器数据持久化存储
-
由于Docker容器是由容器镜像生成的,所以一般容器镜像中包含什么文件或目录,在容器启动后,我们依旧可以看到相同的文件或目录。
-
由于Docker容器属于"用后即焚”型计算资源,因此Docker容器不适合做数据持久化存储
二、Docker容器数据持久化存储方式
Docker提供三种方式将数据从宿主机挂载到容器中:
-
docker run -v
- 运行容器时,直接挂载本地目录至容器中
-
volumes
- Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)
- 是Docker默认存储数据方式
-
bind mounts
- 将宿主机上的任意位置文件或目录挂载到容器中
三、Docker容器数据持久化存储方式应用案例演示
3.1 docker run -v
3.1.1 创建了本地目录
nginx下新建index.html文件,并且定义内容
root@hecs-213321:~/Docker/nginx# ls
index.html
root@hecs-213321:~/Docker/nginx# cat index.html
<h1>今天是9月9日</h1>
启动容器
-v ./nginx/:/usr/share/nginx/html/:将宿主机中的nginx目录下的文件挂载到容器中的/usr/share/nginx/html/目录下
root@hecs-213321:~/Docker# docker run -d --name web -v ./nginx/:/usr/share/nginx/html/ nginx:latest
查看容器
root@hecs-213321:~/Docker# sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e3e2107bf3fc nginx:latest "/docker-entrypoint.…" 58 seconds ago Up 56 seconds 80/tcp web
查看容器的IPAddress
root@hecs-213321:~/Docker/nginx# docker inspect web
访问
root@hecs-213321:~/Docker/nginx# curl http://172.17.0.2
<h1>今天是9月9日</h1>
把容器删掉
root@hecs-213321:~/Docker/nginx# docker stop web
web
root@hecs-213321:~/Docker/nginx# docker rm web
web
发现宿主机中的文件还在
root@hecs-213321:~/Docker# cd nginx/
root@hecs-213321:~/Docker/nginx# ls
index.html
当重新运行容器时,容器中的/usr/share/nginx/html/目录下还会存在index.html文件
root@hecs-213321:~/Docker/nginx# docker run -d --name web -v ./nginx/:/usr/share/nginx/html/ nginx:latest
7559987e00f184fb96ce136149e864197bbbe5366930f93d85fad6222ba363ab
当在容器中的挂载的文件发生变化,宿主机中挂载的文件也将发生变化。
root@hecs-213321:~/Docker/nginx# sudo docker exec -it web /bin/sh
修改容器中的文件内容
# cd /usr/share/nginx/html
# echo '66666'>index.html
# cat index.html
66666
宿主机中的文件内容也将发生变化
root@hecs-213321:~/Docker/nginx/nginx# cat index.html
66666
同样的,当在宿主机中的挂载的文件发生变化,容器中挂载的文件也将发生变化。
3.1.2 未创建本地目录
运行容器
root@hecs-213321:~# docker run -d --name web1 -v ./web1root/:/usr/share/nginx/html/ nginx:latest
查看运行中的容器
root@hecs-213321:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6f631e440db1 nginx:latest "/docker-entrypoint.…" 31 seconds ago Up 30 seconds 80/tcp web1
7559987e00f1 nginx:latest "/docker-entrypoint.…" 34 minutes ago Up 34 minutes 80/tcp web
查看web1容器的IPAddress
docker inspect web1
访问,报403
curl http://172.17.0.3
原因是该目录下没有文件
root@hecs-213321:~# ls
Docker snap web1root
root@hecs-213321:~# cd web1root/
root@hecs-213321:~/web1root# ls
创建index.html文件,并且新加内容,再次访问即可访问成功
root@hecs-213321:~/web1root# echo 'web1' > index.html
root@hecs-213321:~/web1root# curl http://172.17.0.3
web1
3.2 volumes
3.2.1 创建数据卷
docker volume create nginx-volume
查看数据卷
root@hecs-213321:~# docker volume ls
DRIVER VOLUME NAME
local 9b4315d9adb4ce6677921ea040e3f9180c325230aa8cd8cdfa8fac754318473f
local nginx-volume
查看数据卷详情
root@hecs-213321:~# docker inspect nginx-volume
[
{
"CreatedAt": "2023-09-09T11:45:17+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/nginx-volume/_data",
"Name": "nginx-volume",
"Options": null,
"Scope": "local"
}
]
3.2.2 使用数据卷
-- mount
:指定使用自己创建的volume
src=nginx-volume:指定使用那个数据卷
dst:指定挂载到容器中的具体位置
root@hecs-213321:~# docker run -d --name web3 --mount src=nginx-volume,dst=/usr/share/nginx/html/ nginx:latest
231aa656b24d2e189e0f340df7447fcc0db96cbdc530e060fa7bdd52799e1b50
root@hecs-213321:~# ls
查看容器详细信息,并且访问
root@hecs-213321:~# docker inspect web3
并没有报403
上面的操作中创建容器的时候使用 -v 会报403
创建的数据卷,默认存储在/var/lib/docker/volumes/nginx-volume/_data目录下
更多推荐
所有评论(0)