前言
前面学了Docker基本的使用和通信,但是由于容器的生命周期是短暂的,当容器被删除后,容器内的数据也会一并删除。为了保存数据,我们可以使用Docker Volume将数据存储在宿主机上,从而实现数据的持久化。
一、数据修改
一般来看配置、数据等重要数据都需要变动,所以数据修改也是Docker容器存在的问题之一。
这里有三种方式进行数据修改。
1、 直接在容器内安装vim等工具修改(不推荐)
2、 通过docker cp复制文件(一般)
3、通过挂载宿主目录(或卷)到容器中(推荐)
第一种方法存在很大的问题,主要很多镜像环境不全面,比如nginx你会发现vi、vim、nano等常见编辑器都没,而且修改完文件会随着容器删除而消失,这就使得无法数据持久化。
第二种通过文件存在宿主目录中,然后进行修改数据,最后将数据通过docker cp命令复制到容器中。
~]# docker cp a.txt nginx:/home/a.txt
第三种就是通过挂载宿主机子的目录(或卷)进行数据修改,也保证了容器删除时,目录能够保存下来。
二、挂载卷
一般挂载分为挂载两种:
1、挂载宿主的目录
2、挂载docker管理的volume卷(也是一个目录)
下面以Nginx为例,对两种挂载进行实践。挂载一般是docker run命令进行,所以可以认为只有新的容器才能进行挂载。
第一种宿主的目录挂载。使用-v或者--mount进行挂载,而且可以多个目录挂载。
~]# docker run -v /home/nginx:/etc/nginx \ -v /home/html:/usr/share/nginx/html \ -d --name nginx -p 80:80 nginx:1.23
然后,你在宿主/home/html目录下创建a.txt文件,在进入容器中/etc/nginx就会看到a.txt文件也出现了。
但是在测试的时候有一个问题,就是挂载宿主目录时会覆盖容器的目录文件(空目录也会),所以一般都是以宿主目录为主。
比如/home/html文件夹下存在index.html,而/usr/share/nginx/html文件夹下存在50x.html、index.html,会覆盖index.html,并且删除50x.html文件。
第二种使用volume卷挂载,这个方式应该是Docker推荐的方式。
~]# docker volume create vol-nginx #创建名为vol-nginx的卷
~]# docker prune #删除未使用的卷
~]# docker volume rm vol-nginx #删除一个或多个卷
~]# docker volume ls #列出所有卷
~]# docker inspect vol-nginx #查看卷信息,Mountpoint是卷在宿主机子中的位置
将vol-nginx卷挂载到nginx容器中,使用卷,若卷为空,则会复制容器内的文件夹下内容,若非空,则会使用宿主文件夹下的文件。
~]# docker run -v vol-nginx:/usr/share/nginx/html -d --name nginx -p 80:80 nginx:1.23 # -v 卷名:容器目录
或挂载多个目录,但是需要不同卷对应目录,不然就会产生覆盖问题。
~]# docker run -d --name nginx \ -v vol-nginx:/usr/share/nginx/html \ -v vol-nginx2:/etc/nginx \ -p 80:80 nginx:1.23
最后进入/var/lib/docker/volumes/vol-nginx/_data中修改文件内容,再进入容器/usr/share/nginx/html映射的位置就能看到文件内容发生改变。
删除容器后,/var/lib/docker/volumes/vol-nginx/_data中的文件也会存在,并且下次继续挂载容器,也会重新覆盖掉新容器中的/usr/share/nginx/html的文件夹。
标签:容器,持久,vol,nginx,html,挂载,Docker,docker From: https://www.cnblogs.com/zrl66/p/18054375