Docker official web says :
通常建议您使用每个容器一个服务
来区分关注区域
当 docker 启动时,它需要链接到一个实时和 前台 进程。如果此过程结束,则整个容器结束。此外,docker 中与日志相关的默认行为是“捕获”单个进程的标准输出。
几个过程
如果您有多个进程,没有一个是“主”,我认为可以将它们作为 后台进程 启动,但您需要在 bash 中花费大量时间来模拟前台进程.在这个循环中,您可以检查您的服务是否仍在运行,因为当其内部进程退出或出现错误时,它对活动容器没有任何意义。
while sleep 60; do
ps aux |grep my_first_process |grep -q -v grep
PROCESS_1_STATUS=$?
ps aux |grep my_second_process |grep -q -v grep
PROCESS_2_STATUS=$?
# If the greps above find anything, they exit with 0 status
# If they are not both 0, then something is wrong
if [ $PROCESS_1_STATUS -ne 0 -o $PROCESS_2_STATUS -ne 0 ]; then
echo "One of the processes has already exited."
exit 1
fi
done
一个进程
就像 apache 和其他工具一样,您可以创建一个实时进程,然后从内部启动另一个子进程。这称为生成过程。同样正如您提到的 http,此过程可能会暴露 http 端点以与外部交换信息。
我不是 C 专家,但系统方法可能是启动另一个进程的选项:
#include <stdlib.h>
int main()
{
system("commands to launch service1");
system("commands to launch service2");
return 0;
}
这里有一些链接:
还要在 c 中创建一个基本的 http 服务器,你可以检查一下:
restinio::run(
restinio::on_this_thread()
.port(8080)
.address("localhost")
.request_handler([](auto req) {
return req->create_response().set_body("Hello, World!").done();
}));
这个 c 程序在启动时会保持活动状态,因为它是一个服务器。所以这对于 docker 来说是完美的。
Rest Api 是通过 Internet 在服务器和/或设备之间交换信息的最常用策略。
如果你实现了这一点,你的 c 程序将具有以下特性:
- 启动另一个必需的进程(ms1、ms2、ms3 等)
- 公开其他 http 端点以在您的服务和世界之间发送和接收一些信息。示例
method: get
url: https://alexsan.com/domotic-services/ms1/message/1
description: rest endpoint which returns the message 1 from service ms1 queue
returns:
{
"command": "close gateway=5"
}
method: post
url: https://alexsan.com/domotic-services/ms2/message
description: rest endpoint which receives a message containing a command to be executed on service ms2
receive:
{
"id": 100,
"command" : "open gateway=2"
}
returns:
{
"command": "close gateway=5"
}
可以从网络、手机等调用这些 http 端点
使用高级语言
您可以使用 python、nodejs 或 java 来启动服务器并从其内部启动您的服务,如果您想公开一些 http 端点。这里有一个 python 的基本示例:
FROM python:3
WORKDIR /usr/src/app
# create requirements
RUN echo "bottle==0.12.17" > requirements.txt
# app.py is creating with echo just for demo purposes
# in real scenario, app.py should be another file
RUN echo "from bottle import route, run" >> app.py
RUN echo "import os" >> app.py
RUN echo "os.spawnl(os.P_DETACH, '/opt/services/ms1.acme')" >> app.py
RUN echo "os.spawnl(os.P_DETACH, '/opt/services/ms2.acme')" >> app.py
RUN echo "os.spawnl(os.P_DETACH, '/opt/services/ms3.acme')" >> app.py
RUN echo "os.spawnl(os.P_DETACH, '/opt/services/ms4.acme')" >> app.py
RUN echo "@route('/domotic-services/ms2/message')" >> app.py
RUN echo "def index():" >> app.py
RUN echo " return 'I will query the message'" >> app.py
RUN echo "run(host='0.0.0.0', port=80)" >> app.py
RUN pip install --no-cache-dir -r requirements.txt
CMD [ "python", "./app.py" ]
你也可以使用nodejs: