docker-compose: нет связи между контейнерами

329
08 августа 2021, 22:00

У меня есть три микросервиса, которые я запускаю в докере.

Dockerfile каждого из них выглядят так. Фронтенд:

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

Бэкенд 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"]

Бэкенд 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"]

По замыслу, Фронтенд общается с бэкендом 1, а тот периодически выдаёт задания Бэкенду 2, отправляя ему REST-запросы.

Потом я всё это публикую на хабе и собираю на внешнем сервере с выделенным IP в docker-compose:

version: '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

При запуске docker-compose сервисы запускаются на портах:

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 ''

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

Далее я перехожу на страницу фронта и через него вызываю метод, в результате которого бэкенд1 вызовет бэкенд2 (message). Бэкенд1 делает запрос в message и получает ответ:

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

То есть, запросы с back в message не приходят.

Делаем то же самое через Postman с локальной машины. Всё работает, сервер отвечает. Пути идентичны, но даже если бы я ошибся с запросом, был бы ответ.

В связи с этим, уважаемые коллеги, у меня вопрос: что я делаю не так?

Answer 1

То есть, запросы с back в message не приходят.

Скорее всего проблема в файерволе. Снаружи блокируется, а локально нет.

В связи с этим, уважаемые коллеги, у меня вопрос: что я делаю не так?

Во-первых, не используешь reverse-proxy. К примеру traefik (let's encrypt из коробки). Снаружи только 80 и 443 порты.

Во-вторых, не используешь bridge networks. Приложения лучше изолировать. Пускай общаются только через bridge. Снаружи все через reverse-proxy.

Во-третьих, используешь docker-compose в staging / production среде.

собираю на внешнем сервере

Приложение собирается на машине разработчика или CI и заливается в docker-registry (dockerhub или на свой). Во время деплоя скачивается с registry.

DNS нотация docker-compose и docker-swarm отличается. http://message:8082/ соотвествует docker-swarm. C docker-compose будет так - http://message.project_path_default:8082. Можно менять COMPOSE_PROJECT_NAME=test и указать свою сеть net, тогда будет http://message.test_net:8082.

Попробуй docker-swarm, добавляешь docker-compose.swarm.yml c его спецификой. Более подробно можно ознакомиться в моем проекте автоматизации деплоя с ansible.

В-четвертых, не используешь multi-stage build

ARG JAR_FILE=build/libs/sender-0.0.1.jar

ADD ${JAR_FILE} sender.jar

READ ALSO
Ошибка компиляции библиотеки design в Eclipse

Ошибка компиляции библиотеки design в Eclipse

После импорта и компиляции библиотеки design получаю ошибки вида:

180
Spring RESTFul и View для него

Spring RESTFul и View для него

У меня есть RESTful контроллер для приложения, позволяющее просматривать записи из БД по их id

409
Какие ошибки присутствуют в данном “алгоритме”? [закрыт]

Какие ошибки присутствуют в данном “алгоритме”? [закрыт]

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение

155
Свой класс меню для приложения Java

Свой класс меню для приложения Java

Я создал класс на основе класса JMenu, который принимает строковый ArrayList, хранящий названия подпунктов меню, и строку с названием пункта меню

348