目录
方案一:进入容器内部,找到index.html文件,然后进行修改
方案二:使用数据卷(volume),将宿主机目录映射到容器目录,再进行修改文件
前言
根据上一篇博客,我们docker已经有了一个初步的认识,例如我们可以使用命令,将Nginx镜像拉取并创建运行容器:docker run -d --name Nginx -p 80:80 nginx~
1、什么是数据卷?
1.1、为什么要使用数据卷?
场景:
当我们安装了Nginx后,我们想要修改Nginx容器内部的一些文件,例如Nginx中有一个index.html文件,里面有一些内容,如下:
因为我们上面执行的命令是把本机的80端口映射给容器的80端口,所以我们在访问时,直接输入,你的云服务地址加上80端口加上/index.html,就可以看到如上的页面了~
此时当我们想要去修改这个页面的内容时,我们该如何修改:
方案一:进入容器内部,找到index.html文件,然后进行修改
接下来,只需要我们打开文件,修改即可:
显示识别不到vim这个命令~
为什么会这样呢?
我们上一篇有提到可以把容器看做是一个微型的操作系统。但这里呢,有一个特点,这个微型的操作只服务于这个应用,与这个应用无关的环境、配置、文件系统、系统函数的都不会进行配置,只有该应用运行所必备的东西,尽可能的保证这个操作系统的体积够小~
因此,方案一想要实现,会很复杂,会麻烦~ 几乎不会这样搞~
方案二:使用数据卷(volume),将宿主机目录映射到容器目录,再进行修改文件
根据下图,再理解 :
从上图中,我们可以看到,通过数据卷,就可以将宿主机目录映射到Nginx容器目录,也就是说,创建了了数据卷后,我们操作本机对应目录,就相当于是对容器的对应目录进行了操作。例如上述,数据卷,html和conf,而html目录下,Nginx容器中有一个index.html文件,那么对应的,宿主机的这个html目录下也会有这个文件,那我们来修改宿主机的index.html文件,映射到容器中,容器内的index.html文件就会做出同样的修改~
说的专业点:
- 创建一个数据卷后,就会在宿主机的指定目录的volume下准备数据卷config和数据卷html,将来这个数据卷就会就映射到了对应的宿主机的目录下,所以,每一个数据卷都是和宿主机上的一个目录有一一对应的。
- 那接下来,我们要做的就是,让容器的目录跟数据卷做挂载,让两者之间产生关联,也就是说让容器的config和html目录根config卷及html卷进行关联。
- 这样一来,就间接的让宿主机的指定目录和容器的指定目录产生了关联。一旦关联后,宿主机目录和容器目录之间实现了双向绑定,双向映射,也就是两者的数据,不管你修改那边的,另一边都是自动作出一样的修改。这样一来,我们就不需要进入到容器内部进行操作了~
所以说,数据卷,其实就是容器目录和宿主机目录之间映射的桥梁,而这个数据卷只是一个逻辑上的存在,就是一个虚拟目录,实际是不存在~
通过以上方法,就可以有效的解决了我们上面的问题~
新的问题产生:如何挂载数据卷,如何创建数据卷?我们接着看:
2、如何挂载数据卷,如何创建数据卷?
我们按照上面说的是先创建数据卷,然后实现数据卷与容器的挂载。那其实,在实际操作中,我们可以直接挂载数据卷,当数据卷不存在时他会自动先创建这个数据卷的~ 当然如果想要多此一举去提前创建好数据卷,也是没有问题的,后面会介绍相关命令
命令:
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
说明:
- 这个命令,不懂的可以看这篇博客:http://t.csdnimg.cn/9VgvT
- 补充说明一个 -v 命令。冒号前是数据卷的名字,名字唯一【数据卷不存在会自动创建】,冒号后是容器中要挂载的目录,例如上述我要挂载的就是html目录
- 这个挂载的动作必须是在docker run的时候去执行,如果容器已经存在,就不能做挂载了
后面,如果想要去确定一下数据卷有没有被创建?以及数据卷的其他信息,再来看他的相关命令:
3、数据卷的常用命令有哪些?
- docker volume create ---创建数据卷
- docker volume ls ---查看所有数据卷
- docker volume rm --- 删除指定的数据卷
- docker volume inspect --- 查看某个数据卷的详情
- docker volume prune --- 清除未使用的数据卷
举例:
修改前,index.html页面;
修改后:
4、本地目录挂载如何实现?
本地目录挂载,很简单,和上述挂载数据卷一样的命令,只有一点点变化:
例如命令:
docker run -d --name mysql -p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=1111 -v ./mysql:/var/lib/mysql mysql
命令其实和挂载数据卷差不多,只是把数据卷名字的地方改成了本地目录路径~
注意:
- 因为挂载数据卷和挂载本地目录的命令很相似,所以我们一定要区分开这两个写法~
- 本地目录必须以"/"或"./"开头,否则就会认为是数据卷名~
其实,在创建MySQL容器时,他会自动的有一个挂载,挂载的地方就是上面提到的指定的本地目录,而数据卷名是随机生成的。这种挂载,当数据库需要升级时,先停止删除掉这个容器,本地目录下的数据就算是一个备份,容器重新搭建好后,把这个数据就可以直接迁移过去~【这种挂载的路径很深,难查找】
使用手动指定的本地目录挂载的好处是:
- 自己指定的本地目录,更容易查找到~
- 不仅可以做MySQL数据的挂载,还可以对配置文件、初始化脚本等其他文件的挂载
好啦,我们下期见咯~