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

Inter-process communication between docker container and its host

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

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

docker commit $CONTAINER_ID $NEW_IMAGE_NAME

但是从容器内部。稍后从另一个容器:

docker rmi $NEW_IMAGE_NAME

一个解决方案可能是设置 ssh public 密钥身份验证和:

ssh user@172.17.0.1 docker ...

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

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

Issue/Question

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

你知道吗

您是否知道 Docker API 可以通过添加选项 -H tcp://0.0.0.0:2375 在网络套接字上提供服务?因此,您可以从容器内直接调用 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

我不明白 你指的 user 是什么。

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


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