【问题标题】:Control a container from another one从另一个容器控制一个容器
【发布时间】:2017-02-06 05:26:35
【问题描述】:

我找到了很多关于 docker 容器(docker network、docker link)之间通信的文章。但我不知道是否存在从另一个容器控制容器的好习惯,例如运行和停止容器。 如果唯一的方法是在主机上使用 rest api,你有没有很好的文章来解释这一点?关于其余的 api,我发现了太多解释这一点的文章,其中大多数已经过时了。

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

感谢您的帮助。

【问题讨论】:

  • 是的,从另一个容器控制容器是一种上帝的做法。让我们以portainer 为例。它是控制和管理另一个容器的应用程序(或容器)。您可以查看源代码以了解它是如何完成的。

标签: jenkins docker continuous-integration continuous-deployment


【解决方案1】:

我不知道是否存在控制容器的好习惯 另一个,例如运行和停止容器。

这是一种“足够好”的做法,很多人都这样做。 CoreOS 的/usr/bin/toolbox 基本上是这样的,其他一些像 RancherOS 也是这样做的。

如果唯一的方法是在主机上使用 rest api,你有没有一篇很好的文章解释了这一点?

不,不是。您可以将 docker 的套接字挂载到另一个 docker 容器中,然后直接从容器内部在主机上运行 docker 命令。这种做法被称为“docker in docker”、“dind”、“nested containers”等。这是一种变体,人们在现有容器中运行完整版本的 docker(docker 引擎/守护进程 + 客户端),但那是不是你想在这里做的。

它的要点通常是相同的,docker unix 套接字 - /var/run/docker.sock 被暴露/安装在“控制容器”中,即你想用来控制 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/

【讨论】:

  • 好的,感谢您的精彩解释。自学docker是一个POC。所以我会尊重安全性作为您的建议。感谢帮助。有了这个,我将直接使用 jenkins docker 插件而不是 Shell。
猜你喜欢
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
  • 2021-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-02
相关资源
最近更新 更多