какой URL-адрес может использовать Docker-контейнер A для доступа к другому Docker-контейнеру B (один и тот же компьютер разработчика, разные проекты) - PullRequest
1 голос
/ 23 марта 2019

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

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

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

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

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

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

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

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

Если программе (Ruby), работающей на Bar, необходим доступ к REST URL на 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-адреса в нашем коде разработки.У Докера, кажется, есть дополнительный уровень абстракции, который меня озадачил.

Ответы [ 2 ]

1 голос
/ 23 марта 2019

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

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

0 голосов
/ 23 марта 2019

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

Использовать Docker 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. Протестируйте его, как если бы вы в контейнере использовали 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".

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

...