docker学习笔记03-数据卷

docker 容器在停止运行后将删除用户所存在的一切痕迹,也就是说你在服务器所保留的所有产生的数据将会消除痕迹,什么mysql、redis将不保留任何数据,所以这个时候我们希望将用户数据保留下来,就需要用到docker中一个非常重要的概念——数据卷

数据卷是一个可供一个或多个容器使用的特殊目录, 它绕过 UFS, 可以提供很多有
用的特性:
数据卷可以在容器之间共享和重用
对数据卷的修改会立马生效
对数据卷的更新, 不会影响镜像
数据卷默认会一直存在, 即使容器被删除

其实当我们安装完docker的时候,就有数据卷了,默认位置存在于/var/lib/docker/volumes这个目录下边
我们也可以直接输入docker volume ls 这条命令,查看现在当前存在的数据卷
在这里插入图片描述
我们看到当前数据卷没有任何东西,我们可以通过命令docker volume create cent-volume来创建一个自己的数据卷:
在这里插入图片描述
这样我们就完成创建了一个名为cent-volume的数据卷,我们再通过上述命令来查看一下:
在这里插入图片描述
现在就能查看到了,
我们再到docker默认存储volume的路径下边去看看:cd /var/lib/docker/volumes
在这里插入图片描述
我们看到在这个路径下边已经产生了相应的文件
输入:docker volume inspect cent-volume
docker学习笔记03-数据卷_第1张图片
我们可以看到制定数据卷的详细信息
当不再需要当前数据卷的时候,我们需要删除数据卷信息:docker volume rm cent-volume
在这里插入图片描述
这样就删除了一个数据卷了

我们现在完成一个nginx挂在卷的综合实验,首先***我们需要准备好nginx镜像***
1:创建一个挂在卷用来挂在nginx里边的数据,这里我们去挂在nginx的html目录,nginx默认安装好后html路径位于/usr/share/nginx/html

docker volume create nginx-vlo

这样创建好了一个nginx挂在的数据卷
2:启动nginx容器

docker run  -it --name=nginx -p 8800:80

之前我们的名是这样,运行nginx,现在需要挂在的话修改下格式如下

docker run -d -it --name nginx -p 8800:80 -v nginx-vol:/usr/share/nginx/html  nginx:latest  

这里-v 的意思就是挂在我们的数据卷到容器的某个文件位置去
我们现在来进入到这个数据卷中去,进入数据卷目录的_data目录中
在这里插入图片描述
我们发现多了连个文件夹,这里就是把nginx-html文件夹中的数据挂在到我们在宿主机创建的目录中来了
我们现在直接访问,刚才我们把nginx容器的80端口映射到了我们的8800端口(命令中),这个时候我们直接访问宿主机的8800端口
docker学习笔记03-数据卷_第2张图片
(比自己安装nginx快得多了)证明我们真实访问到了容器,那么我们现在直接修改宿主机挂载文件的类容
/var/lib/docker/volumes/nginx-vol/_data 这个目录下修改index.html的类容如下
docker学习笔记03-数据卷_第3张图片
重点修改了红线位置,我们再次去刷新页面
docker学习笔记03-数据卷_第4张图片
页面已经跟随我们的改变而改变了
我们现在进入到容器里边去,和进入cent os docker attach f37f14ef6e7d 这种方式有点差别

docker exec -it nginx /bin/bash

这两种命令的区别是

Docker attach可以attach到一个已经运行的容器的stdin,然后进行命令执行的动作。
但是需要注意的是,如果从这个stdin中exit,会导致容器的停止。
而exec是利用/bin/bash分配了一个终端

当使用exec命令进入终端后,我们输入exit命令即可退出,而且不会把容器停止掉
在这里插入图片描述
这样就进去了,我们找到nginx默认安装html文件的位置cd /usr/share/nginx/html
在这里插入图片描述
可以清楚的看到
docker学习笔记03-数据卷_第5张图片
也就是说当我们改变的数据卷挂在的类容后,我们容器里边的类容也会同步发生改变

当然,有时候我们重要的数据,不希望直接挂载到我们docker默认数据卷的位置去,我们这个时候就需要采用Bind Mounts 去把docker的数据卷挂载到我们需要的位置去

假设我需要把nginx中的html目录挂在到/usr目录下,我们首先来看下/usr路径
在这里插入图片描述
运行容器:docker run -d -it --name nginx -p 8800:80 -v /usr/html:/usr/share/nginx/html nginx:latest
这个时候我们/usr路径下是没有html目录的的
在这里插入图片描述
运行成了
在这里插入图片描述
自动帮我们挂载了数据卷并且创建了文件,我们现在进入html目录
在这里插入图片描述
并没有和数据卷一样把nginx的html中的index.html和50.html帮我们拷贝过来
我们在这个文件夹下边自己创建一个index.html的文件
在这里插入图片描述
类容如下:





    
    websocket通讯




hello docker





再去浏览器中访问
docker学习笔记03-数据卷_第6张图片
可以正常运行的,但是挂在卷为啥不正常显示呢?因为

与volumes不同,bind mounts的方式会隐藏掉被挂载目录里面的内容(如果非空的话),这里是/usr/share/nginx/html 目录下的内容被隐藏掉了,因此我们看不到

但是这样的好处就是我们不需要自己去创建数据卷,并且可以把文件挂在任意我们需要的位置去
Ps:这里需要注意的是,容器及时没有停止,依旧能删除这种方式挂载的数据卷

你可能感兴趣的:(docker)