docker-compose: нет соединения между контейнерами - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть 3 микросервиса, и я запускаю их с помощью Docker.

Dockerfile каждого из них.Внешний интерфейс:

FROM node:alpine
LABEL maintainer="2262288@gmail.com"
WORKDIR /usr/app/front
EXPOSE 3000
COPY ./ ./
RUN npm install
CMD ["npm", "start"]

Backend 1 (задний):

FROM openjdk:8-jdk-alpine
LABEL maintainer="2262288@gmail.com"
VOLUME /tmp
EXPOSE 8099
ARG JAR_FILE=build/libs/auth-0.0.3.jar
ADD ${JAR_FILE} digital.jar
ENTRYPOINT ["java","-jar","/digital.jar"]

Backend 2 (сообщение):

FROM openjdk:8-jdk-alpine
LABEL maintainer="2262288@gmail.com"
VOLUME /tmp
EXPOSE 8082
ARG JAR_FILE=build/libs/sender-0.0.1.jar
ADD ${JAR_FILE} sender.jar
ENTRYPOINT ["java","-jar","/sender.jar"]

Внешний интерфейс отправляет REST-запрос к backend1, чем, backend1 отправляет REST-запрос на backend2 (сообщение).

Я опубликовал его на хабе и запустил на внешнем сервере в docker-compose:

версия: '3.7'

services:
  web:
    image: account/front:0.0.1
    restart: on-failure
    ports:
      - 80:3000
  back:
    image: account/back:0.0.3
    restart: on-failure
    ports:
      - 8099:8099
  message:
    image: account/message:0.0.1
    restart: on-failure
    ports:
      - 8082:8082

Внутренние службы запускаются на портах:

message_1_e8eb3b2d2477 | 2019-09-24 09:34:00.882  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8082 (http) with context path ''

back_1_1982cc6e57f7 | 2019-09-24 09:34:07.403  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8099 (http) with context path ''

Как мы видим, каждая служба запускается на своем собственном порту.

Чем я пытаюсь отправить запрос на фронт -> назад ->сообщение.назад отправить запрос к сообщению и получить ответ:

java.net.ConnectException: Operation timed out (Connection timed out)

Чем запросы к службе сообщений не доходят до него.

Когда я отправляю запрос напрямую Почтальону, он работает.

Что не так?

UPD.запрос спереди назад:

http://81.100.122.90:8099/auth/register
body:
{"username":"ksgcf","password":"123","firstName":"John","lastName":"Doe","email":"398456234785@gmail.com"}

запрос спины к сообщению (IP-адрес изменен):

String url = "http://81.100.122.90:8082/email";
        EmailMessageDto request = new EmailMessageDto(
                dto.getEmail(),
                "slava_rossii@list.ru",
                "Email confirmation",
                "Press link: http://dig.lamb.ru/confirm?username="
                        + registrationToken.getUsername() + "&token=" + registrationToken.getToken()
        );

Итак, я вижу это сообщение при первом запуске docker-compose:

Creating network "project_default" with the default driver

1 Ответ

1 голос
/ 24 сентября 2019

Во-первых, когда вы используете docker-compose, все сервисы доступны через их имена.Таким образом, вы можете получить доступ к сообщению со спины, как это

$ docker-compose exec back ping message
PING message (172.24.0.3) 56(84) bytes of data.
64 bytes from message (172.24.0.3): icmp_seq=1 ttl=64 time=0.078 ms
64 bytes from message (172.24.0.3): icmp_seq=2 ttl=64 time=0.068 ms

Во-вторых, проверьте привязки портов.Вы должны привязать 0.0.0.0 (не localhost, который используется по умолчанию для большинства сервисов и сред) для доступа к сервису из других контейнеров через сеть.Это же вы получаете обычные виртуальные машины.Вы можете проверить доступность порта с помощью telnet

. В качестве примера я проверяю, доступен ли postresql на 5432 из контейнера superset

$ docker-compose exec superset telnet postgres 5432
Trying 172.24.0.3...
Connected to postgres.
Escape character is '^]'.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...