大纲:

docker目录挂载:
为啥要目录挂载:
对一个容器进行启动修改后,删除该容器再重启一个相同容器,以前修改内容丢失,第2个原因是容器内部为了保持轻量很多vim等命令工具没有,即即使容器内部有一套自己的文件系统也很难管理
举例如下:
要修改docker容器nginx容器的默认首页需要使用docker exec命令进入docker容器内部再使用echo命令修改/usr/share/nginx/html页面,比较麻烦,并且docker容器内部有自己的文件系统,所以容器内部的数据都存在容器内,当把已启动且运行过的nginx容器删除,然后再重新启动一个nginx容器,则开始在第一个nginx容器中修改的nginx首页等数据就会丢失
模拟过程:
后台启动nginx容器+修改nginx容器内部默认页内容:
如下在浏览器中用80端口访问新启动的nginx容器,访问的是默认的nginx首页,docker exec it 容器id前3位 bash即进入该容器内部bash页面,然后cd定位到nginx容器的默认页位置,再echo修改默认页内容,具体的nginx容器的默认页位置要去docker nginx镜像官方docker hub去查
强制删除容器+重启新容器,发现修改内容丢失(看最后一张图):




啥是目录挂载:
容器内部的文件跟主机上的文件做了映射,容器内部文件修改则对应主机文件修改,主机文件修改则容器内部对应文件同步也做修改

实现目录挂载:
在容器启动时加-v命令,-v 主机文件目录地址:容器内部文件目录地址,实现主机和容器文件目录映射(注意是文件目录地址而不是具体的文件地址【也可以直接写文件地址,就是文件地址太单一了,不如文件目录可容纳的文件多,推荐写文件目录】,如果要做映射再在主机下添加容器内部该文件目录下的文件即可,比如容器内部该目录下a.html,那主机要做文件映射,只需要在-v映射的目录下添加a.html文件,此时浏览器访问容器内部文件直接访问主机上的a.html文件,则要修改容器内部a.html文件内容直接修改主机上的a.html文件即可)
修改主机文件映射容器内部文件:
docker run -d -p 80:80 -v /app/nghtml:/usr/share/nginx/html --name app01 nginx:用官方nginx最新镜像启动叫app01的nginx容器,端口映射为主机上的80对应容器内部的80端口,文件目录映射为主机上的/app/nghtml目录下的文件对应容器内的/usr/share/nginx/html目录下的文件
注意:开始启动后马上在浏览器访问nginx,此时nginx首页访问显示403,因为用了-v文件目录映射后,此时访问容器走的文件目录路径为映射好的主机文件目录路径而不是容器内部的/usr/share/nginx/html目录,主机文件目录/app/nghtml下并没有index.html文件,所以nginx首页访问失败
修改主机映射目录下默认页内容再在浏览器访问nginx首页,显示访问成功且内容为修改主机下的默认页内容



删除执行-v命令后的容器再重启一个nginx新容器,浏览器再访问:
发现nginx容器首页依然为主机上的/app/nghtml文件目录下的index.html内容,即只要主机上的映射文件不变,对容器先前的修改操作就可应用到下一个新启动的容器中

修改容器内部文件映射到主机文件:


docker常用命令:
打印出所有容器:docker ps -a
打印出所有容器id:docker ps -aq
具体在使用命令前可以用docker --help来确定一下

批量强制删除容器(使用强制是因为容器还是运行状态,如果不使用强制删删不了,得先停止容器才能删):docker rm -f $(docker ps -aq) -f强制删除的容器id为docker ps -aq查询出来的所有容器id

写的好啰嗦。。。。。。。未完待续。。。。。。。。