Connect from one Docker container to another

左心房为你撑大大i 提交于 2019-11-28 17:05:20

[edit 2016]

Direct links are deprecated now. The new way to do link containers is docker network connect. It works quite similar to virtual networks and has a wider feature set than the old way of linking.

First you create your named containers:

docker run --name rabbitmq -d -p :5672 markellul/rabbitmq /usr/sbin/rabbitmq-server
docker run --name celery -it markellul/celery /bin/bash

Then you create a network (last parameter is your network name):

docker network create -d bridge --subnet 172.25.0.0/16 mynetwork

Connect the containers to your newly created network:

docker network connect mynetwork rabbitmq
docker network connect mynetwork celery

Now, both containers are in the same network and can communicate with each other.

A very detailed user guide can be found at Work with networks: Connect containers.

[old answer]

There is a new feature in Docker 0.6.5 called linking, which is meant to help the communication between docker containers.

First, create your rabbitmq container as usual. Note that i also used the new "name" feature which makes life a litte bit easier:

docker run --name rabbitmq -d -p :5672 markellul/rabbitmq /usr/sbin/rabbitmq-server

You can use the link parameter to map a container (we use the name here, the id would be ok too):

docker run --link rabbitmq:amq -i -t markellul/celery /bin/bash

Now you have access to the IP and Port of the rabbitmq container because docker automatically added some environmental variables:

$AMQ_PORT_5672_TCP_ADDR
$AMQ_PORT_5672_TCP_PORT

In addition Docker adds a host entry for the source container to the /etc/hosts file. In this example amq will be a defined host in the container.
From Docker documentation:

Unlike host entries in the /etc/hosts file, IP addresses stored in the environment variables are not automatically updated if the source container is restarted. We recommend using the host entries in /etc/hosts to resolve the IP address of linked containers.

Just get your container ip, and connect to it from another container:

CONTAINER_IP=$(sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' $CONTAINER_ID)
echo $CONTAINER_IP

When you specify -p 5672, What docker does is open up a new port, such as 49xxx on the host and forwards it to port 5672 of the container.

you should be able to see which port is forwarding to the container by running:

sudo docker ps -a

From there, you can connect directly to the host IP address like so:

amqp://guest@HOST_IP:49xxx

You can't use localhost, because each container is basically its own localhost.

I think you can't connect to another container directly by design - that would be the responsibility of the host. An example of sharing data between containers using Volumes is given here http://docs.docker.io/en/latest/examples/couchdb_data_volumes/, but I don't think that that is what you're looking for.

I recently found out about https://github.com/toscanini/maestro - that might suit your needs. Let us know if it does :), I haven't tried it myself yet.


Edit. Note that you can read here that native "Container wiring and service discovery" is on the roadmap. I guess 7.0 or 8.0 at the latest.

You can get the docker instance IP with...

CID=$(sudo docker run -d -p :5672 markellul/rabbitmq /usr/sbin/rabbitmq-server); sudo docker inspect $CID | grep IPAddress

But that's not very useful.

You can use pipework to create a private network between docker containers.

This is currently on the 0.8 roadmap:

https://github.com/dotcloud/docker/issues/1143

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!