介绍
将宿主机目录或文件挂载到容器里。
把容器想成单独的电脑,宿主机目录是一个U盘,挂载后,你往宿主机该目录里放文件,那么通过容器里对应目录便可以访问到此文件,不需要重新生成容器就可以在“容器外部”添加和修改某些文件。
命令
$ docker run -v /宿主机:/容器 centos
# 挂载 downloads 目录
$docker run -v /downloads:/etc/nginx/downloads -d nginx
# 挂载 a.txt 文件
$ docker run -v /Downloads/a.txt:/etc/nginx/a.txt -d nginx
注意
通过docker inspect命令,查看容器“Mounts”部分
“Mounts”: [ { “Name”: “test1”, “Source”: “/var/lib/docker/volumes/test1/_data”, “Destination”: “/soft”, “Driver”: “local”, “Mode”: “z”, “RW”: true } ]
可以看出容器内的`/soft`目录挂载的是宿主机上的 `/var/lib/docker/volumes/test1/_data` 目录。<br />所谓的相对路径指的是`/var/lib/docker/volumes/`,与宿主机的当前目录无关。
那我们想使用宿主机真相对路径可使用`$pwd`:<br />`docker run -v $PWD/nginx.conf:/etc/nginx/nginx.conf nginx`
4. 文件挂载:<br />通过查阅资料可知,docker在进行文件挂载时,并不是仅仅挂载文件名到对应位置,而是将文件对应的inode 进行映射。用vim进行文件的编辑并保存时,系统采用的是备份、替换的策略,文件用vim等工具编辑的过程实质是,备份原来的文件,当新文件编辑完成后,再将新文件替换原文件,这会导致文件的inode变化,所以docker内外的文件并不会同步。而用echo等重定向操作修改文件时,文件的inode保持不变,所以不会发生类似现象。
5. 停止容器再开启 或 重启<br />上述操作后,通过docker inspect命令,查看容器“Mounts”部分依旧看到目录被挂载。
```shell
# 停止
$ docker kill `pid`
$ docker start `container_name`
# 重启
$ docker restart `container_name`
# 查看
$ cd /etc/nginx/downloads #可以看到目录依旧被挂载