【问题标题】:Building and running Spring Boot application in Docker with couple of services using docker-compose?使用 docker-compose 在 Docker 中构建和运行 Spring Boot 应用程序以及几个服务?
【发布时间】:2021-08-26 21:17:04
【问题描述】:

我有一个简单的 Spring Boot 应用程序,它使用的其他依赖项/服务很少。这是一个学生演示项目,所以没什么大不了的,我只是在测试一些东西,因此我是 Docker 新手。

首先,我的应用程序使用三种不同的服务:MySQLRabbitMq(向其他 Spring 应用发送一些虚拟消息)、Liquibase 用于初始化表和插入数据。

mvn cleanmvn install 之后应用程序构建良好。但目标是使用 Docker compose 从 cmd 启动它。这是我在 Docker 的第二天。

Dockerfile 的外观如下:

FROM openjdk:8
ADD target/Consumer-0.0.1-SNAPSHOT.jar Consumer-0.0.1-SNAPSHOT.jar
EXPOSE 8085
ENTRYPOINT ["java", "-jar", "Consumer-0.0.1-SNAPSHOT.jar"]

这里是docker-compose.yml

version: '3'

services:
    #service 1: definition of mysql database
    db:
      image: mysql:latest
      container_name: mysql-db2   
      environment:
        - MYSQL_ROOT_PASSWORD=root
        - MYSQL_USER=root
      ports:
        - 3306:3306
      restart: always
      
    rabbitmq:
      image: rabbitmq:management
      ports:
        - 5672:5672
        - 15672:15672
        
    liquibase:
      build: .
      image: ubuntu-jdk8-liquibase:latest
      depends_on:
        - db
      network_mode: "host"
  
  
    #service 3: definition of your spring-boot app 
    consumerservice:                        #it is just a name, which will be used only in this file.
      image: consumer-image              #name of the image after dockerfile executes
      container_name: consumer-container  #name of the container created from docker image
      build:
        context: .                          #docker file path (. means root directory)
        dockerfile: Dockerfile              #docker file name
      ports:
        - 8085:8085                     #docker containter port with your os port
      restart: always
        
      depends_on:                           #define dependencies of this app
        - db
        - rabbitmq                                #dependency name (which is defined with this name 'db' in this file earlier)
      environment:
        SPRING_DATASOURCE_URL: jdbc:mysql://mysql-db:3306/consumer?createDatabaseIfNotExist=true
        SPRING_DATASOURCE_USERNAME: root
        SPRING_DATASOURCE_PASSWORD: root

cd 进入项目目录后运行docker-compose ps:

我的问题是,我缺少什么,我需要向Dockerfile 添加更多内容吗? .yml 中的语法是否正确?我正在运行 Windows 并安装了 Docker Desktop。

更新 1 执行命令docker-compose up 后,我注意到它开始下载 liquibase 和 mysql 的图像(花了几分钟)。之后我得到了一个错误。

Removing mysql-db2
Recreating f7bf19092bb4_mysql-db2 ...
Recreating f7bf19092bb4_mysql-db2 ... error

    ERROR: for f7bf19092bb4_mysql-db2  Cannot start service db: Ports are not available: listen tcp 0.0.0.0:3306: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.
    
    ERROR: for db  Cannot start service db: Ports are not available: listen tcp 0.0.0.0:3306: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.
    ERROR: Encountered errors while bringing up the project.

即使在我将ports 部分设置为3306:33073307:3307 并设置 SPRING_DATASOURCE_URL: jdbc:mysql://mysql-db:3307/consumer?createDatabaseIfNotExist=true 之后,我仍然会收到同样的错误

【问题讨论】:

  • 能否检查一下docker服务是否启动并运行?
  • 我刚刚更新了问题
  • @Ashok 我运行了 docker-info,但如果服务已启动,我不知道在哪里寻找
  • 如果您在运行 docker 命令时可以看到输出,则表示 docker 服务正在运行

标签: spring-boot docker maven docker-compose dockerfile


【解决方案1】:

尝试杀死所有使用端口3306的进程:

sudo kill `sudo lsof -t -i:3306`

然后,运行您的 docker 容器:

`sudo docker-compose up`

否则

docker-compose 文件中的ports: -3306:3306 更改为ports: -3307:3306,然后再次运行以下命令:

docker-compose up

【讨论】:

  • 我在 Windows 上,所以 sudo 不起作用...正如我在更新中所写的那样,我已经用端口尝试过这个并且有同样的错误。我什至做了 mvn clean, mvn install..但又出现了同样的错误。
  • 执行此命令netstat -a -b 并检查输出是否可以看到端口3306 上运行的任何服务
猜你喜欢
  • 2019-05-31
  • 2021-12-15
  • 2018-10-04
  • 2019-07-05
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 2021-07-26
  • 2021-05-14
相关资源
最近更新 更多