docker如何加volume(Dockerfile 中 VOLUME 与 docker -v 的区别说明)
docker如何加volume
Dockerfile 中 VOLUME 与 docker -v 的区别说明Dockerfile 中的 VOLUME 挂载与 docker -v 命令挂载,两者有明显区别:
1、VOLUMEDockerfile中 VOLUME 方式挂载到宿主机上的是匿名卷,在宿主机上是自动匿名挂载到 /var/lib/docker/volumes/ 目录下的,代码如下:
FROM frolvlad/alpine-java:jre8-slim MAINTAINER oas.cloud COPY 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 -vdocker -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 mount | volume |
---|---|---|
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映射目录(Dockerfile中ENTRYPOINT 和 CMD的区别说明)
- docker如何加volume(Dockerfile 中 VOLUME 与 docker -v 的区别说明)
- dockerfile的镜像原理(dockerfile制作apache镜像的方法)
- dockerfile构建mysql镜像并初始化(docker-compose基于MySQL8部署项目的实现)
- docker和tomcat建立连接(如何基于Dockerfile构建tomcat镜像)
- dockerfile 添加yum文件(使用YUM 安装 docker的方法步骤)
- idea生成dockerfile(idea集合docker实现镜像打包一键部署)
- dockerfile配置参数(dockerfile中ENTRYPOINT与CMD的结合使用及区别)
- docker怎么增加端口(docker 添加端口及获取dockerfile的方法)
- 查看docker容器进程运行状态命令(docker容器内要启动两个进程时Dockerfile的实现代码)
- dockerfile镜像案例(Dockerfile构建自定义镜像的实现)
- dockerfile挂载目录(解决docker run中使用 ./ 相对路径挂载文件或目录失败的问题)
- dockerfile构建镜像两种方式(通过Dockerfile构建Docker镜像的方法步骤)
- dockerfile自定义镜像图解(Docker images导出和导入操作)
- dockerfile镜像介绍(使用Dockerfile构建docker镜像)
- docker目录映射不起作用(关于dockerfile build过程中报/bin/sh: pip: command not found的解决方法)
- 庆八一,重读经典红色语录,感悟互联网发展硬道理(重读经典红色语录)
- TVB新剧《黯夜守护者》将播,陈展鹏陈炜首次合作探讨人性(TVB新剧黯夜守护者将播)
- 新晋小花被称女版吴卓羲 将取代滕丽名成为TVB新一代御用女警(新晋小花被称女版吴卓羲)
- 艺人吴卓羲10年警察生涯,演足10年阿Sir,系咩玩法(艺人吴卓羲10年警察生涯)
- 菲律宾潜水(菲律宾潜水价格)
- 泰国人妖(变性手术生殖器要割掉吗)
热门推荐
- mysql死锁是什么原因(MySQL的MaxIdleConns不合理,会变成短连接的原因)
- webpack常用的配置(webpack-dev-server搭建本地服务器的实现)
- 微信小程序企业微信打卡(使用Python实现企业微信的自动打卡功能)
- angular开发详解(详解Angular组件生命周期一)
- python完整异常机制(深入理解Python异常处理的哲学)
- tomcat 多线程并发cpu(Tomcat使用线程池处理远程并发请求的方法)
- 面试时如何谈自己的优点
- vue怎么接收后台的数据(Vue封装全局toast组件的完整实例)
- php框架初始化教程学习(PHP从零开始打造自己的MVC框架之类的自动加载实现方法详解)
- .NET中低版本程序调用高版本DLL
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9