【问题标题】:How to Deploy Systemd Microservices to Docker Image如何将 Systemd 微服务部署到 Docker 映像
【发布时间】:2021-07-30 04:08:15
【问题描述】:

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

我的应用程序的简单设计如下:

注意:MS 是微服务

【问题讨论】:

  • #1 使用 IPC 在您的微服务之间发送消息就像一个套接字? #2 在你的服务(ms1、ms2、ms3、ms4)之间交换什么样的消息?
  • #1。通过 IPC 发送消息就像通过共享内存的队列,不同的是像套接字。 #2。交换的消息是存储在内存中的 C 结构。

标签: docker docker-compose


【解决方案1】:

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:

【讨论】:

  • 我的结论是我的应用程序不适合容器,现在不需要容器。感谢 Docker 的解释。
  • Docker 将帮助您以一种简单且不可知的方式分发您的解决方案。如果您愿意,我将帮助您使用 c++ 构建并从 python 或 nodejs 开始的 Dockerfile。
猜你喜欢
  • 2021-12-06
  • 2022-06-27
  • 1970-01-01
  • 2014-12-16
  • 1970-01-01
  • 2016-04-22
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
相关资源
最近更新 更多