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
.
安全是必须的
如果此选项似乎不够干净或安全,则需要本地网络*服务。我会建议在 java
或 python
中创建一个网络 API 来响应两个不同的调用:
- 提交:
http[s]://localhost:service-port/commit?containder_id=123456789&image_name=my_name
- rmi:
http[s]://localhost:service-port/rmi?containder_id=123456789
我不明白 你指的 user 是什么。
如果图像已创建,本地服务将回答 HTTP 201 Created
,如果名称已经存在,则回答 HTTP 406 Not Acceptable
。它还可以检查原始文件中是否执行了不超过一个 rmi
。如果不存在具有此 ID 的图像,它可以回答 HTTP 204 Not Content
,HTTP 403 Forbidden
是图像无法删除,或者 HTTP 200 OK
如果一切顺利。在不得已的情况下,它可以回答 HTTP 418 I'm a teapot
.
*:local-networking 是一种快速、最安全、易于部署并且在本地与 Docker 一起工作的方法。 FIFO,参见 man mkfifo
,也可以使用,但需要另一个共享卷(用于 FIFO 文件),并且可能需要更多代码。
我正在使用 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
.
安全是必须的
如果此选项似乎不够干净或安全,则需要本地网络*服务。我会建议在 java
或 python
中创建一个网络 API 来响应两个不同的调用:
- 提交:
http[s]://localhost:service-port/commit?containder_id=123456789&image_name=my_name
- rmi:
http[s]://localhost:service-port/rmi?containder_id=123456789
我不明白
如果图像已创建,本地服务将回答 HTTP 201 Created
,如果名称已经存在,则回答 HTTP 406 Not Acceptable
。它还可以检查原始文件中是否执行了不超过一个 rmi
。如果不存在具有此 ID 的图像,它可以回答 HTTP 204 Not Content
,HTTP 403 Forbidden
是图像无法删除,或者 HTTP 200 OK
如果一切顺利。在不得已的情况下,它可以回答 HTTP 418 I'm a teapot
.
*:local-networking 是一种快速、最安全、易于部署并且在本地与 Docker 一起工作的方法。 FIFO,参见 man mkfifo
,也可以使用,但需要另一个共享卷(用于 FIFO 文件),并且可能需要更多代码。