container - rabbitmq hostname
Conectar de un contenedor Docker a otro (6)
Quiero ejecutar rabbitmq-server en un contenedor docker y conectarme desde otro contenedor utilizando apio ( http://celeryproject.org/ )
He ejecutado rabbitmq usando el siguiente comando ...
sudo docker run -d -p :5672 markellul/rabbitmq /usr/sbin/rabbitmq-server
y ejecutando el apio via
sudo docker run -i -t markellul/celery /bin/bash
Cuando intento realizar un tutorial muy básico para validar la conexión en http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html
Estoy obteniendo un error de conexión rechazada:
consumidor: no se puede conectar a amqp: //[email protected]: 5672 //: [Errno 111] Se rechazó la conexión.
Cuando instalo rabbitmq en el mismo recipiente que el apio, funciona bien.
¿Qué necesito hacer para que el contenedor interactúe entre sí?
[editar 2016]
Los enlaces directos están en desuso ahora. La nueva forma de enlazar contenedores es conectar la red docker . Funciona bastante similar a las redes virtuales y tiene un conjunto de características más amplio que la antigua forma de vinculación.
Primero creas tus contenedores con nombre:
docker run --name rabbitmq -d -p :5672 markellul/rabbitmq /usr/sbin/rabbitmq-server
docker run --name celery -it markellul/celery /bin/bash
Luego creas una red (el último parámetro es tu nombre de red):
docker network create -d bridge --subnet 172.25.0.0/16 mynetwork
Conecte los contenedores a su red recién creada:
docker network connect mynetwork rabbitmq
docker network connect mynetwork celery
Ahora, ambos contenedores están en la misma red y pueden comunicarse entre sí.
Se puede encontrar una guía del usuario muy detallada en Trabajar con redes: conectar contenedores .
[respuesta antigua]
Hay una nueva característica en Docker 0.6.5 llamada vinculación , que está destinada a ayudar a la comunicación entre los contenedores de la ventana acoplable.
Primero, crea tu contenedor de rabbitmq como de costumbre. Tenga en cuenta que también usé la nueva función "nombre" que hace la vida un poco más fácil:
docker run --name rabbitmq -d -p :5672 markellul/rabbitmq /usr/sbin/rabbitmq-server
Puede usar el parámetro de enlace para asignar un contenedor (nosotros usamos el nombre aquí, la identificación también estaría bien):
docker run --link rabbitmq:amq -i -t markellul/celery /bin/bash
Ahora tiene acceso a la IP y al Puerto del contenedor rabbitmq porque la ventana acoplable agregó automáticamente algunas variables de entorno:
$AMQ_PORT_5672_TCP_ADDR
$AMQ_PORT_5672_TCP_PORT
Además, Docker agrega una entrada de host para el contenedor de origen al /etc/hosts
. En este ejemplo, amq
será un host definido en el contenedor.
De la documentation Docker:
A diferencia de las entradas de host en el archivo / etc / hosts, las direcciones IP almacenadas en las variables de entorno no se actualizan automáticamente si se reinicia el contenedor de origen. Recomendamos utilizar las entradas de host en / etc / hosts para resolver la dirección IP de los contenedores vinculados.
Creo que no puede conectarse a otro contenedor directamente por diseño, eso sería responsabilidad del anfitrión. Aquí se ofrece un ejemplo de intercambio de datos entre contenedores que usan Volumes http://docs.docker.io/en/latest/examples/couchdb_data_volumes/ , pero no creo que eso sea lo que está buscando.
Recientemente me enteré de https://github.com/toscanini/maestro - que podría satisfacer sus necesidades. Háganos saber si lo hace :), todavía no lo he probado.
Editar. Tenga en cuenta que puede leer here que el "Descubrimiento de cableado y servicio del contenedor" nativo está en la hoja de ruta. Supongo que 7.0 o 8.0 a más tardar.
Cuando especifica -p 5672, lo que hace la ventana acoplable es abrir un nuevo puerto, como 49xxx en el host y lo reenvía al puerto 5672 del contenedor.
debería poder ver qué puerto se reenvía al contenedor ejecutando:
sudo docker ps -a
Desde allí, puede conectarse directamente a la dirección IP del host de la siguiente manera:
amqp://guest@HOST_IP:49xxx
No puede utilizar localhost, porque cada contenedor es básicamente su propio host local.
Esto está actualmente en la hoja de ruta 0.8:
Puede obtener la instancia de la ventana acoplable IP con ...
CID=$(sudo docker run -d -p :5672 markellul/rabbitmq /usr/sbin/rabbitmq-server); sudo docker inspect $CID | grep IPAddress
Pero eso no es muy útil.
Puede utilizar pipework para crear una red privada entre contenedores de ventana acoplable.
Solo obtén tu ip de contenedor y conéctate desde otro contenedor:
CONTAINER_IP=$(sudo docker inspect --format ''{{ .NetworkSettings.IPAddress }}'' $CONTAINER_ID)
echo $CONTAINER_IP