为什么docker(dind)容器中的docker使用主机路径安装卷?

Dav*_*san 7 docker dind

我在 docker 中设置了 docker 并尝试挂载文件夹。

假设我有那些我希望与他的父母共享的文件夹。在主机上,我在 /tmp/dind 中创建了一个名为foo. 主机启动容器1,启动容器2。这就是我想要的结果。

Host      | Container 1 | Container 2

/tmp/dind |  /tmp/dind2 | /tmp/dind3
      <------->     <------->
Run Code Online (Sandbox Code Playgroud)

相反,我得到

Host      | Container 1 | Container 2

/tmp/dind |  /tmp/dind2 | /tmp/dind3
      <------->
      <----------------------->
Run Code Online (Sandbox Code Playgroud)

代码在这里:

docker run --rm -it \
  -v /tmp/dind:/tmp/dind2 \
  -v /var/run/docker.sock:/var/run/docker.sock docker sh -c \
    "docker run --rm -it \
      -v /tmp/dind2:/tmp/dind3 \
      -v /var/run/docker.sock:/var/run/docker.sock \
      docker ls /tmp/dind3"
Run Code Online (Sandbox Code Playgroud)

这不输出任何内容,而下一个命令给出 foo 作为结果。我改变了安装的卷:

docker run --rm -it \
  -v /tmp/dind:/tmp/dind2 \
  -v /var/run/docker.sock:/var/run/docker.sock docker sh -c \
    "docker run --rm -it \
      -v /tmp/dind:/tmp/dind3 \
      -v /var/run/docker.sock:/var/run/docker.sock \
      docker ls /tmp/dind3"
Run Code Online (Sandbox Code Playgroud)

问题是,我需要做什么才能使用容器 1 路径而不是主机?还是我在这里误解了 docker?

Dav*_*aze 5

对于您所说的“Docker-in-Docker”和“dind”,这种设置实际上并不是 Docker-in-Docker:您的容器 1 正在向主机的 Docker 守护进程发出影响容器 2 的指令。

Host      Container1
    /-----
 (Docker)
    |     Container2
    \---->
Run Code Online (Sandbox Code Playgroud)

(NB:这通常用于CI型设置中的推荐路径“多克尔合泊坞”通常是指container1运行其自己的,独立的,多克尔守护进程,这趋向于不被推荐。)。

由于 container1 正在向主机的 Docker 发出指令,而主机的 Docker 正在启动 container2,因此任何docker run -v路径始终是主机的路径。除非您知道某个特定目录已经挂载到您的容器中,否则很难与“子容器”共享文件。

解决此问题的一种方法是断言存在某种共享路径:

Host      Container1
    /-----
 (Docker)
    |     Container2
    \---->
Run Code Online (Sandbox Code Playgroud)

当我过去这样做时(对于想要启动帮助容器的测试设置),我使用了一个艰苦的docker create, docker cp, docker start, docker cp,Docker rm序列。这是非常手动的,但它的优点是 a 的“本地”端docker cp始终是当前文件系统上下文,即使您是从容器内与主机的 Docker 守护程序对话。