Docker: ошибки Curl при попытке связаться с приложением в том же контейнере

У меня проблемы с Docker и cURL.

У меня есть контейнер для компоновки Docker, установленный следующим образом:

app:
  image: busybox
  volumes:
    - /home/ben/dev/dummy/www/:/data/www/
    - /home/ben/dev/dummy/logs/:/data/logapache/
    - /home/ben/dev/dummy/flux-entrants/:/data/flux-entrants/
nginx:
  image: docker.dummy.fr/nginx
  volumes_from:
   - app
  ports:
   - 80:80
  links:
   - php
php:
  image: docker.dummy.fr/actus-php
  volumes_from:
   - app
  ports:
   - 9000:9000
  links:
   - db
   - nosql
db:
  image: docker.dummy.fr/mysql-5.6
  environment:
    MYSQL_ROOT_PASSWORD: root
nosql:
  image: docker.dummy.fr/lp-nosql
  ports:
    - "9200:9200"

Также есть директива extra_hosts, которую я убрал здесь из соображений конфиденциальности, но хосты настраиваются также в nginx (сопоставленном на порт 80, конечно) и в контейнерах /etc/hosts

Итак, nginx, php, mysql и elasticsearch находятся в отдельных контейнерах. Контейнер nginx связан с контейнером php, который связан с двумя другими. Это работает просто отлично, и никаких проблем с этим в частности.

Внутри этих контейнеров я запускаю два веб-приложения, как видно из дополнительных хостов: один клиент внешнего интерфейса (Symfony 2.8) и внутренний API ( также Symfony 2.8).

Теперь к проблеме.

Когда я пытаюсь связаться с API-приложением из-за пределов контейнера php, обычно это Postman, или cURL cli с моего терминала на моем Linux, или cURL из контейнера nginx , нет проблем.

Но когда переднее приложение (в том же контейнере) пытается связаться с приложением API или когда я пытаюсь выполнить curl из контейнера php , я получаю ошибки cURL «Отказано в соединении». Подробный режим показывает, что заголовок даже не отправляется.

Я думал, что это проблема сопоставления портов, но изменение портов, открытие новых и попытка подключения через эти порты также не работают.

Я попытался связаться с ним через порт 9000 (используется для nginx вверх по течению и открыт в docker-compose), но затем я получаю еще одну ошибку: «Ошибка получения: соединение сброшено узлом». Подробный режим показывает, что заголовки и запрос отправлены правильно, затем сервер разрывает соединение.

У кого-нибудь уже была эта проблема? Если да, то как вы это решили? Я искал здесь, но не смог найти ту же проблему.

Большое спасибо.

ИЗМЕНИТЬ:

Я только что попытался создать два отдельных набора контейнеров (один контейнер PHP + один контейнер Nginx) для каждого приложения (фронт и API), отдельно монтируя каждое приложение в свои собственные контейнеры, и у меня все еще есть та же проблема. Я просто не могу понять.


person Tiriel    schedule 04.08.2016    source источник
comment
Непонятно, изнутри какого контейнера какое соединение пытаетесь установить через cURL? Что такое API для вас? Также приложите вывод docker ps с запущенными контейнерами.   -  person aholbreich    schedule 04.08.2016
comment
У меня есть четыре контейнера, в том числе один исключительно для php (названный php в docker-compose). Внутри этого контейнера находятся два отдельных приложения Symfony: фронтальное клиентское приложение и бэк/API-приложение. Когда я запускаю приложение API из своего терминала, из Postman или из чего-то еще вне php-контейнера, все работает. Когда фронт пытается вызвать API или когда я пытаюсь использовать cURL API из контейнера php, это не работает.   -  person Tiriel    schedule 04.08.2016
comment
не могли бы вы предоставить свою команду cURL и вывод docker ps   -  person aholbreich    schedule 05.08.2016


Ответы (1)


Основная проблема заключается в том, что запросы из контейнера php к себе не доходили, следовательно, не проходили через контейнер nginx, который мог бы их правильно отправить.

Наконец, мы использовали быстрое исправление, используя команду symfony php app/console server:start 0.0.0.0:80 в приложении API (внутри контейнера php). По сути, мы запустили второй php-сервер, имея по одному серверу для каждого приложения, что позволило им правильно взаимодействовать.

Правильным решением и (imo) лучшим дизайном было бы объединение контейнеров nginx и php в один. Наличие отдельных контейнеров для сервера и баз данных кажется законным, но наличие отдельных контейнеров для сервера и для интерпретатора приводит к слишком многим проблемам.

person Tiriel    schedule 08.08.2016