Использование API из контейнера док-станции клиента в контейнер сервера - PullRequest
0 голосов
/ 01 июля 2019

У меня есть два разных проекта, работающих на разных контейнерах Docker. Ниже два файла YML:

ФАЙЛ webserver-api / docker-compose.yml

version: "3.1"
services:
    webserver:
      image: nginx:alpine
      container_name: webserver-api
      working_dir: /application
      volumes:
          - .:/application
          - ./docker/nginx/nginx.conf:/etc/nginx/conf.d/default.conf
      ports:
          - "8005:80"

ФАЙЛ client-app / docker-compose.yml

version: '3'
services:
    web:
        container_name: client-app
        build:
            context: ./
            dockerfile: deploy/web.docker
        volumes:
            - ./:/var/www
        ports:
            - "8010:80"
        links:
            - app
    app: [...]
    database: [...]

Из клиентского приложения Я хотел бы позвонить на webserver-api . Когда я пытаюсь использовать API из webserver-api , появляется сообщение «Ошибка соединения cURL отклонена» или ошибка тайм-аута.

Например

$response = file_get_contents('http:/localhost:8005/api/test');

Я также попытался заменить localhost IP-адресом webserver-api контейнера следующим образом:

$response = file_get_contents('http://172.25.0.2:8005/api/test');

Но все равно я получаю ошибку соединения с тайм-аутом.

Какой правильный URL-адрес контейнера сервера используется для вызова из контейнера клиента? Или как установить URL хоста?

Большое спасибо за помощь и время.

Ответы [ 3 ]

1 голос
/ 01 июля 2019

Согласно документации docker-compose

По умолчанию Compose устанавливает единую сеть для вашего приложения.Каждый контейнер для службы присоединяется к сети по умолчанию и доступен как другим контейнерам в этой сети, так и обнаруживается ими с именем хоста, идентичным имени контейнера.

В идеале, если ваша служба взаимозависима, выследует поместить их в один файл композиции.В этом случае вы могли бы получить доступ к вашему сервису напрямую по имени и порту контейнера

http://webserver/api/test

Но поскольку они находятся в отдельном файле компоновки, вы можете получить доступ к сервису через сопоставленный порт хоста

$ response = file_get_contents ('http://localhost:8005/api/test');

также должно работать.

Для отладки вы можете проверить

  1. Если привязка порта к 8005происходит на вашем хосте.
  2. Указанная конечная точка верна и доступна с хоста.
1 голос
/ 01 июля 2019

Сначала вам нужно создать сеть. Затем используйте эту сеть для компоновки вашего клиента и докера сервера. В противном случае сеть изолирована.

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

0 голосов
/ 01 июля 2019

Наконец-то я понял.

По умолчанию docker создает сеть с именем (в моем случае) webserver-api_default , где webserver-api - это имяпапка, содержащая YML-файл [projectname]_default.

На client-app / docker-compose.yml клиента мне нужно было указать, к какой сети присоединиться:

version: '3'
    networks:
        default:
            external:
                name: webserver-api_default

    web:
        container_name: client-app
        build:
            context: ./
            dockerfile: deploy/web.docker
        volumes:
            - ./:/var/www
        ports:
            - "8010:80"
        links:
            - app
    app: [...]
    database: [...]

А из клиентского контейнера я должен сделать вызов по URL:

$response = file_get_contents('http://webserver-api:8005/api/test');

Где webserver-api - это имя контейнера сервера ине название сети .

https://docs.docker.com/compose/networking/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...