docker的目录挂载与卷映射
文章目录
- 一、目录挂载
- 背景
- 定义
- 使用
- 二、卷映射
- 背景
- 定义
- 区别
- 使用
- docker对卷的操作
一、目录挂载
背景
上一文,我们提了docker exec进入容器修改页面很麻烦,所以在这里,我们学习一个新的容器使用方法,叫“目录挂载”
定义
长话短说,依据我的理解,是做了一个映射,一个从docker容器到主机的一个映射
使用
命令示例如下:
docker run -d -p 8885:80 -v /app/ng_html:/usr/share/nginx/html --name my_test nginx
-d
即 --detach,表示以分离模式运行容器。也就是容器会在后台运行,不会将容器的输出信息显示在当前终端上。使用此选项后,容器启动后会返回容器的 ID。-p 8885:80
即 --publish,用于将容器内的端口映射到宿主机的端口。这里的 8885 是宿主机的端口,80 是容器内的端口。这意味着当你在宿主机上访问 localhost:8885 时,实际上会访问到容器内的 80 端口,也就是 Nginx服务默认监听的端口。-v /app/ng_html:/usr/share/nginx/htm
l 即 --volume,用于将宿主机的目录挂载到容器内的目录。/app/ng_html 是宿主机上的目录,/usr/share/nginx/html 是容器内 Nginx服务默认的网站根目录。通过这种挂载方式,你可以直接在宿主机的 /app/ng_html目录下修改文件,这些修改会实时反映到容器内的网站根目录中,从而实现数据的共享和持久化。--name my_test
用于为新创建的容器指定一个名称。这里将容器命名为 my_test,方便后续对容器进行管理,例如使用 docker start my_test、docker stop my_test 等命令来启动或停止该容器。nginx
这是要基于其创建容器的镜像名称。Docker 会先检查本地是否存在 nginx 镜像,如果不存在,则会从 Docker Hub上下载该镜像,然后基于该镜像创建并启动容器。
这样就完成了目录挂载,如果你本地没有app/ng_html
这个被docker挂载的目录,没关系,docker会自己帮你mkdir,此时,你的被挂载地址是空的,所以,你打开你服务器的映射端口(这里是服务器的8885映射docker容器里的80)
下面,我们在服务器的ng_html创建文件,观察docker的容器是否能解析服务器的这个地址
打开服务器网址,刷新
Right~
同时,在docker exec对里面文件同样有用;删除容器,本地服务器的文件夹依然存在,所以下次你还可以用这个映射;
补充外部知识,echo后单箭头>
是写入,>>
是追加
二、卷映射
背景
这还有个问题,nginx里有配置文件吧,我要修改这个,我就还得docker exec进容器,那目录挂载有时显的很鸡肋啊。诶~所以咱还可以使用卷映射来解决这个问题。
在引入卷映射之前,我们需要表明,-v /app/ng_conf:/etc/nginx
也可以将配置文件挂载到本地,但会发生如下报错
因为映射完,外面的文件夹是空,然后映射到容器里面也是空,所以显示no such file。所以我们想,能不能在外面操作的同时,一启动,就同步文件的内容呢
定义
卷映射指的是把宿主机上的目录或者文件,挂载到容器内的指定路径上。这样一来,容器就可以访问和操作宿主机上的数据,而且宿主机对数据的修改也能马上在容器里体现出来,反之亦然。
区别
然而,这卷映射和目录挂载有啥区别嘞
这里放两个引用,博主写的蛮好。
理论分析:
https://blog.csdn.net/Cai181191/article/details/133791784?fromshare=blogdetail&sharetype=blogdetail&sharerId=133791784&sharerefer=PC&sharesource=m0_73118788&sharefrom=from_link
一个总结:数据卷挂载适合多个容器共享数据,而目录挂载适合单个容器与主机之间进行数据交换。
实践区分:
https://blog.csdn.net/wangye135/article/details/142303233?fromshare=blogdetail&sharetype=blogdetail&sharerId=142303233&sharerefer=PC&sharesource=m0_73118788&sharefrom=from_link
在实践方面,我再写一下我的观察:
目录挂载和卷挂载,-v
后面都写目录:容器地址
更严谨地说,目录挂载是-v 本地目录:容器内目录
,卷挂载是-v 数据卷名:容器目录
所以得出,不同的是,目录挂载的本机目录是/xxx/xx....
的形式,而卷挂载仅仅是写一个地址,即没有/
,例子见下面的示列,仅有ngconf
(因为一个是地址,一个是数据卷的名称)
使用
命令:
docker run -d -p 8885:80 -v /app/ng_html /usr/share/nginx/html -v ng_conf:/etc/nginx --name my_test_v nginx
同时,docker里面挂载的卷都在/var/lib/docker/volumes/
的文件夹下面
你看,里面的ng_conf就是我们通过上面命令建立的文件夹
cd进去可以看到nginx映射过来的配置文件
docker对卷的操作
主要核心:
docker volume
比如,docker volume ls
可以看里面创建的卷
docker volume create 卷名字
这可以创建卷
docker volume inspect ng_conf
这可以看指定卷的信息,比如存放的位置
attention:删除容器,挂载的目录和创建的卷都不会被删除