我正在维护在 C 上开发的应用程序,由 Systemd 运行,它是微服务。每个服务都可以通过Linux共享内存(IPCS)进行通信,并使用HTTP与外部通信。我的问题是,将所有服务都移到一个 Docker 容器中是否好?我刚接触容器主题,有人推荐我学习和使用它。
注意:MS 是微服务
答案 0 :(得分:0)
通常建议您使用每个容器一个服务
来分隔关注区域当 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 是在服务器和/或设备之间通过互联网交换信息的最常见策略。
如果你做到了这一点,你的 c 程序将具有以下特点:
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: