Невозможно связать с запущенным контейнером, запущенным docker-compose

101

Я настраиваю свою локальную среду разработки с контейнерами докеров. Docker-compose.yml выглядит следующим образом

version: '2'

services:
  db:
    image: mongo:3
  mq:
    image: rabbitmq:3
  api:
    build: .
    image: my_app/api
    ports:
      - "3000:3000"
    links:
      - db
      - mq
    environment:
      - NODE_ENV=development

Запускается без ошибок. И докер перечисляет 3 запущенных контейнера

docker-compose up -d
docker ps

e90e5a8b5d33        my_app/api    "/usr/local/bin/node "   0.0.0.0:3000->3000/tcp               my_app_api_1
42bfcd971b16        mongo:3       "/entrypoint.sh mongo"   27017/tcp                            my_app_db_1
a0685a816c47        rabbitmq:3    "/docker-entrypoint.s"   4369/tcp, 5671-5672/tcp, 25672/tcp   my_app_mq_1

Однако, когда я пытаюсь связать эти запущенные контейнеры из другого контейнера

docker run --link my_app_mq_1:mq --link my_app_db_1:db -it worker 

Я получаю ошибку

 docker: Error response from daemon: Cannot link to /my_app_mq_1, as it does not belong to the default network.

Я тоже пробовал

 docker run --link my_app_mq_1:mq --link my_app_db_1:db -it --net default worker 

Та же ошибка.

Итак, как я могу связать работающий контейнер, запущенный docker-compose?

Пробуждающий байт
источник

Ответы:

199

Хорошо, нашел на него ответ. Если кто-то еще столкнется с той же проблемой, просто сделайте

docker network ls

Эта команда выводит список всех сетей докеров. docker-compose создаст новую сеть, когда вы запустите docker-compose up. В моем случае сеть называется myapp_default.

Примечание. Сеть вашего приложения получает имя на основе «имени проекта», которое основано на имени каталога, в котором оно находится. Вы можете переопределить имя проекта с помощью флага --project-name или переменной среды COMPOSE_PROJECT_NAME. . Сеть в Compose

Итак, правильный способ ссылки на эти контейнеры:

docker run --link my_app_mq_1:mq --link my_app_db_1:db -it --net myapp_default worker 
Пробуждающий байт
источник
9
Для тех, кто не заметил, нужно поставить --netперед командой. Я столкнулся с этой проблемой при попытке запустить официальный образ докера Redis.
mistertee
3
Мне пришлось использовать флаг --network вместо --net. Используйте его в начале команды запуска. Надеюсь, это поможет. Ссылка доступна здесь: docs.docker.com/engine/reference/run/#network-settings .
Erizo
11

моя команда запускать ссылки

docker run --network=YOUR_NETWORK --link SERVICE -t -i app command
Габриэль Борхес Оливейра
источник
2

При использовании определения службы версии 2 и выше docker-composeсоздает пользовательскую сеть. Разрешение имен в пользовательской сети работает через встроенный DNS-сервер Docker. Вот соответствующая цитата из документации :

Встроенный DNS-сервер Docker обеспечивает разрешение имен для контейнеров, подключенных к заданной [определяемой пользователем] сети. Это означает, что любой подключенный контейнер может пинговать другой контейнер в той же сети по его имени.

Контейнеры также доступны по сетевым псевдонимам, которые docker-composeсоздает. Это можно проверить с помощью такой команды:

docker inspect \
  -f '{{json .NetworkSettings.Networks.myapp_default.Aliases}}' my_app_db_1

Он печатает ["db","$CONTAINER_ID"].

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

Таким образом, достаточно следующей команды:

docker run -it --net myapp_default worker
Saaj
источник