【问题标题】:sharing data over docker compose between two python servers在两个 python 服务器之间通过 docker compose 共享数据
【发布时间】:2019-06-12 11:24:27
【问题描述】:

通过 docker-compose 在两个 python 网络服务器(收集器和计算器)之间共享双精度缓冲区

我试图简单地将缓冲区或整数数组从称为收集器的 python 服务器发送到另一个称为计算器的服务器。计算器服务器应该执行简单的数学算法。这都是一场试炼。收集器和计算器 python 脚本在 docker-compose 中运行在两个容器中,旨在连接到同一个网络。

收集器 python 脚本


app=Flask(__name__)

@app.route('/')
def index():
    d={"my_number": list(range(10))}
    return jsonify(d)

计算器python脚本

import requests

r=requests.get('https://collector:5000')

app = Flask(__name__)
@app.route('/')
def index():
    numbers_array = r.json()["my_numbers"]
    x=numbers_array[1] + numbers_array[2]
    return '{}'.format(x)

docker-compose.yml


services:
  collector:
    build: .
    env_file:
      - collector.env
    ports:
      - '5000:5000'
    volumes:
      - '.:/app'
    networks:
      - my_network



  calculator:
    build: ./calculator
    depends_on:
      - collector
    env_file:
      - calculator.env
    ports:
      - '5001:5000'
    volumes:
      - './calculator:/app'
    networks:
      - my_network

networks:
  my_network:
    driver: bridge

两个镜像的 Dockerfile 相同

FROM python:2.7-slim

RUN mkdir /app
WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

COPY . .

LABEL maintainer="Mahmoud KD"

VOLUME ["/app/public"]

CMD flask run --host=0.0.0.0 --port=5000

当我运行 docker-compose up --build 时,第一台服务器、收集器可以在我的计算机主机上实现并且工作正常。第二个服务器,calculator,无法通过 request.get 连接到收集器。我试图在 docker-compose 运行两个容器时从计算器容器 ping 收集器并且 ping 不起作用,它显示“在 PATH 中找不到可执行文件:未知”。似乎没有建立两个容器的连接,尽管在检查 my_network 时它显示了两个容器。任何人都可以告诉我我做错了什么。非常感谢...

【问题讨论】:

    标签: python docker docker-compose webserver dockerfile


    【解决方案1】:

    改用expose

    端口5000上的一个应用程序 其他在端口5001

    docker-compose:

    app1:

    expose:
      - 5000
    

    app2:

    expose:
      - 5001  
    

    确保您使用 ip=0.0.0.0 运行应用程序

    如果您想从主机访问应用程序 2,请转发端口

    应用程序2:

    expose:
      - 5001
    ports:
      - 80:5001
    

    说明:

    Expose 仅​​显示 docker 世界中的端口。因此,如果您公开容器的 A 端口 8888,则所有其他容器将能够在该端口访问该容器。但是您永远无法从主机访问它。

    标准程序是您只转发一个端口,即80,出于安全原因,其余流量无法从外部访问


    同时更改 dockerfile。你不想要硬编码的端口


    编辑:

    也摆脱这个

    volumes:
      - '.:/app'
    

    实际上可能会造成额外的麻烦


    工作示例: - 可以,但提供的应用程序包含错误

    docker-compose.yml

    version: '3.5'
    
    services:
      collector:
        container_name: collector
        build:
          context: collector/.
        ports:
          - '80:5555'
        expose:
          - '5555'
    
    
      calculator:
        container_name: calculator
        build:
          context: calculator/.
        depends_on:
          - collector
        expose:
          - 6666
        ports:
          - '81:6666'
        volumes:
          - './calculator:/app'
    

    您可以访问端口 80 和 81 上的两个端点。两个端点之间的通信对我们来说是隐藏的,并且它在 5555 和 6666 上。如果您关闭 81(或 80),则只能作为“代理”访问另一个端点

    【讨论】:

    • 谢谢马丁。是的,发送请求时有一个愚蠢的小拼写错误。我使用的是 r.json()["my_number"],而不是 my_numbers。你是对的,现在不需要volumes: - '.:/app'。该应用程序正在运行
    • 一件事是当你提到从我的 dockerfile 中删除 --port 时,应用程序没有。我无法解释,但我想在 dockerfile 中包含硬代码很重要
    • 您需要一个命令来运行应用程序。但是,不要在 Dockerfile 中运行烧瓶,您必须指定端口,而是在 dockerfile 命令中执行:运行 python app.py... 并在 app.py 中运行 app.run(enviromental_variable_host,env_ip)。在 docker-compose 中有 env_file: .env 并且有端口和 ips。查看 python lib -> dotenv。或者更简单但不是最佳实践,将命令从 Dockerfile 移动到 Docker-compose 中,这样您就可以在不构建映像的情况下更改端口......是的,在命令下的 docker-compose 中使用它是更简单灵活
    • 在此处查看如何将命令从 dockerfile 移动到 dockercompose:在命令下(有两个“命令”,#Reference 下需要一个)-> devhints.io/docker-compose
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多