Вызов API в контейнере Docker из другого контейнера Docker (тот же хост, Apache) - PullRequest
0 голосов
/ 15 января 2019

Положение:

У меня есть 2 док-контейнера, на которых работают оба приложения Symfony 4. cte_app и cte_fe. cte_app подключен к порту 8080 на хосте, а cte_fe к порту 80.

cte_app содержит методы API, которые мне нужно использовать с cte_fe. Я могу нормально использовать API из cte_app на хост-машине (используя Postman), но не через cte_fe, в функции PHP, использующей cURL, я получаю сообщение об ошибке соединения отказано (используя localhost: 8080 и имя контейнера (которое зависит)). Когда я использую адрес шлюза Докера, я могу нормально использовать API из контейнера cte_fe. Но я не могу гарантировать, что адрес шлюза не изменится со временем.

Каков предпочтительный способ вызова конечной точки API между двумя контейнерами, расположенными на одном хосте? Есть ли какой-то флаг, который я пропустил в документации, который выставляет адрес шлюза для контейнера как переменную среды?

version: '3'
services:

cte_db:
    image: mysql:5.7.24
    restart: on-failure
    container_name: cte_db
    ports:
      - "3306:3306"
    volumes:
      - /cte_data/mysql:/var/lib/mysql
    environment:
        MYSQL_ROOT_PASSWORD: somepassword
        MYSQL_DATABASE: somedatabase
        MYSQL_USER: someuser
        MYSQL_PASSWORD: somepassword

cte_apache:
    build: .docker/apache
    container_name: cte_apache
    ports:
       - 8080:8080
       - 80:80
    volumes:
       - .docker/config/vhosts:/etc/apache2/sites-enabled
       - ./cte_app:/home/wwwroot/cte_app
       - ./cte_fe:/home/wwwroot/cte_fe
    depends_on:
       - cte_fe
       - cte_app

cte_app:
    build: .docker/php
    container_name: cte_app
    volumes:
       - ./cte_app:/home/wwwroot/cte_app
    depends_on:
       - cte_db

cte_fe:
    build: .docker/php
    container_name: cte_fe
    volumes:
      - ./cte_fe:/home/wwwroot/cte_fe
    depends_on:
      - cte_app
      - cte_db

1 Ответ

0 голосов
/ 15 января 2019

Чтобы один контейнер мог связаться с другим в подобном контексте, вы можете использовать имя службы в файле docker-compose.yml в качестве имени хоста, а номер порта TCP, который процесс внутри контейнера ожидает в качестве номера порта. Порт специально не нужно выставлять или публиковать, и вам не нужно вручную устанавливать container_name:. Docker Compose будет работать с сетевым оборудованием на уровне Docker для вас.

Часто выгодно делать это настраиваемым, возможно, с помощью переменной среды, которая также поддерживает такие случаи, как системы разработки и обнаружения служб, не относящиеся к Docker, такие как Consul или Kubernetes Services.

Если «fe» означает «передний конец» и соединение на самом деле выполняется из приложения браузера, вы должны рассмотреть это с точки зрения браузера: ни одна из этих деталей Docker вообще не существует, и если вы необходимо использовать абсолютные URL-адреса, необходимо использовать DNS-имя хоста или IP-адрес и опубликованный порт сервера. Учитывая то, что вы показали, это, вероятно, прокси-сервер Apache, и вы будете использовать URL-адреса, такие как http://my.host.dns.name:8080/app.

...