从docker-compose获取端口8080已在使用中错误

时间:2019-10-03 04:05:52

标签: spring-boot docker docker-compose

我已经尝试使用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尝试两次启动产品服务。

2 个答案:

答案 0 :(得分:2)

原来我的问题是我的产品服务两次调用SpringApplication.run()。因此它与docker-compose没有关系。我会保留这个帖子,以防其他人碰到这个。

答案 1 :(得分:1)

使用命令提示符

netstat -ano | findstr 8080-用于查找使用端口
的服务的PID ts kill "PID"-终止服务(不要使用quote标记)


然后尝试重新运行它。希望能对您有帮助