Esta duda se puede solucionar de diferentes formas, sin embargo te mostramos la que en nuestra opinión es la resolución más completa.
Solución:
[edit 2016]
Los enlaces directos están obsoletos ahora. La nueva forma de vincular contenedores es la conexión de red docker. Funciona de manera bastante similar a las redes virtuales y tiene un conjunto de funciones 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 crea una red (el último parámetro es el nombre de su 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í.
Puede encontrar una guía de usuario muy detallada en Trabajar con redes: Conectar contenedores.
[old answer]
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 Docker.
Primero, cree su contenedor rabbitmq como de costumbre. Tenga en cuenta que también utilicé la nueva función de “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 mapear un contenedor (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 el puerto del contenedor rabbitmq porque la ventana acoplable agregó automáticamente algunas variables ambientales:
$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
expediente. En este ejemplo amq
será un host definido en el contenedor.
De la documentación de 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 usar las entradas de host en /etc/hosts para resolver la dirección IP de los contenedores vinculados.
Simplemente obtenga la IP de su contenedor y conéctese desde otro contenedor:
CONTAINER_IP=$(sudo docker inspect --format ' .NetworkSettings.IPAddress ' $CONTAINER_ID)
echo $CONTAINER_IP
Cuando especifica -p 5672, lo que hace Docker 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 está reenviando al contenedor ejecutando:
sudo docker ps -a
Desde allí, puede conectarse directamente a la dirección IP del host de la siguiente manera:
amqp://[email protected]_IP:49xxx
No puede usar localhost, porque cada contenedor es básicamente su propio localhost.