Dockerfile 中 VOLUME 与 docker -v 的区别说明

 更新时间:2021年03月23日 11:25:05   作者:地表最强菜鸡  
这篇文章主要介绍了Dockerfile 中 VOLUME 与 docker -v 的区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

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

1、VOLUME

Dockerfile中 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 -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 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
如果主机路径不存在 自动创建 命令报错

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

相关文章

  • Docker拉取镜像过慢或卡死的解决方法(亲测有效)

    Docker拉取镜像过慢或卡死的解决方法(亲测有效)

    本文主要介绍了Docker拉取镜像过慢或卡死的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • 使用GoogleContainerTools容器化jib构建docker镜像

    使用GoogleContainerTools容器化jib构建docker镜像

    这篇文章主要教大家如何使用GoogleContainerTools容器化jib构建docker镜像的实现,有需要的的朋友可以借鉴参考下希望能够有所帮助,祝大家多多进步
    2022-03-03
  • 关于dockerfile build过程中报/bin/sh: pip: command not found的解决方法

    关于dockerfile build过程中报/bin/sh: pip: command not found的解决方法

    这篇文章主要介绍了关于dockerfile build过程中报/bin/sh: pip: command not found的解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Docker解决终端无法输入中文的问题

    Docker解决终端无法输入中文的问题

    这篇文章主要介绍了Docker解决终端无法输入中文的问题,帮助大家更好的理解和学习docker的用法,感兴趣的朋友可以了解下
    2020-08-08
  • docker运行PostgreSQL数据库维护执行脚本备份数据库与更新表结构的方法

    docker运行PostgreSQL数据库维护执行脚本备份数据库与更新表结构的方法

    这篇文章主要介绍了docker运行PostgreSQL数据库维护,执行脚本备份数据库与更新表结构,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • 详解docker容器的层的概念

    详解docker容器的层的概念

    这篇文章主要介绍了详解docker容器的层的概念,帮助大家更好的理解和学习使用docker容器,感兴趣的朋友可以了解下
    2021-04-04
  • Docker-compose一键部署gitlab中文版的方法步骤

    Docker-compose一键部署gitlab中文版的方法步骤

    这篇文章主要介绍了Docker-compose一键部署gitlab中文版的方法步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • Docker 安装启动Jenkins的方法(docker-compose)

    Docker 安装启动Jenkins的方法(docker-compose)

    这篇文章主要介绍了Docker 安装启动 Jenkins(docker-compose)的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • IDEA 配置Docker的过程

    IDEA 配置Docker的过程

    这篇文章主要介绍了IDEA 配置Docker的过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • 关于为Windows Service 2019 使用 Docker的问题

    关于为Windows Service 2019 使用 Docker的问题

    最近收到领导通知,甲方需要将原来的服务器迁移到新的服务器,原来的服务器上安装了很多的服务,每次重启之后总是有很多的问题需要人工大量的进行干预,今天小编通过本文给大家介绍下Windows Service 2019 使用 Docker的问题,需要的朋友参考下吧
    2022-05-05

最新评论