У меня есть три микросервиса, которые я запускаю в докере.
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 с локальной машины. Всё работает, сервер отвечает. Пути идентичны, но даже если бы я ошибся с запросом, был бы ответ.
В связи с этим, уважаемые коллеги, у меня вопрос: что я делаю не так?
То есть, запросы с 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
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
После импорта и компиляции библиотеки design получаю ошибки вида:
У меня есть RESTful контроллер для приложения, позволяющее просматривать записи из БД по их id
Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение
Я создал класс на основе класса JMenu, который принимает строковый ArrayList, хранящий названия подпунктов меню, и строку с названием пункта меню