介绍

将宿主机目录或文件挂载到容器里。

把容器想成单独的电脑,宿主机目录是一个U盘,挂载后,你往宿主机该目录里放文件,那么通过容器里对应目录便可以访问到此文件,不需要重新生成容器就可以在“容器外部”添加和修改某些文件。

命令
  1. $ docker run -v /宿主机:/容器 centos
  2. # 挂载 downloads 目录
  3. $docker run -v /downloads:/etc/nginx/downloads -d nginx
  4. # 挂载 a.txt 文件
  5. $ docker run -v /Downloads/a.txt:/etc/nginx/a.txt -d nginx

注意
  1. 宿主机目录如果不存在,则会先自动生成。
  2. 容器目录不能为相对路径。
  3. 宿主机相对路径情况: ```shell

    运行

    $ docker run -v test1:/soft centos

通过docker inspect命令,查看容器“Mounts”部分

“Mounts”: [ { “Name”: “test1”, “Source”: “/var/lib/docker/volumes/test1/_data”, “Destination”: “/soft”, “Driver”: “local”, “Mode”: “z”, “RW”: true } ]

  1. 可以看出容器内的`/soft`目录挂载的是宿主机上的 `/var/lib/docker/volumes/test1/_data` 目录。<br />所谓的相对路径指的是`/var/lib/docker/volumes/`,与宿主机的当前目录无关。
  2. 那我们想使用宿主机真相对路径可使用`$pwd`:<br />`docker run -v $PWD/nginx.conf:/etc/nginx/nginx.conf nginx`
  3. 4. 文件挂载:<br />通过查阅资料可知,docker在进行文件挂载时,并不是仅仅挂载文件名到对应位置,而是将文件对应的inode 进行映射。用vim进行文件的编辑并保存时,系统采用的是备份、替换的策略,文件用vim等工具编辑的过程实质是,备份原来的文件,当新文件编辑完成后,再将新文件替换原文件,这会导致文件的inode变化,所以docker内外的文件并不会同步。而用echo等重定向操作修改文件时,文件的inode保持不变,所以不会发生类似现象。
  4. 5. 停止容器再开启 重启<br />上述操作后,通过docker inspect命令,查看容器“Mounts”部分依旧看到目录被挂载。
  5. ```shell
  6. # 停止
  7. $ docker kill `pid`
  8. $ docker start `container_name`
  9. # 重启
  10. $ docker restart `container_name`
  11. # 查看
  12. $ cd /etc/nginx/downloads #可以看到目录依旧被挂载

感谢

Docker-V 详解

docker -v 挂载文件_docker文件挂载问题