Подтвердить что ты не робот

Подключите один контейнер Docker к другому

Я хочу запустить rabbitmq-server в одном контейнере докера и подключиться к нему из другого контейнера, используя сельдерей (http://celeryproject.org/)

У меня есть rabbitmq, используя команду ниже...

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

и запустить сельдерей через

sudo docker run -i -t markellul/celery /bin/bash

Когда я пытаюсь сделать очень простой учебник для проверки соединения на http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html

Я получаю сообщение об ошибке отказа:

потребитель: не удается подключиться к amqp://[email protected]: 5672//: [Errno 111] Соединение отклонено.

Когда я устанавливаю rabbitmq на тот же контейнер, что и сельдерей, он отлично работает.

Что мне нужно сделать, чтобы контейнер взаимодействовал друг с другом?

4b9b3361

Ответ 1

[edit 2016]

Прямые ссылки теперь устарели. Новый способ создания контейнеров ссылок - подключение док-станции. Он очень похож на виртуальные сети и имеет более широкий набор функций, чем старый способ компоновки.

Сначала вы создаете именованные контейнеры:

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

Затем вы создаете сеть (последний параметр - ваше сетевое имя):

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

Подключите контейнеры к вашей вновь созданной сети:

docker network connect mynetwork rabbitmq
docker network connect mynetwork celery

Теперь оба контейнера находятся в одной сети и могут взаимодействовать друг с другом.

Очень подробное руководство пользователя можно найти на Работа с сетями: Подключить контейнеры.

[старый ответ]

Существует новая функция в Docker 0.6.5, называемая ссылкой, которая предназначена для обмена данными между контейнерами докеров.

Сначала создайте контейнер для кролика как обычно. Обратите внимание, что я также использовал новую функцию "name", которая облегчает жизнь:

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

Вы можете использовать параметр ссылки для сопоставления контейнера (мы используем имя здесь, id тоже будет в порядке):

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

Теперь у вас есть доступ к IP и порту контейнера rabbitmq, потому что докер автоматически добавил некоторые переменные среды:

$AMQ_PORT_5672_TCP_ADDR
$AMQ_PORT_5672_TCP_PORT

Кроме того, Docker добавляет запись узла для исходного контейнера в файл /etc/hosts. В этом примере amq будет определенным узлом в контейнере.
От Docker документация:

В отличие от записей хоста в файле /etc/hosts, IP-адреса, хранящиеся в переменных среды, не обновляются автоматически, если исходный контейнер перезагружен. Мы рекомендуем использовать записи хоста в /etc/hosts для разрешения IP-адреса связанных контейнеров.

Ответ 2

Просто получите свой контейнер ip и подключитесь к нему из другого контейнера:

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

Ответ 3

Когда вы укажете -p 5672, то, что делает докер, открывает новый порт, например 49xxx на хосте, и перенаправляет его на порт 5672 контейнера.

вы сможете увидеть, какой порт пересылает в контейнер, запустив:

sudo docker ps -a

Оттуда вы можете напрямую подключиться к IP-адресу хоста:

amqp://[email protected]_IP:49xxx

Вы не можете использовать localhost, потому что каждый контейнер в основном является его собственным локальным хостом.

Ответ 4

Я думаю, что вы не можете подключиться к другому контейнеру напрямую по дизайну - это будет ответственность хоста. Пример обмена данными между контейнерами с использованием Тома приведен здесь http://docs.docker.io/en/latest/examples/couchdb_data_volumes/, но я не думаю, что это то, что вы ищете.

Недавно я узнал о https://github.com/toscanini/maestro - который может удовлетворить ваши потребности. Дайте нам знать, если это произойдет:), я еще не пробовал это сам.


Изменить. Обратите внимание, что вы можете читать здесь, что в "дорожной карте" находится родная "проводка и обнаружение сервисов". Я думаю, 7.0 или 8.0 не позднее.

Ответ 6

Вы можете получить IP-адрес экземпляра docker с помощью...

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

Но это не очень полезно.

Вы можете использовать pipework для создания частной сети между контейнерами докеров.