Con 2 aplicaciones de matraz dentro de 2 contenedores separados, pensé que sería posible ejecutar una solicitud GET de uno y devolver información del segundo, pero obtengo [Errno 111] Connection refused . Con la siguiente configuración:
app1.py
@app.route('/get_message') def get_message(): message = requests.get('http://web2:5001/return_message') return message.text if __name__ == '__main__': app.run(host='0.0.0.0')app2.py
@app.route('/return_message') def return_message(): return 'the message' if __name__ == '__main__': app.run(host='0.0.0.0')docker-compose.yml
version: "3.7" services: web1: build: ./web1 container_name: web1 ports: - "5000:5000" web2: build: ./web2 container_name: web2 ports: - "5001:5001"El punto final para app1 funciona cuando se va a http://127.0.0.1:5000/get_message , pero el matraz devuelve:
requests.exceptions.ConnectionError: HTTPConnectionPool(host='web2', port=5001): Max retries exceeded with url: /return_message (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fb866642d30>: Failed to establish a new connection: [Errno 111] Connection refused',)) Intentar asignar una dirección IP estática al contenedor web2 y usar la IP en la solicitud de get no funciona, ni tampoco funciona el uso de networks , link o depends_on dentro del archivo docker-compose . También intenté exponer diferentes puertos en ambos contenedores en diferentes combinaciones, pero no obtuve el mensaje entre ellos.
Creo que cuando activa sus aplicaciones, ambas se ejecutan en el puerto 5000 pero en diferentes contenedores, así que intente cambiar su app1.py a:
@app.route('/get_message') def get_message(): message = requests.get('http://web2:5000/return_message') return message.text if __name__ == '__main__': app.run(host='0.0.0.0') Y también cambie los puertos en docker-compose para web2 :
version: "3.7" services: web1: build: ./web1 container_name: web1 ports: - "5000:5000" web2: build: ./web2 container_name: web2 ports: - "5001:5000" Sin embargo, no es necesario cambiar los puertos en docker-compose si no desea acceder a web2 desde el host; tenga en cuenta que aquí asigno el puerto 5001 de su host al puerto 5000 del contenedor web2 y ambos contenedores exponen la aplicación en el puerto 5000.
Recuerde que estos son contenedores separados, por lo que les gustan los entornos separados. Y también tenga en cuenta que EXPOSE es solo para documentar que expone algún servicio en este puerto; no hace que su aplicación en el contenedor se ejecute en este puerto.