我有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/