Неможливо пов’язати з запущеним контейнером, запущеним docker-compose


99

Я налаштовую своє місцеве середовище розвитку за допомогою контейнерів для докерів. 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?

Відповіді:


196

Гаразд, знайшов відповідь на це. У випадку, якщо хтось інший стикається з тією ж проблемою, просто зробіть це

docker network ls

Ця команда перераховує всі докерські мережі. docker-compose створить нову мережу при запуску docker-compose. У моєму випадку мережа називається myapp_default.

Примітка. Мережі вашого додатка присвоєно ім'я на основі "імені проекту", яке базується на імені каталогу, в якому він живе. Ви можете змінити назву проекту або прапором - назва проекту, або змінною середовища 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.
хазяїн

3
Мені довелося використовувати прапор --network, а не --net. Використовуйте його на початку команди run. Я сподіваюся, що це допомагає. Довідку можна знайти тут: docs.docker.com/engine/reference/run/#network-settings .
Ерізо


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.