es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No se pudo establecer conexión entre el contenedor de Python y el contenedor de ActiveMQ Artemis.

Mi objetivo final es hacer que varios contenedores de Python que ejecutan diferentes procesos se comuniquen entre sí a través de un contenedor de ActiveMQ Artemis. Soy nuevo en todo esto, así que como punto de partida, solo estoy tratando de obtener una prueba de concepto en funcionamiento.

Seguí las instrucciones de este video de YouTube para construir mi imagen de Artemis y todo encaja perfectamente allí. También seguí este tutorial para comenzar a enviar mensajes a través de STOMP a Artemis. Cuando ejecuto este script localmente (desde PyCharm) mientras mi contenedor de Artemis está en funcionamiento, puedo ver en la consola web que hay una nueva cola generada desde el script de Python. Sin embargo, cuando contenerizo el mismo script de Python, obtengo un error.

No se pudo conectar al host localhost, puerto 61613
No se pudo conectar al host localhost, puerto 61613
No se pudo conectar al host localhost, puerto 61613
Traceback (most recent call last):
  File "/code/./main.py", line 5, in 
    import sendAMessage
  File "/code/sendAMessage.py", line 30, in 
    conn.connect('admin', 'admin', wait=True)
  File "/usr/local/lib/python3.9/site-packages/stomp/connect.py", line 164, in connect
    self.transport.start()
  File "/usr/local/lib/python3.9/site-packages/stomp/transport.py", line 109, in start
    self.attempt_connection()
  File "/usr/local/lib/python3.9/site-packages/stomp/transport.py", line 819, in attempt_connection
    raise exception.ConnectFailedException()

Intenté configurar una red en Docker y colocar ambos contenedores en ella.
Estoy ejecutando mi contenedor de Python usando

docker run --rm --net my-network -p 5000:5000 myimage

Tengo la sensación de que estoy exponiendo incorrectamente un puerto, o algo así, pero no estoy lo suficientemente familiarizado con los contenedores como para saber por dónde empezar a buscar.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución

    El problema parece estar en la configuración del hostname y puerto en el script de Python. Cuando ejecutas el script de Python localmente, el hostname se establece en localhost, lo cual funciona correctamente ya que el script y el contenedor de Artemis se están ejecutando en la misma máquina. Sin embargo, cuando contenerizas el script de Python, se ejecuta en un namespace de red diferente y, por lo tanto, localhost hace referencia al propio contenedor y no al equipo host donde se está ejecutando el contenedor de Artemis.

    Para solucionar este problema, debes actualizar la configuración del hostname en el script de Python para que haga referencia al hostname o dirección IP del contenedor de Artemis. Una forma de lograr esto es utilizando un archivo Docker Compose para levantar tanto los contenedores de Python como de Artemis en la misma red y utilizar el nombre del contenedor como hostname.

    Aquí tienes un ejemplo de archivo Docker Compose que levanta dos contenedores, python y artemis, en la misma red:

    version: '3'
    
    services:
      python:
        image: myimage
        ports:
          - "5000:5000"
        networks:
          - my-network
        depends_on:
          - artemis
    
      artemis:
        image: vromero/activemq-artemis
        ports:
          - "8161:8161"
          - "61616:61616"
          - "5672:5672"
        networks:
          - my-network
    
    networks:
      my-network:
    

    En el archivo de Compose anterior, definimos dos servicios, python y artemis, y los agregamos a la misma red my-network. El servicio python utiliza la imagen de Docker myimage y mapea el puerto del contenedor 5000 al puerto del host 5000. El servicio artemis utiliza la imagen de Docker vromero/activemq-artemis y expone los puertos requeridos para que Artemis funcione.

    Con este archivo de Compose y esta configuración de red, deberías poder acceder al contenedor de Artemis desde el script de Python utilizando el hostname artemis y el puerto 61613.

    Actualiza el código de conexión en tu script de Python para utilizar artemis como hostname de la siguiente manera:

    import stomp
    
    conn = stomp.Connection([('artemis', 61613)])
    conn.start()
    conn.connect('admin', 'admin', wait=True)
    

    Reemplaza myimage con el nombre de tu imagen de Docker y actualiza el número de puerto y las credenciales según sea necesario.

    Ahora, ejecuta ambos contenedores utilizando el siguiente comando:

    docker-compose up
    

    Esto debería levantar ambos contenedores en la misma red y deberías poder conectarte correctamente al contenedor de Artemis desde tu script de Python.

Comments are closed.