Сбой соединения сокетов между docker контейнерами - PullRequest
0 голосов
/ 18 марта 2020

У меня есть несколько контейнеров, развертываемых с помощью docker -композитного файла, показанного ниже

version: '3'
services:
  module2:
    restart: always
    build:
      dockerfile: Dockerfile
      context: ./Module-2
    ports:
      - '16667:16667'
  module3:
    build:
      dockerfile: Dockerfile
      context: ./Module-3
    ports:
      - '16669:16669'

Модуль 2 принимает запрос на сокет из внешнего источника и работает как задумано. Проблема начинается, когда модуль 2 пытается соединиться с модулем 3

Код модуля 2 (JAVA)

 private int socket_port = 16669;
    private String server = "127.0.0.1";

    public TextOutputSocket() {

    }

    public TextOutputSocket(String host, int socket_port) {
        this.server = host;
        this.socket_port = socket_port;
    }

    public void sendText(String textToSend) {
        OutputStream os = null;
        Socket sock = null;
        try {
            System.out.println("Connecting to " + server + ":" + socket_port);
            sock = new Socket(server, socket_port);

            os = sock.getOutputStream();

Код модуля 3 (GO)

ln, err := net.Listen("tcp", ":16669")
    if err != nil {
        fmt.Println(err)
        // handle error
    }

Модуль 2 получает сообщение об отказе в соединении, когда я пытаюсь отправить запрос.

Мне кажется, у меня нет лучшего понимания сетей docker, и я предполагаю, что именно в этом проблема. Заранее спасибо за помощь

Ответы [ 2 ]

0 голосов
/ 18 марта 2020

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

Здесь вы попытались подключиться к 1669 локального хоста, вместо этого вам следует сделать следующее: попробуйте подключиться к другому контейнеру. Это можно сделать, установив имя контейнера для контейнера module3, и docker dns разрешит IP-адрес для вас.

Простая замена 127.0.0.1 на module3

0 голосов
/ 18 марта 2020

В вашем случае, когда вы раскручиваете docker-compose, module2 и module3 2, контейнеры будут находиться в одной сети docker, и они могут соединяться друг с другом, используя свои DNS-имена, то есть module2 и module3 соответственно.

В результате вы должны обновить свой код module2 таким образом:

private int socket_port = 16669;
    private String server = "module3";

    public TextOutputSocket() {

    }
...

Обратите внимание, что вам не нужно выполнять сопоставление портов, например - '16667:16667' или - '16669:16669', чтобы эти 2 модуля могли общаться друг с другом.

...