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.
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
yartemis
, en la misma red:En el archivo de Compose anterior, definimos dos servicios,
python
yartemis
, y los agregamos a la misma redmy-network
. El serviciopython
utiliza la imagen de Dockermyimage
y mapea el puerto del contenedor5000
al puerto del host5000
. El servicioartemis
utiliza la imagen de Dockervromero/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 puerto61613
.Actualiza el código de conexión en tu script de Python para utilizar
artemis
como hostname de la siguiente manera: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:
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.