用-v挂载宿主机目录是最常用方式,需确保宿主机路径存在且有权限、容器内路径为绝对路径、空目录可能触发镜像初始化逻辑,挂载后内容实时双向同步,windows/macos须用绝对路径,运行中容器不可动态添加挂载。

直接用 -v 或 --mount 挂载宿主机目录到容器内,是最常用、最可靠的方式。关键不是“能不能挂”,而是挂对路径、权限和初始化逻辑。
用 -v 挂载宿主机目录(推荐新手)
语法简单明确:docker run -v 主机路径:容器路径 [其他参数] 镜像名。冒号前是宿主机绝对路径,必须存在;冒号后是容器内目标路径,会自动创建(如果不存在)。
- 宿主机目录为空时,容器对应路径也会为空——比如挂载
/data/nginx/html到 Nginx 容器的/usr/share/nginx/html,若宿主机该目录下没index.html,访问页面就会 403 或 404 - 建议先启动一次原镜像容器,用
docker cp把默认文件拷出来:docker cp nginx-test:/usr/share/nginx/html/. /data/nginx/html/ - 挂载后,宿主机改文件,容器内立即可见;容器内写日志或上传文件,也实时同步到宿主机
用 docker volume 管理共享数据(适合多容器协作)
适用于多个容器需要读写同一份数据,比如两个 Nginx 实例共用静态资源,或 Web 应用与日志分析容器共享日志目录。
- 先创建命名卷:
docker volume create web-content - 启动容器时挂载:
docker run -d -v web-content:/usr/share/nginx/html -p 8080:80 nginx - 再起一个容器挂同一卷:
docker run -d -v web-content:/app/public -p 8081:80 nginx,两者就共享/app/public和/usr/share/nginx/html下的内容 - 卷的物理位置在
/var/lib/docker/volumes/xxx/_data,不建议手动修改,用docker volume inspect查看路径即可
注意挂载时机与目录初始化
很多问题出在“挂载覆盖”:Nginx、MySQL 等镜像启动时会检查目标目录是否为空,若为空可能自动生成默认配置或拒绝启动。
- 解决办法:提前把镜像内置文件拷贝到宿主机目录(如上文
docker cp步骤) - 也可加
:ro设为只读挂载,防止容器误删宿主机文件,例如-v /data/conf:/etc/nginx/conf.d:ro - Windows/macOS 用户注意路径格式:
C:\data要写成/c/data(Docker Desktop 自动转换),Linux 直接用绝对路径即可
验证挂载是否生效
别只信命令没报错,要动手验证:
- 进容器:
docker exec -it 容器名 sh,执行ls -l /容器路径,确认内容与宿主机一致 - 在宿主机修改一个文件,回到容器里
cat查看是否更新 - 运行
docker inspect 容器名,查Mounts字段,确认Source(宿主机路径)和Destination(容器路径)正确无误











