我有3个微服务,并使用docker运行它们。

他们每个人的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"]


前端将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)


比,对消息服务的请求没有达到它。

当我直接向Postman发送请求时,它可以工作。

怎么了?

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

最佳答案

首先,当您使用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检查端口可用性

作为示例,我正在检查是否可以从名为superset的容器​​在5432上使用postresql

$ docker-compose exec superset telnet postgres 5432
Trying 172.24.0.3...
Connected to postgres.
Escape character is '^]'.

关于java - docker-compose:容器之间没有连接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58078037/

10-11 12:37
查看更多