【问题标题】:How docker handles multiple mount types?docker 如何处理多种挂载类型?
【发布时间】:2018-05-27 12:21:27
【问题描述】:

这篇文章有点长,但请耐心等待......

假设您有一个应用程序位于本地(主机)文件系统的/app 中,具有以下结构

app
|-- index.php
|-- foo
|   `-- file-h1
`-- bar
    `-- file-h2

现在假设我们有一个利用以下数据结构的图像(标记为myrepo/app

opt
|-- app
|   `-- foo
|       `-- file-c1

如果我们通过将主机的/app 挂载到容器的/opt/app 来从该映像运行容器,如下所示

docker container run \
-v /app:/opt/app \
myrepo/app

生成的容器数据结构如下

opt
|-- app
|   |-- index.php
|   |-- foo       
|   |   `-- file-h1          
|   `-- bar
|       `-- file-h2 

到目前为止,一切都很好......

使用多个挂载(绑定挂载和卷)运行容器

现在,假设我们想使用 both 一个名为 data命名卷 挂载到 /opt/app/foo 和一个 bind-mount 用于将/app 安装到/opt/app

docker container run \
-v /app:/opt/app \
-v data:/opt/app/foo
myrepo/app

容器内的结果数据结构将是:

opt
|-- app
|   |-- index.php
|   |-- foo       
|   |   `-- file-c1          
|   `-- bar
|       `-- file-h2 

正如在各种帖子(如thisthis)中所述,docker 挂载按字典顺序执行(即最短路径优先)。据此,我希望 docker 先执行绑定挂载 ( -v /app:/opt/app),然后执行卷 (-v data:/opt/app/foo)。

因此,我预计主机的/app 的内容将替换/隐藏容器的/opt/app 的内容,因此file-h1 将位于/opt/app/foo 内部。最后,file-h1 将是新创建的 data 卷中的 copied,并且该卷将安装在 /opt/app/foo 上(因此应该显示 file-h1 而不是 file-c1

当我试图理解this 对 SO 的回答时提出的问题

【问题讨论】:

    标签: docker docker-compose


    【解决方案1】:

    最后,在 github 用户 cpuguy83 的大力帮助下,我弄清楚了 当我们尝试运行一个使用多个不同类型挂载的容器时,docker 引擎实际上做了什么(例如,两个bind-mount 和 volume) 例如:

    docker container run \
    -v /app:/opt/app \
    -v data:/opt/app/foo
    myrepo/app
    

    这里要理解的关键点是docker分两步执行流程,按以下顺序完成:

    1. 首先,它在主机文件系统 (... data/) 中为容器创建一个新的存储空间(即卷)来保存文件,然后(因为新创建的卷是空的)它copies容器的文件(即 /opt/app/foo/* 中的任何内容)到卷的存储位置 (... data/)

    2. 然后,它按字典顺序执行所有挂载(绑定、卷、tmpfs 挂载等...都集中在一起)(首先挂载 /app/opt/app 然后 ... data/ 到 @ 987654330@)

    因此,因此,当我们在示例中运行带有挂载的容器时,docker first 会将 file-c1 复制到主机文件系统中的 ... data/ 位置,然后 second 它将首先将主机的/app 的内容挂载到容器的/opt/app,然后将主机的... data/(包含file-c1)挂载到容器的/opt/app/foo 覆盖/模糊其内容(即覆盖file-h1file-c1)。因此,如果我们在挂载完成后查看正在运行的容器内部,结果将如下所示:

    opt
    |-- app
    |   |-- index.php
    |   |-- foo       
    |   |   `-- file-c1          
    |   `-- bar
    |       `-- file-h2
    

    【讨论】:

    • 这是一个令人难以置信的具体问题,我正要问 SO,然后我遇到了你的问题,它准确地解释了我在寻找什么!我注意到完全相同的行为,但不知道为什么。非常感谢!
    猜你喜欢
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    相关资源
    最近更新 更多