如何从 docker 群中的另一个服务调用一个服务

How to call a service from another service in docker swarm

我在 docker swarm 中使用图像 app1app2 创建了 2 个服务,其中服务 app1 调用 app2 但在 docker swarm 服务 app1 可以't connect to service app2 at app2:5000 (<service-name>:<port>) 收到错误 requests.exceptions.ConnectionError,相反如果我创建普通容器(没有 docker swarm)然后 app1 可以轻松调用 app2在 app2:5000 (<container-name>:<port>)

内部 docker swarm 下面的命令已用于创建服务

$ sudo docker service create --name app1 -p 5001:5000 app1:latest
$ sudo docker service create --name app2 -p 5002:5000 app2:latest 

外部 docker swarm 以下命令用于 运行 容器

$ sudo docker-compose build
$ sudo docker-compose up

用于构建图像 app1 和 app2 的代码如下所示

app.py (App1)

from flask import Flask, request, jsonify
import requests

app = Flask(__name__)

@app.route('/')
def func1():
    return jsonify('This is App #1')

@app.route('/call')
def func2():
    res = requests.get('http://app2:5000/call')
    res = res.json()
    return jsonify(res)

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

app.py (App2)

from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/')
def func1():
    return jsonify('This is App #2')

@app.route('/call')
def func2():
    return jsonify('Call to App2 is Successful')

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

docker-compose.yml

version: '3.3'

services:
  
  app1:
    build: ./app1         
    image: "app1:latest"   
    container_name: app1
    ports:
      - "5001:5000"
    networks:
      - net1
  
  app2:
    build: ./app2
    image: "app2:latest"
    container_name: app2
    ports:
      - "5002:5000"
    networks:
      - net1

networks:
  net1:
    external: true

将服务放在同一个网络中解决了这个问题