赞
踩
要弄清楚什么是docker数据卷,我们先来看一个问题:
Nginx镜像安装运行,查看===》七、docker常用指令演示(以nginx安装为例)
我们在Nginx部署成功后,想要部署静态文件,这时是想要进入容器内部部署的(因为容器沙箱机制,对外不可访问)。
//进入容器内部,-it是开启交互终端,bash是开启终端的模式为命令行bash模式
docker exec -it 镜像名 bash
//进入静态部署路径
cd /usr/share/nginx/html
//查看当前目录
ls -l
//编辑文件
vi 文件名
注意问题:
当我们去修改文件的时候,会出现命令不存在问题:
为什么存在这种问题,之前不是说Docker容器包含完整的运行环境,模拟了系统运行环境吗?那怎么连文件 编辑命令都不支持呢?但是确支持ls查看指令呢?
这是因为,容器运行确实是包含当前应用运行的完整环境,但是这个运行环境是最小的环境,不必要的系统函数不会集成进去。
比如这里Nginx的运行,他就不需要vi文件编辑的命令函数。
因此,容器提供程序的运行环境,但是程序运行产生的数据、程序运行依赖的配置都应该与容器解耦。
根据上面的情况,Nginx容器运行最小环境不包含vi文件编辑等不必要的命令,那么想要修改Nginx内部文件特别麻烦。所以如果生产开发环境都使用这种方式部署静态文件十分麻烦,那有没有一种方式,可以更加便捷效率的部署静态文件呢?
有,那就是数据卷技术。
数据卷(volume)是一个虚拟目录,是容器目录和宿主机目录之前映射的桥梁。
那两者是如何映射的呢?
volume会去映射容器内的文件目录,然后宿主机目录再去映射volume的逻辑目录(虚拟目录)。
特别注意:
一旦这种映射形成,docker会将容器内目录变动更新到宿主机目录中,而宿主机目录的变动也会同步更新到容器内目录中。
这就类似于前端vue的双向绑定。
下面以Nginx为例子:
在上图中:
这样以来,容器内的conf和html目录就 与宿主机的conf和html目录关联起来,我们称为挂载。
此时,我们操作宿主机的/var/lib/docker/volumes/html/_data就是在操作容器内的/usr/share/nginx/html/_data目录。只要我们将静态资源放入宿主机对应目录,就可以被Nginx代理了。
命令 | 说明 | 文档 |
---|---|---|
docker volume create | 创建数据卷 | docker volume create |
docker volume ls | 查看所有数据卷 | docker volume ls |
docker volume rm | 删除指定数据卷 | docker volume rm |
docker volume inspect | 查看某个数据卷的详情 | docker volume inspect |
docker volume prune | 清除未使用的数据卷 | docker volume prune |
注意:
# 1.首先创建容器并指定数据卷,注意通过 -v 参数来实现 数据卷 挂载
# 格式:-v 数据卷:容器内目录
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
# 我们知道,数据卷挂载要在容器创建的时候配置,如果容器创建好了是不能挂载数据卷的(已经创建好,想要先删除再重新创建)。
# 当执行上述命令时,会创建容器,如果数据卷不存在,就会自动创建数据卷并实现数据卷挂载。
# 查看数据卷详情,可以查看数据卷映射的宿主机目录
# 格式:docker volume inspect 数据卷名
docker volume inspect html
修改index.html文件,可以查看Nginx内文件也发生同步改变
# 注意这里是容器名,和查看数据卷详情不同,这个命令是查看某个容器数据卷详情
docker inspect 容器名
注意:
匿名卷
注意,上面实现的是数据卷默认的宿主机目录和容器目录之间映射。这里是任意宿主机目录和容器目录之间的映射。
# 会被识别为一个数据卷叫mysql,运行时会自动创建这个数据卷
-v html:/var/lib/mysql
# 会被识别为当前目录下的mysql目录,运行时如果不存在会创建目录
-v ./nginx/html:/var/lib/mysql
注意:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。