使用systemd套接字激活启动Docker容器?

17
一个个体的Docker容器,例如Web服务器,暴露(监听)端口后是否可以使用systemd的socket activation功能启动?其想法是仅在首次实际需要时启动容器以节省资源(可能会再次在闲置时停止以节省资源)。
注意:这个问题不是关于使用socket activation启动Docker守护进程本身(这已经被支持了),而是关于按需启动单个容器的问题。

我认为这是可能的,但很难找到相关资料。我准备写一篇博客文章,但仍然无法弄清如何将套接字从主机传递到启动的Docker。也许只需将其挂载为卷。这里有一些阅读材料:http://0pointer.de/blog/projects/socket-activated-containers.html http://libvirt.org/drvlxc.html#activation - Pierre Ozoux
需要使用systemd的套接字激活功能吗?使用Docker API随时启动和停止容器呢? - rexposadas
你找到了关闭未使用进程的解决方案吗? - Arka
Arka:我还没有花时间去做那个,因为甚至套接字激活也还没有完成。但是我猜服务器可以尝试跟踪活动,并在它足够长时间处于空闲状态时触发关闭。 - Markus Miller
1
这不是你想要的吗? - Arka
Arka:感谢提供的链接,它展示了如何使用systemd-socket-proxyd来解决Docker显然不直接支持它的问题。理想情况下,Docker应该直接支持它,以避免像systemd-socket-proxyd这样的解决方法的需要,但也许现在这就是我们能得到的最接近的解决方案了。 - Markus Miller
3个回答

13
简而言之,你做不到。
但是,如果你想解决这个问题,首先需要运行类似CoreOSgeard的工具,以在systemd服务中运行每个Docker容器。
即使如此,Docker对于继承套接字的支持已经来去匆匆。我知道geard正在稳定支持方面努力。CoreOS已经发布了关于Go中套接字激活的通用支持。Red Hat公司的人员还在Fedora的Docker包中添加了相关补丁,使用Go的套接字激活库并改进“前台模式”,这是使其正常工作的关键组件。

我是来自Lennart 早期关于容器套接字激活的文章 的David Strauss,这个主题非常吸引我。我已经给Red Hat的补丁作者发了电子邮件并联系了geard团队。我会尽力更新这个答案。


我实际上是在观看视频之后才阅读了这篇文章 :) 我正在运行CoreOS。但即使Docker在systemd中,我从未见过一个带有socket激活的Docker。感谢您的回答,提供了许多关于所有讨论的链接 :) 我需要进行一些测试,但我相信这是可行的。我会在这里及时向您通报 :) - Pierre Ozoux
关键在于能够在容器中指定一个套接字监听器,该监听器从systemd继承而来。我还没有看到一个稳定的实现。 - David Timothy Strauss
马上就来了 :) https://github.com/coreos/rocket/issues/106 尽管不使用Docker :) - Pierre Ozoux
@ PierreOzoux Rocket的开发者(即CoreOS团队)长期以来一直是systemd社区中出色的成员,也是该项目的主要贡献者。 - David Timothy Strauss
也许你可以提到 Podman(版本>=3.4.0)支持容器的套接字激活? - Erik Sjölund

2
如果必须使用systemd,可以参考上个月的博客文章,这里有相关内容(我自己还没有尝试过)。
如果技术选择不是一个硬性限制,您可以使用自己喜欢的编程语言编写一个小代理,并简单地进行Docker API调用以确保容器已启动。这就是snickers(我的实验性nodejs代理)的方式。

2

是的,您可以使用Podman实现此功能。 自2021年9月发布的版本3.4.0起,Podman支持套接字激活。

(Docker尚不支持容器的套接字激活,因此您需要使用Podman)

示例1:mariadb

我编写了一个小示例演示如何使用systemdpodmanMariaDB容器设置套接字激活

https://github.com/eriksjolund/mariadb-podman-socket-activation

MariaDB10.6版本(于2021年4月发布)开始支持套接字激活。

示例2:nginx

https://github.com/eriksjolund/podman-nginx-socket-activation

另请参见我的回答https://dev59.com/xVoV5IYBdhLWcg3wVdg_#71188085


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接