文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Dockerfile中VOLUME与docker -v的区别是什么

2023-06-14 07:10

关注

这篇文章主要介绍Dockerfile中VOLUME与docker -v的区别是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

Dockerfile 中的 VOLUME 挂载与 docker -v 命令挂载,两者有明显区别:

1、VOLUME

Dockerfile中 VOLUME 方式挂载到宿主机上的是匿名卷,在宿主机上是自动匿名挂载到 /var/lib/docker/volumes/ 目录下的,代码如下:

FROM frolvlad/alpine-java:jre8-slimMAINTAINER oas.cloudCOPY nickdir .VOLUME /usr/local/oas/file/WORKDIR /usr/local/oas/

上述 VOLUME /usr/local/oas/file/ 定义的是容器内目录所在路径,在容器创建过程中会在容器中创建该目录,而宿主机上的挂载目录名是随机生成的,

例如:

/var/lib/docker/volumes/593fda6d7b8296bfca22894b326727c734133eebb11c9bc2c25a73b892157a37

这里宿主机上的

/var/lib/docker/volumes/593fda6d7b8296bfca22894b326727c734133eebb11c9bc2c25a73b892157a37

目录对应的就是容器中的 /usr/local/oas/file/ 目录

2、docker -v

docker -v 可以指定挂载到宿主机的具体目录,相对于Dockerfile的 VOLUME 挂载方式更具有可控性,代码如下:

$ docker run —name tengine-web -d -p 9527:80 -p 9000:9000 \-v /usr/local/tengine/logs:/var/log/nginx \-v /usr/local/tengine/conf.d:/etc/nginx/conf.d \-v /usr/local/tengine/conf/nginx.conf:/etc/nginx/nginx.conf \-v /usr/local/tengine/html:/usr/share/nginx/html \-v /usr/local/oas/file:/usr/local/oas/file nginx

上述命令就可以将宿主机的 /usr/local/tengine/logs 等目录挂载到容器的 /var/log/nginx 等对应目录,冒号前为宿主机目录(绝对路径),冒号后为镜像内挂载的路径(绝对路径)。

补充:Docker数据卷挂载命令volume(-v)与mount的区别

一、前言

用户可以通过docker run的--volume/-v或--mount选项来创建带有数据卷的容器,但这两个选项有些微妙的差异,在这里总结梳理一下。

二、命令用法

--volume(-v)

参数--volume(或简写为-v)只能创建bind mount。示例:

docker run --name $CONTAINER_NAME -it \-v $PWD/$CONTAINER_NAME/app:/app:rw \-v $PWD/$CONTAINER_NAME/data:/data:ro \avocado-cloud:latest /bin/bash

注释:

命令格式:

[[HOST-DIR:]CONTAINER-DIR[:OPTIONS]]]

如果指定HOST-DIR则必须是绝对路径,如果路径不存在则会自动创建

实例中的rw为读写,ro为只读

--mount

参数--mount默认情况下用来挂载volume,但也可以用来创建bind mount和tmpfs。如果不指定type选项,则默认为挂载volume,volume是一种更为灵活的数据管理方式,volume可以通过docker volume命令集被管理。示例:

docker run --name $CONTAINER_NAME -it \--mount type=bind,source=$PWD/$CONTAINER_NAME/app,destination=/app \--mount source=${CONTAINER_NAME}-data,destination=/data,readonly \avocado-cloud:latest /bin/bash

注释:

挂载volume命令格式:

[type=volume,]source=my-volume,destination=/path/in/container[,...]

创建bind mount命令格式:

type=bind,source=/path/on/host,destination=/path/in/container[,...]

如果创建bind mount并指定source则必须是绝对路径,且路径必须已经存在

示例中readonly表示只读

三、差异总结

1、创建bind mount和挂载volume的比较

对比项bind mountvolume
Source位置用户指定/var/lib/docker/volumes/
Source为空覆盖dest为空保留dest内容
Source非空覆盖dest内容覆盖dest内容
Source种类文件或目录只能是目录
可移植性一般(自行维护)强(docker托管)
宿主直接访问容易(仅需chown)受限(需登陆root用户)*

*注释:

Docker无法简单地通过sudo chown someuser: -R /var/lib/docker/volumes/somevolume来将volume的内容开放给主机上的普通用户访问,如果开放更多权限则有安全风险。而这点上Podman的设计就要理想得多,volume存放在$HOME/.local/share/containers/storage/volumes/路径下,即提供了便捷性,又保障了安全性。

无需root权限即可运行容器,这正是Podman的优势之一,实际使用过程中的确受益良多。

2、创建bind mount时使用--volume和--mount的比较

对比项--volume 或 -v--mount type=bind
如果主机路径不存在自动创建命令报错

以上是“Dockerfile中VOLUME与docker -v的区别是什么”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯