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

Posted

技术标签:

【中文标题】docker 容器与其宿主机之间的进程间通信【英文标题】:Inter-process communication between docker container and its host 【发布时间】:2016-05-03 08:08:57 【问题描述】:

我正在使用 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 用户只能访问特定的命令。

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

【问题讨论】:

您能否明确沟通需求。请问如何编写容器需要的协议规范或 API? 我只需要从容器内部执行两个简单的命令:docker commit 和 docker rmi,但限制是 rmi 只能删除前一个用户提交的图像。 【参考方案1】:

问题/问题

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

你知道吗

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

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

安全是必须的

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

    提交http[s]://localhost:service-port/commit?containder_id=123456789&image_name=my_name rmihttp[s]://localhost:service-port/rmi?containder_id=123456789

我不明白 your comment 你指的是什么用户

如果图像已创建,本地服务将回复 HTTP 201 Created,如果名称已存在,则回复 HTTP 406 Not Acceptable。它还可以检查是否在一个 raw 中执行的 rmi 不超过一个。如果不存在具有此 ID 的图像,它可以回答 HTTP 204 Not ContentHTTP 403 Forbidden 是无法删除图像,或者如果一切顺利,它可以回答 HTTP 200 OK。在不得已的情况下,它可以回复HTTP 418 I'm a teapot


*:本地网络是一种快速、安全、易于部署且可与 Docker 一起使用的本地网络。 FIFO,参见man mkfifo,也可以使用,但需要另一个共享卷(用于 FIFO 文件),并且可能需要更多代码。

【讨论】:

本地网络似乎是合理的。我不知道网络上的 -H 和 docker API,但我不能直接使用它来解决安全问题。我评论中的用户一词指的是 gitlab,它是容器内应该提交和 rmi 图像的用户。

以上是关于docker 容器与其宿主机之间的进程间通信的主要内容,如果未能解决你的问题,请参考以下文章

Docker Nework

Docker Nework

socket

Unix进程小结进程间通信方式总结

Docker

进程间通信