Несколько контейнеров на одном хосте с одинаковым портом - PullRequest
0 голосов
/ 29 мая 2019

У меня есть клиент, который использует жесткий кодированный порт 8090. Я хотел бы, чтобы на машине А было запущено 3 экземпляра этого клиента, поэтому каждый клиент обращается к своему серверу. Каждый из 3 серверов размещен в выделенном контейнере, а 3 контейнера размещены на машине B с IP 8.8.4.4. Проблема в том, что каждый клиент обращается к 8.8.4.4:8090, но я хотел бы направить каждого клиента в конкретный контейнер.

Я думаю, что решение должно быть следующим: Каждый клиент будет использовать определенный IP-адрес, например, 8.8.4.1, 8.8.4.2, 8.8.4.3. Каким-то образом я сопоставлю на машине A IP 8.8.4.1, 8.8.4.2, 8.8.4.3 должны быть сопоставлены с localhost. Есть прокси-сервер, который будет перенаправлять с 8.8.4.1:8090 на 8.8.4.4:1000. Порт вперед на контейнер с1 от порта 1000 до 8090. Сделайте то же самое для двух других IP-адресов.

Мой основной пробел заключается в том, как сопоставить IP 8.8.4.1 с локальным хостом, чтобы прокси-сервер понял, что он должен переслать его на 8.8.4.4:1000.

.

Диаграмма. A, B - оба окна машин. c1, c2, c3 - контейнеры. A B +--------------------+ +--------------------+ | | | 1000:8090 | | | | +----------+ | | | | | c1 | | | +----------------------------------->+ | | | | | +----------+ | | | | 2000:8090 | | | | +----------+ | | +----------------------------------->+ c2 | | | | | | | | | | | +----------+ | | | | 3000:8090 | | | | +----------+ | | +----------------------------------->+ c3 | | | | | | | | | | | +----------+ | +--------------------+ +--------------------+ ``

Ваши мысли и идеи приветствуются!

1 Ответ

0 голосов
/ 30 мая 2019

Я предлагаю вам посмотреть nginx, следующий пример конфигурации для маршрутизации.

Предположим, что все клиенты работают на машине A, и машина A имеет ip 8.8.4.5, также nginx работает на машине A:

Часть nginx.conf :

stream {
    upstream server1 {
        server 8.8.4.4:1000;
    }

    upstream server2 {
        server 8.8.4.4:2000;
    }

    upstream server3 {
        server 8.8.4.4:3000;
    }

    server {
        listen 8090;
        server_name nginx1;
        proxy_pass server1;
    }

    server {
        listen 8090;
        server_name nginx2;
        proxy_pass server2;
    }

    server {
        listen 8090;
        server_name nginx3;
        proxy_pass server3;
    }
}

Затем добавьте рядом с файлом hosts:

8.8.4.5 nginx1
8.8.4.5 nginx2
8.8.4.5 nginx3

А клиенты используют для подключения следующее:

  • client1: nginx1: 8090
  • client2: nginx2: 8090
  • client3: nginx3: 8090

Если вы не хотите использовать vhost of nginx, вы можете напрямую использовать несколько ip на одной сетевой карте, тогда вам не нужно устанавливать файл hosts. См это .

PS: Конечно, если ваши клиенты имеют возможность привязываться к разным ips, как я сначала думал, что-то вроде этого:

tcp_client.bind(('8.8.4.1', xxx))
tcp_client.connect((server_ip, server_port))

Тогда также можно использовать remote_addr для различения соединений, как показано ниже:

stream {
    upstream server1 {
        server 8.8.4.4:1000;
    }

    upstream server2 {
        server 8.8.4.4:2000;
    }

    upstream server3 {
        server 8.8.4.4:3000;
    }

    server {
        listen 8090;

        if ($remote_addr ~* "8.8.4.1")
        {
            proxy_pass server1;
        }

        if ($remote_addr ~* "8.8.4.2")
        {
            proxy_pass server2;
        }

        if ($remote_addr ~* "8.8.4.3")
        {
            proxy_pass server3;
        }
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...