Docker数据持久化挂载与卷(三)

前言

  前面学了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 volume 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的文件夹。

posted @ 2024-03-05 17:43  Auler  阅读(5)  评论(0编辑  收藏  举报