创建连接java和mysql容器的docker-compose时出错

eagi6jfj  于 2022-11-02  发布在  Docker
关注(0)|答案(2)|浏览(211)

我尝试使用docker-compose连接我的springboot应用程序的容器和mysql映像的容器,但是当我运行docker-compose up时,我的终端启动了一个循环,它启动了spring应用程序,尝试连接MySQL容器,失败并继续尝试。我得到的错误是com.mysql.cj.jdbc.exceptions.CommunicationsException:通信链路故障
停靠器合成文件:

version: '3.8'

services:
  mysqldb:
    image: mysql
    platform: linux/x86_64
    env_file: ./.env
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=$MYSQLDB_ROOT_PASSWORD
      - MYSQL_DATABASE=$MYSQLDB_DATABASE
    ports:
      - $MYSQLDB_LOCAL_PORT:$MYSQLDB_DOCKER_PORT
    volumes:
      - db:/var/lib/mysql
  app:
    depends_on:
     - mysqldb
    build: .
    restart: always
    env_file: ./.env
    ports:
      - $APP_LOCAL_PORT:$APP_DOCKER_PORT
    environment:
      - DB_HOST=mysqldb
      - DB_USER=$MYSQLDB_USER
      - DB_PASSWORD=$MYSQLDB_ROOT_PASSWORD
      - DB_NAME=$MYSQLDB_DATABASE
      - DB_PORT=$MYSQLDB_DOCKER_PORT
    stdin_open: true
    tty: true

volumes: 
  db:

.环境:

MYSQLDB_USER=root
MYSQLDB_ROOT_PASSWORD=12345678
MYSQLDB_DATABASE=dronefeederdb
MYSQLDB_LOCAL_PORT=3306
MYSQLDB_DOCKER_PORT=3306

APP_LOCAL_PORT=8080
APP_DOCKER_PORT=8080

Application.yaml:

server:
  port: 8080
spring:
    datasource:
        username: ${DB_USER}
        password: ${DB_PASSWORD}
        url: jdbc:mysql://${DB_HOST}:${DB_PORT}/${DB_NAME}
    jpa:
        hibernate:
            ddl-auto: update
        show-sql: true
        open-in-view: false
        #https://ia-tec-development.medium.com/lombok-e-spring-data-jpa-142398897733
    security.user:
        name: dronefeeder
        password: dronefeeder
        #https://www.baeldung.com/spring-boot-security-autoconfiguration

resilience4j.circuitbreaker:
  configs:
    default:
      waitDurationInOpenState: 10s
      failureRateThreshold: 10
  #instances:
    #estudantes:
      #baseConfig: default

停靠文件:

FROM openjdk:11.0-jdk as build-image
WORKDIR /app
COPY . .
RUN ./mvnw clean package -DskipTests

FROM openjdk:11.0-jre
COPY --from=build-image /app/target/*.jar /app/app.jar
EXPOSE 8080
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom", "-jar", "/app/app.jar"]

存储库链接:https://github.com/julia-baptista/dronefeeder/tree/docker-configuration

qaxu7uf2

qaxu7uf21#

我认为问题是您的应用程序在Application.yaml属性文件中使用了localhost作为SQL URL。由于您的应用程序自己运行在一个容器上,它试图查看容器的localhost,而您的SQL服务器在另一个容器中,具有自己的localhost。Docker容器中的Localhost不引用主机,它们指的是容器本身内的本地主机。
host.docker.internal
不应使用localhost,您需要使用sql continainer url。
最快的选择是使用host.docker.internal而不是localhost,但这不是最好的。
另一个快速的选择是在同一个Docker网络上运行两个容器。在您的合成文件中以与卷相同的方式定义它。然后将每个容器设置为该网络。请参见Networking in Compose。然后您可以设置SQL url以使用SQL容器名称而不是localhost。因此,这个.. url: jdbc:mysql://localhost:3306/dronefeederdb将变为url: jdbc:mysql://mysql/dronefeederdb
这两个选项都不可靠,因为您要在应用程序属性文件中硬编码容器名称。更好的解决方案是在您的webApp映像中包含一个环境变量,该变量可以接受指向SQL服务器的URL。然后,您可以在运行容器时或在您的合成文件(Environment variables in Compose)中提供SQL位置。这样,SQL服务器就可以位于任何位置。

eimct9ow

eimct9ow2#

您需要在app定义块中添加一个depends on:语句,以使docker compose在数据库启动之前不 Boot 应用程序。
请查看以下文档:Docker Compose Startup Order

相关问题