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

docker容器与其主机之间的进程间通信,docker,ipc,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 ... 其中,

我正在与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地址的更便携的解决方案。你有什么建议

议题/问题 如何从容器中执行Docker API调用

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

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

安全是必须的 如果此选项看起来不够干净或安全,则需要本地网络*服务。我建议使用
java
python
中的web API来响应两个不同的调用,可能是:

  • commit
    http[s]://localhost:service port/commit?containder\u id=123456789&image\u name=my\u name
  • rmi
    http[s]://localhost:service port/rmi?container_id=123456789
  • 我不明白您所指的用户中的内容

    如果创建了映像,则本地服务将回答
    http201 Created
    ,如果名称已经存在,则回答
    http406 Not Acceptable
    。它还可以检查是否在一个raw中执行了不超过一个
    rmi
    。如果不存在具有此ID的图像,
    HTTP403禁止
    是图像无法删除或
    HTTP200正常
    如果一切正常,它可以回答
    HTTP204非内容。最后,它可以回答
    http418“我是一个茶壶”



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

    您能否明确说明通信需要。您如何编写容器需要的协议规范或API?我只需要从容器内部执行两个简单的命令:docker commit和docker rmi,但限制是rmi只能删除以前用户提交的映像。本地网络似乎是合理的。我不知道网络上的-H和docker API,但我不能直接用于安全问题。我的评论中的user一词指的是gitlab,它是容器中应该提交和rmi映像的用户。