我已经尝试使用docker-compose运行4个Spring Boot微服务。当我用docker-compose up
启动它们时,我收到一条错误消息,指出端口8080已被使用:
product_1 | APPLICATION FAILED TO START
product_1 | ***************************
product_1 |
product_1 | Description:
product_1 |
product_1 | Web server failed to start. Port 8080 was already in use.
product_1 |
product_1 | Action:
product_1 |
product_1 | Identify and stop the process that's listening on port 8080 or configure this application to listen on another port.
我知道Dockerfile和docker-compose.yml是正确的,因为我已经从代码的有效版本中复制了它们。我的Dockerfile都是这样的:
FROM openjdk:12.0.2
EXPOSE 8080
ADD ./target/*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
这是docker-compose.yml:
version: '2.1'
services:
product:
build: microservices/product-service
mem_limit: 350m
environment:
- SPRING_PROFILES_ACTIVE=docker
depends_on:
- mongodb
recommendation:
build: microservices/recommendation-service
mem_limit: 350m
environment:
- SPRING_PROFILES_ACTIVE=docker
depends_on:
- mongodb
review:
build: microservices/review-service
mem_limit: 350m
environment:
- SPRING_PROFILES_ACTIVE=docker
depends_on:
mysql:
condition: service_healthy
product-composite:
build: microservices/product-composite-service
mem_limit: 350m
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=docker
# $ mongo
mongodb:
image: mongo:3.6.9
mem_limit: 350m
ports:
- "27017:27017"
command: mongod --smallfiles
# $ mysql -uroot -h127.0.0.1 -p
mysql:
image: mysql:5.7
mem_limit: 350m
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=rootpwd
- MYSQL_DATABASE=review-db
- MYSQL_USER=user
- MYSQL_PASSWORD=pwd
healthcheck:
test: ["CMD", "mysqladmin" ,"ping", "-uuser", "-ppwd", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 10
所有服务都在server.port 8080上运行。
我已经检查过,在启动docker-compose up
之前,端口8080上没有任何运行。
此示例摘自新书《 动手实践微服务》,其中包括 Magnus Larsson的Spring Boot和Spring Cloud 。他的示例代码有效,并且我已经从他的代码中复制了Dockerfiles和docker-compose.yml,因此它们必须正确。这是我在阅读本书时写的有此问题的代码,但是所有application.yml,Dockerfile和docker-compose.yml文件都与工作代码相同。
我应该在哪里找到这个问题的原因?
更新:我对所有其他服务(产品服务和mongodb除外)进行了注释。 Docker compose尝试两次启动产品服务:
product_1 | 2019-10-03 12:59:26.280 INFO 1 --- [ main] e.e.m.c.p.ProductServiceApplication : Starting ProductServiceApplication v1.0.0-SNAPSHOT on 902ca18da442 with PID 1 (/app.jar started by root in /)
product_1 | 2019-10-03 12:59:29.397 INFO 1 --- [ main] e.e.m.c.p.ProductServiceApplication : Starting ProductServiceApplication v1.0.0-SNAPSHOT on 902ca18da442 with PID 1 (/app.jar started by root in /)
我已经证实其他服务不会发生这种情况,所以现在的问题是,为什么docker-compose尝试两次启动产品服务。
答案 0 :(得分:2)
原来我的问题是我的产品服务两次调用SpringApplication.run()。因此它与docker-compose没有关系。我会保留这个帖子,以防其他人碰到这个。
答案 1 :(得分:1)
使用命令提示符
netstat -ano | findstr 8080
-用于查找使用端口
的服务的PID
ts kill "PID"
-终止服务(不要使用quote标记)
然后尝试重新运行它。希望能对您有帮助