какой URL-адрес может использовать док-контейнер A для доступа к другому док-контейнеру B (та же машина-разработчик, разные проекты)

Предполагая, что нам нужно делать это очень редко, только на определенных этапах разработки (чтобы протестировать несколько вызовов API), каков самый простой способ предоставить докеризованному веб-сервису в проекте Bar доступ к докеризированному веб-сервису в Project Foo?

На Mac для разработки, Docker Engine: 18.09.2, Compose: 1.23.2, у нас есть Project Foo и Project Bar, каждый из которых имеет свои собственные файлы для создания докеров, каждый с веб-службой и службой базы данных.

Обычно они работают автономно и разрабатываются независимо.

Однако веб-служба Project Foo содержит API, к которому мы лишь изредка хотим получить доступ из веб-контейнера Project Bar.

Они назначены разным хост-портам, docker ps показывает, что Project Foo использует порт 0.0.0.0:3000->3000/tcp (например, мы используем localhost:3000 для доступа к веб-службе из браузера Mac. Project Bar использует порт 0.0.0.0: 3010->3010/TCP

docker inspect для Foo показывает, что его IP-адрес "172.18.0.3" (шлюз "172.18.0.1"), а для Bar показывает, что его IP-адрес "172.22.0.4" (шлюз "172.22.0.1")

docker network ls показывает, что они оба используют один и тот же драйвер «моста».

Оба проекта работают на Mac, всего 4 контейнера (web+db на Foo и web+db на Bar).

Если программе (Ruby), работающей на Bar, требуется доступ к URL-адресу REST на Foo, каков URL-адрес «/api_test» на Foo?

Из веб-контейнера Bar я пробовал http://localhost:3000/api_test и http://127.0.0.1:3000/api_test (это то, что мы использовали бы из веб-браузера, поэтому на самом деле не ожидал, что это будет работать от контейнера к контейнеру), и я пробовал http://172.18.0.3:3000/api_test и http://172.18.0.3/api_test ни один из них. который работал.

Я вижу в Интернете ссылки на настройку ссылки или сети докеров, но все примеры предназначены для использования docker run вместо docker-compose. Я ожидаю, что если вы знаете IP-адрес и порт веб-сервера каждого контейнера, это должно быть вопросом использования правильного URL-адреса без какой-либо дополнительной настройки сети?

Любая помощь будет оценена по достоинству.

Предпочтительнее назначать статический IP-адрес вручную... До Docker мы использовали Vagrant, и это было просто: в Vagrantfile каждого проекта мы просто вручную назначали им IP-адрес в одной и той же частной подсети 192.168.50.50 и 192.168.50.51, и они прекрасно «разговаривали» друг с другом, и мы могли просто «закодировать» эти IP-адреса в нашем коде разработки. У Docker, кажется, есть дополнительный уровень абстракции, который меня озадачил.


person jpw    schedule 23.03.2019    source источник


Ответы (3)



Наконец-то я нашел поток SO, в котором упоминаются более новые версии Docker, например, я использую имя хоста host.docker.internal для доступа к хост-компьютеру, поэтому один ответ на мой вопрос: поскольку я уже назначил разные порты для Foo и Bar - контейнер Bar может используйте URL-адрес http://host.docker.internal:3000/api_test

Но по-прежнему предпочтительнее иметь возможность назначать статические IP-адреса каждому контейнеру, поэтому я оставляю вопрос открытым.

person jpw    schedule 23.03.2019

Вы можете использовать сеть Docker для доступа к контейнерам от A до B. https://docs.docker.com/network/

Используйте сеть докеров --help.

  1. Создать сеть

    • docker network create mynetwork
  2. Поместите контейнеры как containerA, так и containerB в эту сеть, которая в данном случае является моей сетью.

    • docker network connect mynetwork containerA

    • docker network connect mynetwork containerB

  3. Теперь вы можете получить доступ из одного контейнера к другому контейнеру с именем контейнера.

Также вы можете проверить это с помощью ping. Перейдите к контейнеру A или B и используйте его;

  1. apt-get update

  2. apt-get install iputils-ping

  3. Протестируйте это, как если бы вы в containerA использовали ping containerB.

Например-1:

Если вы хотите использовать его в настройках виртуального хоста apache с портом;

  • ProxyPass "/" "http://containerB:3000"

Пример-2:

У меня есть два контейнера; base и myphp по имени. Я запускаю приложение nodejs в базовом контейнере на порту 3000. И я запускаю apache и php на втором контейнере myphp.

По сути, мое приложение nodejs дает мне вывод «Hello Word». Он работает с контейнером base Вот код:

'use strict';

const express = require('express');

// Constants
const PORT = 3000;
const HOST = '0.0.0.0';

// App
const app = express();
app.get('/', (req, res) => {
  res.send('Hello world\n');
});

app.listen(PORT, HOST);
console.log(`Running on http://${HOST}:${PORT}`); 

В основном мое php-приложение дает мне весь исходный код подключенного адреса. Он работает с контейнером myphp. Вот код:

<?php
    $domain = 'http://base:3000';
    $handle = fopen($domain, 'r');
    $content = stream_get_contents($handle);
    fclose($handle);

    echo "<textarea rows='20' cols='80'>$content</textarea>";
?>

Затем я помещаю эти два контейнера в одну и ту же сеть. И когда я запускаю этот index.php, который является контейнерным приложением myphp. Это дает мне «Hello Word»;

Таким образом, если вы поместите контейнеры в одну и ту же сеть, вы сможете получить доступ друг к другу по их имени, например "http://containerB:3000", или если ваш маршрутизатор прослушивает "/api_test" "http://containerB:3000/api_test".

Наконец-то это то, что я делаю для обмена контейнерами. Я надеюсь, что это сработает и для вас.

person Utku Altaş    schedule 23.03.2019
comment
Спасибо, выглядит интересно ... но можете ли вы добавить к своему ответу, какой URL-адрес контейнер A будет использовать для доступа к веб-приложению в контейнере B? - person jpw; 23.03.2019
comment
предположим, что у меня уже есть сеть и я подключил ее к двум контейнерам, как я могу посетить один из другого с помощью самоопределяемого домена? например, посетить домен: foo.bar.com - person carton.swing; 21.07.2019