docker容器与其主机之间的进程间通信

时间:2016-05-03 08:08:58

标签: docker ipc

我正在使用gtilab和docker建立一个持续集成系统。出于某种原因,我必须在CI系统的一个阶段中将当前容器作为新的docker镜像提交,因此我可以在后续阶段重用该图像。

总结一下,我必须执行这个命令:

docker commit $CONTAINER_ID $NEW_IMAGE_NAME

但是从容器里面。后来又来自另一个容器:

docker rmi $NEW_IMAGE_NAME

一种解决方案可能是设置ssh公钥认证,并且:

ssh user@172.17.0.1 docker ...

其中,172.17.0.1是主机IP地址。我可以限制ssh用户只访问特定的安全命令。

另一种解决方案是在主机中的网络套接字上创建公共服务。但这里最好的方法是什么?我更喜欢安全的解决方案,因此从容器内部您只能提交泊坞窗图像并删除创建的图像(而不是其他图像)。所以,一个狂野的ssh并不那么安全。而且,我更喜欢更便携的解决方案,它不会在主机IP地址上进行中继。你有什么建议?

1 个答案:

答案 0 :(得分:2)

问题/问题

如何从容器中执行一些Docker API调用?

你知道吗

您是否知道可以通过添加选项-H tcp://0.0.0.0:2375在网络套接字上提供Docker API?因此,您可以从容器内直接执行对Docker守护程序的调用。

请注意,您可以(也应该)为此套接字启用TLS,参见man docker daemon

安全是必须的

如果此选项看起来不够干净或不够安全,则需要本地网络*服务。我建议在javapython中使用一个可以响应两种不同呼叫的网络API:

  1. 提交http[s]://localhost:service-port/commit?containder_id=123456789&image_name=my_name
  2. rmi http[s]://localhost:service-port/rmi?containder_id=123456789
  3. 我在your comment您不了解您所指的用户

    如果图像已创建,本地服务将回答HTTP 201 Created,如果名称已存在,则回复HTTP 406 Not Acceptable。它还可以检查raw中是否执行了不超过一个rmi。如果没有包含此ID的图片,则HTTP 204 Not Content可以回答HTTP 403 Forbidden,如果一切顺利,则HTTP 200 OK无法删除图片或HTTP 418 I'm a teapot。在最后的手段,它可以回答man mkfifo

    *:本地网络是一种快速,大部分安全,易于部署并可与Docker本机配合使用。也可以使用FIFO,参见$dropbox = $this->get('acme.dropbox.api'); $dropbox->getAccountInfo(); ,但需要另一个共享卷(对于FIFO文件),也许还需要更多代码。