目录
方案一:进入容器内部,找到index.html文件,然后进行修改
方案二:使用数据卷(volume),将宿主机目录映射到容器目录,再进行修改文件
根据上一篇博客,我们docker已经有了一个初步的认识,例如我们可以使用命令,将Nginx镜像拉取并创建运行容器:docker run -d --name Nginx -p 80:80 nginx~
场景:
当我们安装了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文件就会做出同样的修改~
说的专业点:
所以说,数据卷,其实就是容器目录和宿主机目录之间映射的桥梁,而这个数据卷只是一个逻辑上的存在,就是一个虚拟目录,实际是不存在~
通过以上方法,就可以有效的解决了我们上面的问题~
新的问题产生:如何挂载数据卷,如何创建数据卷?我们接着看:
我们按照上面说的是先创建数据卷,然后实现数据卷与容器的挂载。那其实,在实际操作中,我们可以直接挂载数据卷,当数据卷不存在时他会自动先创建这个数据卷的~ 当然如果想要多此一举去提前创建好数据卷,也是没有问题的,后面会介绍相关命令
命令:
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
说明:
后面,如果想要去确定一下数据卷有没有被创建?以及数据卷的其他信息,再来看他的相关命令:
举例:
修改前,index.html页面;
修改后:
本地目录挂载,很简单,和上述挂载数据卷一样的命令,只有一点点变化:
例如命令:
docker run -d --name mysql -p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=1111 -v ./mysql:/var/lib/mysql mysql
命令其实和挂载数据卷差不多,只是把数据卷名字的地方改成了本地目录路径~
注意:
其实,在创建MySQL容器时,他会自动的有一个挂载,挂载的地方就是上面提到的指定的本地目录,而数据卷名是随机生成的。这种挂载,当数据库需要升级时,先停止删除掉这个容器,本地目录下的数据就算是一个备份,容器重新搭建好后,把这个数据就可以直接迁移过去~【这种挂载的路径很深,难查找】
使用手动指定的本地目录挂载的好处是:
好啦,我们下期见咯~