Задать вопрос

В docker запрос curl от одного контейнера другому не идет?

Есть 2 контейнера
version: '2'
services:
  php:
    build: ./
    restart: always
    volumes:
      - ~/.composer-docker/cache:/root/.composer/cache:delegated
      - ./:/app:delegated
    ports:
      - '9000:80'
    network_mode: test

  db_host:
    image: postgres:10.3-alpine
    restart: always
    ports:
      - "5432:5432"
    volumes:
      - ./docker-entrypoint:/docker-entrypoint-initdb.d
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    network_mode: test

Файл для докера
FROM yiisoftware/yii2-php:7.1-apache

# Apache modules
RUN a2enmod rewrite

и второй контейнер
version: '2'
services:
  php:
    build: ../common/docker/
    restart: always
    volumes:
      - ~/.composer-docker/cache:/root/.composer/cache:delegated
      - ./:/app:delegated
    ports:
      - '9001:80'
    network_mode: test

  redis:
    image: redis:4.0.9-32bit
    ports:
      - "6379"
    volumes:
      - ../common/docker/redis-client-data:/data
    network_mode: test

Из браузера они все замечательно работают через localhost. Проблемы начинаются, когда я пытаюсь в коде сделать запрос из второго контейнера в первый через curl - http://имя_контейнера/api/ При таком подходе я получаю ответ от сервера 400. Пробовала имя контейнера заменить на ip адрес. Но по нему идет зависание и таймаут. Кстати напрямую в браузере такая же реакция на ip. Не могу понять в чем причина?
P.S. Контейнер запущен, сеть создана и запущена.
P.P.S У других при таких же условиях работает.
P.P.P.S. Самое главное на закуску - среда работы. Сама сижу под виндой. На ней запущена виртуальная машина и там развернута убунта (не сервер).
  • Вопрос задан
  • 2816 просмотров
Подписаться 2 Простой 5 комментариев
Пригласить эксперта
Ответы на вопрос 1
chupasaurus
@chupasaurus
Сею рефлекторное, злое, временное
Есть 2 контейнера

docker-compose запускает проекты, состоящие из служб, которые уже состоят из контейнеров.
Чтобы без бубнов общались контейнеры из разных сетей, их надо добавить к отдельной bridge-сети (не docker0, которая есть по умолчанию, в ней своя атмосфера):
  1. docker network create internal_bridge
  2. Прописываем в оба compose.yml:
    networks:
      bridge1:
        external:
          name: internal_bridge

  3. В описание служб, которые должны общаться между собой, надо добавить индивидуальные имена, по которым к ним будут стучаться:
    services:
      some-service:
        networks:
          bridge1:
            aliases:
              - some-service-project1


После этого контейнеры из разных проектов могут стучаться к другим по прописанным алиасам.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы