Подключите один контейнер 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 на тот же контейнер, что и сельдерей, он отлично работает.
Что мне нужно сделать, чтобы контейнер взаимодействовал друг с другом?
Ответы
Ответ 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 не позднее.
Ответ 5
В настоящее время он находится на дорожной карте 0.8:
https://github.com/dotcloud/docker/issues/1143
Ответ 6
Вы можете получить IP-адрес экземпляра docker с помощью...
CID=$(sudo docker run -d -p :5672 markellul/rabbitmq /usr/sbin/rabbitmq-server); sudo docker inspect $CID | grep IPAddress
Но это не очень полезно.
Вы можете использовать pipework для создания частной сети между контейнерами докеров.