跟陈sir一起玩转docker卷 二

使用绑定挂载(bind mount)

绑定挂载在Docker的早期就已经存在了。与卷相比,绑定挂载的功能非常有限。当您使用绑定挂载时,主机上的文件或目录会被挂载到一个容器中。文件或目录通过主机上的完整或相对路径引用。相比之下,当您使用卷时,将在宿主机的Docker的存储目录中创建一个新目录,并且Docker将管理该目录的内容。

文件或目录不需要在Docker宿主机上存在。如果目录或者文件还不存在,docker会自动创建出来。绑定挂载的性能非常好,但是它们依赖于主机文件系统的特定目录结构。如果您正在开发新的Docker应用程序,请考虑使用命名卷。您不能使用Docker CLI命令直接管理绑定挂载。

选择 -v or –mount 标志

最初,-v或--volume标志用于独立容器,而--mount标志用于群集服务。但是,从Docker 17.06开始,您也可以使用--mount独立的容器。一般来说,--mount更明确和详细。最大的区别在于-v语法将所有选项组合在一个字段中,而--mount语法将它们分开。以下是每个标志的语法比较。

提示:新用户应该使用--mount语法。有经验的用户可能更熟悉-v或--volume语法,但是鼓励使用--mount,因为研究表明它更易于使用。

  • - v或- volume:由三个字段组成,由冒号分隔(:)。字段必须按照正确的顺序书写,并且每个字段的含义都不是立刻确定。

    • 在绑定挂载的情况下,第一个字段是到主机上的文件或目录的路径。
    • 第二个字段是挂载到容器中的文件或目录的路径。
    • 第三个字段是可选的,它是一个逗号分隔的选项列表,如ro、consistent、delegated、cached、z和Z。下面将讨论这些选项。
  • --mount:由多个键-值对组成,由逗号分隔,每一对由< key>= <value> tuple(元组)组成。--mount 语法比- v或—volume 更详细,其中键对的顺序并不重要,而且标记的值更容易理解。

    • 挂载的类型(type),可以是绑定(bind)、卷(volume)或tmpfs。本主题讨论bind mount,因此类型将始终是bind mount。
    • 挂载源(source)。对于绑定挂载,是指在宿主机上的文件或者目录路径。。可以通过source 或src参数指定。
    • 挂在目标(destination),是指将挂载源挂载到docker 容器中的文件或者目录的路径。可以使用destination、dst或target 参数指定。
    • 如果存在readonly选项,则绑定挂载为只读。
    • 如果指定绑定传播(bind-propagation)选项,则其值可以是rprivate,private,rshared,shared,rslave,slave。
    • 一致性选项,如果存在,其值可以是 consistent, delegated, or cached。这个设置只适用于Mac的Docker,在其他平台上都被忽略。
    • --mount 参数不支持修改selinux标签的z或Z选项。

- v和- mount行为之间的差异

如果您使用- v或- volume来绑定在Docker宿主机上尚不存在的文件或目录,则- v将为您创建该端点(endpoint)。它总是创建为一个目录。
如果您使用 --mount 来绑定一个在Docker宿主机上尚不存在的文件或目录,Docker不会自动为您创建它,而是生成一个错误。

启动带卷参数的容器

假设有一个叫做source的目录,当您构建源代码时,生成的artifacts 被保存到source/target中。您希望这些生成的artifacts,在容器中被挂载到 /app 目录下,并且您希望每次在宿主机上重新构建之后,在容器中都能生效。使用以下命令将target目录绑定到/ app /中。从在source 目录中运行该命令。$(pwd)子命令表示Linux或macOS主机上的当前工作目录。

$ docker run -d \
  -it \
  --name devtest \
  --mount type=bind,source="$(pwd)"/target,target=/app \
  nginx:latest

或者

$ docker run -d \
  -it \
  --name devtest \
  -v "$(pwd)"/target:/app \
  nginx:latest

使用docker inspect devtest来验证绑定是否正确创建

"Mounts": [
    {
        "Type": "bind",
        "Source": "/tmp/source/target",
        "Destination": "/app",
        "Mode": "",
        "RW": true,
        "Propagation": "rprivate"
    }
],

删除容器

$ docker container stop devtest

$ docker container rm devtest

挂载到容器中的一个非空目录

如果将绑定挂载到容器上的非空目录中,则该目录的现有内容将被绑定挂载隐藏。这在有些时候是有好处的,例如,当您想要测试新版本的应用程序而无需构建新映像时。然而,这也可能是令人惊讶的,这种行为不同于docker volume。

本例的设计是极端的,但是将用宿主主机上的/ tmp 目录替换容器/usr 目录的内容。在大多数情况下,这将导致一个无用的容器。

$ docker run -d \
  -it \
  --name broken-container \
  --mount type=bind,source=/tmp,target=/usr \
  nginx:latest

docker: Error response from daemon: oci runtime error: container_linux.go:262:
starting container process caused "exec: \"nginx\": executable file not found in $PATH".
$ docker run -d \
  -it \
  --name broken-container \
  -v /tmp:/usr \
  nginx:latest

docker: Error response from daemon: oci runtime error: container_linux.go:262:
starting container process caused "exec: \"nginx\": executable file not found in $PATH

容器被创建出来,但是不能正常启动,删除它

$ docker container rm broken-container

只读绑定挂载

对于某些应用程序,可以将容器写入绑定挂载,以便将更改传播回Docker主机。在其他时候,容器应该只能读取数据,而不是修改数据。

这个示例修改了上面的一个,但是将该目录挂载为只读绑定挂载,通过在容器内的装入点之后添加ro选项(默认为空)。在这里可以有多个选项,用逗号分隔。

$ docker run -d \
  -it \
  --name devtest \
  --mount type=bind,source="$(pwd)"/target,target=/app,readonly \
  nginx:latest
$ docker run -d \
  -it \
  --name devtest \
  -v "$(pwd)"/target:/app:ro \
  nginx:latest

使用docker inspect devtest来验证bind mount 是否正确创建

"Mounts": [
    {
        "Type": "bind",
        "Source": "/tmp/source/target",
        "Destination": "/app",
        "Mode": "ro",
        "RW": false,
        "Propagation": "rprivate"
    }
],

删除镜像

$ docker container stop devtest

$ docker container rm devtest

配置绑定传播

对于绑定挂载(bind mount)和卷,绑定传播默认为 rprivate。它只能配置绑定挂载,并且只能在Linux主机上配置。绑定传播是一个高级话题,大多数用户不需要配置它。

Propagation 是指在给定的挂载卷或命名卷中创建的挂载是否可以传播到该挂载的副本。考虑一个挂载点 /mnt,它被挂载在 /tmp。传播设置控制是否挂载 /tmp/a 也可用 /mnt/a.每个 Propagation 设置都有一个递归对应点。在递归的情况下,考虑 /tml/a 被挂载为 /foo。传播设置控制是否 /mnt/a/tmp/a 将存在。

传播设定(Propagation setting) 描述
shared 原始挂载的子挂载被暴露在复制挂载上,复制挂载的子挂载也会传播到原来的挂载。
slave 类似于共享(share)挂载,但仅在一个方向上。如果原始挂载暴露一个子挂载,副本挂载可以看到它。但是,如果副本挂载公开了子挂载,则原始挂载无法看到它。
private 私有,子挂载不暴露给副本挂载,副本挂在的子挂载也不暴露给原始挂载
rshared 和共享(share)传播类似,但是传播扩展到原始或者副本挂载点的嵌套挂载点
rslave 和slave 设置相同,但是传播扩展到原始和副本挂载点所嵌套挂载点
rprivate 默认设置, 与私有相同,这意味着在原始或复制挂载点内的任何地方都不会向任意方向传播

在挂载点上设置绑定传播之前,主机文件系统需要支持绑定传播。

有关绑定传播的更多信息,请参见 共享子树的Linux内核文档

下面的示例将 target/ 目录装载到容器中两次,第二个挂载设置ro选项和rslave绑定传播选项。

$ docker run -d \
  -it \
  --name devtest \
  --mount type=bind,source="$(pwd)"/target,target=/app \
  --mount type=bind,source="$(pwd)"/target,target=/app2,readonly,bind-propagation=rslave \
  nginx:latest
$ docker run -d \
  -it \
  --name devtest \
  -v "$(pwd)"/target:/app \
  -v "$(pwd)"/target:/app2:ro,rslave \
  nginx:latest

现在,如果你创建/ app/foo /,/ app2/foo /也会存在。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • docker volume 详解 卷是持久化由Docker容器生成和使用的数据的首选机制。虽然绑定挂载依赖于主机的...
    陈sir的知识图谱阅读 782评论 0 0
  • 转载自 http://blog.opskumu.com/docker.html 一、Docker 简介 Docke...
    极客圈阅读 10,404评论 0 120
  • 五、Docker 端口映射 无论如何,这些 ip 是基于本地系统的并且容器的端口非本地主机是访问不到的。此外,除了...
    R_X阅读 1,670评论 0 7
  • 1601.感恩我记录感恩日记,今天21天。一个良好的习惯就此养成了。 1602.感恩这21天来发生的点点滴滴,感恩...
    李馨兰阅读 274评论 0 0
  • 最幸福的事莫过于你喜欢的人正好喜欢你。 暗恋六年, 却从来没有说出口, 甚至表现出来过。因为六年里你早已融入我的生...
    94暖暖阳光阅读 378评论 12 8