在传入的HTTP请求上启动Docker容器

时间:2018-10-17 06:38:48

标签: docker docker-compose traefik

我有一台服务器在单独的Docker容器中运行多个Web应用程序。我使用Traefik作为反向代理。因此,无论何时容器闲置15分钟,我都会从内部停止容器(结束运行过程,导致容器停止运行)。如何按需重新启动容器,即在收到停止容器的请求时?

按照要求,我没有使用任何集群管理器或类似的东西。基本上,我有一个使用docker-py库创建图像和容器的API服务器。每当创建容器以将URL路由到相应容器时,Traefik都会监听docker事件并生成配置。

我尝试了systemd套接字激活。这是套接字和服务文件。

app.socket

[Unit]
Description=App Socket

[Socket]
ListenStream=3000
Accept=yes

[Install]
WantedBy=sockets.target

app @ .service

[Unit]
Description=App Service
Requires=app.socket

[Service]
Type=simple
ExecStart=/usr/bin/npm start --prefix /path/to/dir
StandardInput=socket
StandardError=journal
TimeoutStopSec=5

[Install]
WantedBy=multi-user.target

这是我目前的做法。我的容器正在运行节点应用程序。因此,我结束了容器内的节点进程。在结束节点过程的同时,我将启用并启动 app.socket 。当端口3000上有传入流量时,我的应用将通过套接字激活来启动。

但是当我尝试访问该端口时什么也没有发生。我确认套接字激活正常。当我执行命令date | netcat 127.0.0.1 3000时,该应用似乎已启动,然后立即停止,没有任何错误。

也许套接字激活无法按我期望的那样工作。我看到启用 app.socket 后,具有PID init的进程1正在端口3000上运行。一旦流量通过端口3000进入,我想在容器内启动我的节点应用程序。但是,如果该端口上已经有进程在运行,那么该应用程序如何才能从3000开始?

也许 Traefik 可以采用某种方式,因为它是我正在使用的反向代理。有任何功能可以让我在404发生时执行命令或脚本吗?

1 个答案:

答案 0 :(得分:0)

如果您能告诉您如何管理docker容器(k8或swarm或其他任何东西),这将更有帮助。但是根据您的初始输入,我想您正在寻找Inetd或systemd套接字激活。这篇文章对您有帮助https://www.reddit.com/r/docker/comments/72sdyf/startrun_a_container_when_incoming_traffic/