ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

docker存储方式——目录挂载

docker存储方式——目录挂载 一、核心概念Docker 容器的文件属于容器内部容器删除后内部数据全部丢失。为实现数据持久化提供两种挂载方式bind 目录挂载绑定挂载、命名卷映射volume 数据卷。语法通用格式-v 源路径:容器内目标路径冒号左边宿主机侧冒号右边容器内部路径1.bind 目录挂载绑定挂载识别特征-v冒号左边以 / 开头是宿主机绝对路径示例-v /app/ngconf:/etc/nginx规则完全以宿主机目录内容为准覆盖容器内部目录不会合并文件如果宿主机该路径不存在Docker 会自动在宿主机创建该目录创建出来是空目录。挂载之后容器内目标目录内容 宿主机目录内容。⚠️重大坑宿主机是空目录挂载后容器内目录也变成空如果挂载网页目录/usr/share/nginx/html空目录只会网页 403nginx 进程不会退出。如果挂载配置目录/etc/nginx空目录会把 nginx.conf 全部清空服务直接启动失败Exited(1)。报错No such file or directory适用场景开发调试需要在宿主机直接修改代码、网页、配置文件修改立刻容器生效。挂载宿主机已经存在的文件、证书、系统目录。注意如果宿主机目录为空又要挂载容器自带配置目录不能直接挂载需要先用docker cp把容器内部原始文件拷贝到宿主机目录。#拷贝容器内/etc/nginx全部文件到宿主机/app/ngconf docker cp $(docker create --rm nginx):/etc/nginx/. /app/ngconf/拷贝完成后再执行 bind 挂载容器才能正常启动。1、挂载作用容器默认是临时环境docker rm删除容器容器内部全部数据丢失。使用-v绑定挂载把宿主机目录映射到容器内部实现数据持久化。删除容器、删除镜像宿主机上的文件不会丢失。2、绑定挂载语法-v 宿主机绝对目录:容器内目录本次实操命令docker run -d --name app01 -p 8090:80 -v /app/nginx/html:/usr/share/nginx/html nginx宿主机目录/app/nginx/html容器内映射目录/usr/share/nginx/html-p 8090:80浏览器访问使用宿主机端口80903、双向同步特性宿主机修改/app/nginx/html下文件容器内立刻看见不需要重启容器容器内修改/usr/share/nginx/html挂载目录里面的文件宿主机文件同步变化⚠️只有挂载的这一个目录双向同步容器其他目录和宿主机互不干扰。4、实操踩坑记录坑1文件写到挂载目录外面网页不生效cd /app/nginx echo 222 index.html此时 index.html 创建在/app/nginx/index.html挂载的是/app/nginx/html容器看不到外层这个文件。✅正确写法两种# 写法1进入挂载目录再写 cd /app/nginx/html echo 222 index.html # 写法2写完整绝对路径 echo 222 /app/nginx/html/index.html坑2进入容器在根目录找挂载文件文件不存在docker exec -it 容器ID bash cat index.html # 报错 No such file or directory刚进容器默认在容器根目录/挂载文件不在根目录。✅正确切换到挂载对应的容器路径cd /usr/share/nginx/html cat index.html # 追加内容 覆盖内容 echo 3333 index.html坑3命令参数顺序写错错误示范--name位置放错docker run -d -p 8090:80 -v /app/nginx/html:/usr/share/nginx/html nginx --name app01 nginx错误示例docker run 参数选项--name、‑p、‑v必须写在镜像名字前面镜像名写在整条命令最后。✅正确顺序docker run [选项] 镜像名docker run -d --name app01 -p 8090:80 -v /app/nginx/html:/usr/share/nginx/html nginx坑4混淆容器ID和镜像ID使用docker rmi删除容器docker rm -f 容器ID # 删除容器 docker rmi 镜像ID # 删除镜像错误示例rmi后面写的是容器IDps查容器 imges查镜像docker rmi只能删镜像不能删容器拿容器ID执行rmi会报错 No such image。坑5浏览器显示nginx 403 Forbidden挂载目录/app/nginx/html里面没有index.html文件目录为空文件权限不足 修复echo 222 /app/nginx/html/index.html chmod -R 755 /app/nginx/html5、验证持久化完整实操流程#1 启动带挂载的容器 docker run -d --name app01 -p 8090:80 -v /app/nginx/html:/usr/share/nginx/html nginx #2 宿主机写入文件 echo 222 /app/nginx/html/index.html #3 进入容器追加内容 docker exec -it app01 bash cd /usr/share/nginx/html echo 3333 index.html exit #4 删除容器测试数据是否保留 docker rm -f app01 #5 宿主机文件依然存在数据没有丢失 cat /app/nginx/html/index.html #6 重新新建容器复用挂载目录数据直接恢复 docker run -d --name app01 -p 8090:80 -v /app/nginx/html:/usr/share/nginx/html nginx #7 访问测试 curl 127.0.0.1:8090在容器外面看也是正常显示的6、核心结论面试-v 宿主机路径:容器路径绑定挂载数据存储在宿主机磁盘。docker rm删除容器、docker rmi删除镜像不会删除宿主机挂载目录的数据。双向同步宿主机改挂载目录容器可见容器改挂载目录宿主机同步变更。只有挂载映射的目录才同步其余目录完全隔离。docker run 的所有选项参数‑p /‑v /‑‑name必须放在镜像名称之前。7、记忆小口诀run选项放前面镜像名字放最后 ‑v前宿后容器只同步映射文件夹 删容器不删挂载数据持久化靠宿主机磁盘覆盖用 追加用 两者不要搞混。
返回列表