docker - docker golang主进程与python子进程通信的最佳实践

标签 docker go flask docker-compose interprocess

我知道使用 docker 的最佳实践是每个容器中只有一个主进程,并且只有一个 CMD 行运行。

我的情况是我有一个 Golang 微服务,其功能是在 python 子进程中实现的。目前,主进程仅接受API调用,然后在exec中调用python子进程并读取STDOUTSTDERR

我想优化架构,例如仅在 docker 内的本地主机上运行 python 作为服务(Flask)。然后我的主Golang进程可以使用restful http调用与python进程进行通信。

但这将让 2 个服务在同一个 docker 中运行,并且它不是主进程和子进程。这实际上会很糟糕吗?有什么想法吗?

感谢所有帮助。

最佳答案

通常当您有多个服务时,最佳实践不是将它们部署在一个容器中,建议您将它们部署在多个容器中。

您可以使用docker-compose帮助您:

Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration.

对于您的场景,请为您提供一个最小的示例,如下所示。

文件夹结构:

.
├── docker-compose.yaml
├── flask
│   ├── app.py
│   └── Dockerfile
└── go
    ├── app.go
    └── Dockerfile

docker-compose.yaml:

version: '3'
services:
  flask_service:
    build: flask

  go_service:
    build: go
    ports:
    - "9500:9500"
    depends_on:
    - flask_service

go/app.go:

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
        url := "http://flask_service:9600"
        ret, err := http.Get(url)
        if err != nil {
                panic(err)
        }
        defer ret.Body.Close()

        body, err := ioutil.ReadAll(ret.Body)
        if err != nil {
                panic(err)
        }
        fmt.Fprintf(w, string(body))
}

func main() {
        http.HandleFunc("/", handler)
        http.ListenAndServe(":9500", nil)
}

go/Dockerfile:

FROM golang:latest as build

WORKDIR /go/app
COPY ./app.go .
RUN go mod init app; go mod tidy; go build

CMD ["/go/app/app"]

flask/app.py:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hey, we have Flask in a Docker container!'

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=9600)

flask /Dockerfile:

FROM python:alpine3.7

WORKDIR /app

RUN pip install flask

COPY . /app

ENTRYPOINT [ "python" ]
CMD [ "app.py" ]

执行:

$ docker-compose up
Creating network "20211203_default" with the default driver
Creating 20211203_flask_service_1 ... done
Creating 20211203_go_service_1    ... done
Attaching to 20211203_flask_service_1, 20211203_go_service_1

验证:

$ curl http://10.192.244.21:9500
Hey, we have Flask in a Docker container!

您可以看到我们访问 9500 端口,该端口会将请求路由到 golang 容器,然后 golang 容器 将调用 Flask服务容器与api,最终得到由flask生成的内容嘿,我们在Docker容器中拥有Flask!

关于docker - docker golang主进程与python子进程通信的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70104869/

相关文章:

Goquery 选择 meta[property=og :image]?

go - 如何使用 reflect 包访问函数的返回数据?

python - Flask MethodView 与 Flask-Restful 资源

java - Java使用的内存多于堆大小(或正确大小的Docker内存限制)

docker - 绑定(bind)到端口 80 的问题 : Could not bind to IPv4 or IPv6 with certbot

docker - 在 Alpine linux容器内构建docker镜像

sql - 执行查询 sql 时出错 - Golang

docker - 检查节点故障背后的原因

python - 使用 FastCGI 在 IIS 中部署 Python Web 应用程序 (Flask) 出现 500 内部服务器错误

javascript - 如何将带有嵌入式对象的对象从 JavaScript (jQuery/ajax) 传递到 Python (Flask)?