从另一个容器控制一个容器

Control a container from another one

我找到了很多关于 docker 容器(docker 网络,docker link)之间通信的文章。但我不知道是否存在从另一个容器控制容器的良好做法,例如 运行 并停止容器。 如果唯一的方法是在主机上使用其余 api,您是否有一篇很好的文章解释了这一点?关于其余部分 api 我发现了太多解释这一点的文章,其中大部分已过时。

为了准确说明我的意图,我有一个 jenkins 容器,它构建并将构建移动到另一个文件夹中,用于执行构建代码的第二个容器。基本上,在移动之前我想停止容器并在重新启动它之后。

感谢您的帮助。

i don't Know if it exists a good practice to control a container from another one, like run and stop a container.

这是一种 "good enough" 做法,很多人都这样做。 CoreOS 的 /usr/bin/toolbox 基本上就是这样,其他一些像 RancherOS 也是这样做的。

If the only way is to use the rest api on the host have you got a good article which explains that ?

不,不是。您可以将 docker 的套接字安装到另一个 docker 容器中,然后直接从容器内部在主机上执行 运行 docker 命令。这种做法称为 "docker in docker"、"dind"、"nested containers" 等。这种做法有一种变体,人们 运行 完全成熟的 docker 版本(docker engine/daemon + client) 在现有容器中,但这不是您想要在此处执行的操作。

它的要点通常是相同的,docker unix socket - /var/run/docker.sock 是 exposed/mounted 在 "controlling container" 中,即你想用来控制的容器docker 守护进程。然后安装 docker 命令行客户端并正常使用 docker 命令; docker psdocker start/stop/run 应该都按预期工作。

设置它并不简单 [1],并且存在相关的安全问题 [2][3],但是有很多人在做。

这是您的参考资料:

[1] https://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/ ,请参阅 Solution 下的部分,在此之前的所有内容都是您应该 做的。

[2] https://www.lvh.io/posts/dont-expose-the-docker-socket-not-even-to-a-container.html

[3] https://raesene.github.io/blog/2016/03/06/The-Dangers-Of-Docker.sock/