如何将 Systemd 微服务部署到 Docker 镜像

时间:2021-07-30 04:08:15

标签: docker docker-compose

我正在维护在 C 上开发的应用程序,由 Systemd 运行,它是微服务。每个服务都可以通过Linux共享内存(IPCS)进行通信,并使用HTTP与外部通信。我的问题是,将所有服务都移到一个 Docker 容器中是否好?我刚接触容器主题,有人推荐我学习和使用它。

我的应用程序的简单设计如下: Simple my application design

注意:MS 是微服务

1 个答案:

答案 0 :(得分:0)

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 是在服务器和/或设备之间通过互联网交换信息的最常见策略。

如果你做到了这一点,你的 c 程序将具有以下特点:

  • 启动另一个必需的进程(ms1、ms2、ms3 等)
  • 公开rest 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: