【问题标题】:Connect service container to db container将服务容器连接到数据库容器
【发布时间】:2020-04-29 18:15:09
【问题描述】:

我是 docker 新手,并开始在我的小项目中使用它。

我已经使用以下 Docker 文件对服务本身进行了 docker 化:

ROM adoptopenjdk:11-jdk-hotspot AS DEPENDENCIES_BUILD_IMAGE
ENV APP_HOME=/usr/app/
WORKDIR $APP_HOME
COPY build.gradle settings.gradle gradlew $APP_HOME
COPY gradle $APP_HOME/gradle
RUN ./gradlew build || return 0
COPY . .
RUN ./gradlew build

FROM adoptopenjdk/openjdk11:jdk-11.0.7_10-alpine AS FINAL
ENV JAR_TEMPLATE=myapp-0.0.1-SNAPSHOT.jar
ENV ARTIFACT_NAME=myapp.jar
ENV APP_HOME=/usr/app
WORKDIR $APP_HOME
COPY --from=DEPENDENCIES_BUILD_IMAGE $APP_HOME/build/libs/$JAR_TEMPLATE .
RUN mv $JAR_TEMPLATE $ARTIFACT_NAME
EXPOSE 8080
CMD ["java", "-jar", "budget-calculator.jar"]

附注 - 我知道我一直在复制 0.0.1-SNAPSHOT 的问题 - 但我目前不知道如何解决它。

之后,我想通过 docker-compose 使用此确认将我的服务连接到 Postgres 数据库:

version: '3'

services:
  backend:
    build: .
    container_name: myapp
    ports:
    - "8080:8080"
    links:
      - "db"
    depends_on:
      - db
    networks:
      - backend

  db:
    restart: unless-stopped
    image: postgres:10
    container_name: myapp-db
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=secret
      - POSTGRES_DB=myapp
    ports:
      - 5436:5436
    networks:
      - backend

networks:
  backend:

之后,我更新了我的 application.properties 文件以指示 DB 链接位于另一个容器上,如下所示:

spring.flyway.url=jdbc:postgresql://db:5436/myapp
spring.flyway.user=postgres
spring.flyway.password=secret
spring.flyway.baseline-on-migrate=true

spring.datasource.url=jdbc:postgresql://db:5436/myapp
spring.datasource.username=postgres
spring.datasource.password=secret
spring.datasource.driverClassName=org.postgresql.Driver

现在我有两个问题:

  1. 虽然我认为build: . 每次都会重建我的图像 如果发生变化,我正在运行docker-compose up 实践我发现不是这样的。
  2. 当后端服务启动时flyway(一个迁移数据库库)尝试 连接到数据库,但无法解析连接。

我在网上看到 - links 的用法已被弃用,我应该使用 networks 但两者似乎都不起作用 - 我错过了什么?

【问题讨论】:

  • Postgres 默认在端口 5432 上运行。你确定你的意思是 5436?
  • 我刚刚更改了它,因为我现在有另一个实例运行没有这个端口 - 老实说,这对我来说并不重要
  • 但是如果你试图连接到 postgres 容器上的 5436 端口,而 postgres 正在监听 5432 端口,它就无法工作。您没有提供任何会导致 postgres 在不同端口上侦听的配置。
  • 哦,你是对的 - 我也将内部端口映射为 5436!
  • 而且您将 jdbc url 也指向了错误的端口 (jdbc:postgresql://db:5436/myapp),因为它直接连接到容器,不会受到端口转发的影响。

标签: spring-boot docker docker-compose


【解决方案1】:

我的配置有2个问题,第一个-Postgres的内部端口配置为5436,而图像的默认端口是5432(我已将它们都更新为@987654324 @)

第二个,为了将数据库的 IP 传递给服务,我在服务映像中添加了以下环境变量:

environment: # Pass environment variables to the service
      SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/budget
      SPRING_DATASOURCE_USERNAME: postgres
      SPRING_DATASOURCE_PASSWORD: secret
      SPRING_FLYWAY_URL: jdbc:postgresql://db:5432/budget
      SPRING_FLYWAY_USER: postgres
      SPRING_FLYWAY_PASSWORD: secret

所以我目前的工作配置是这样的:

version: '3.8'

services:
  backend:
    build: .
    container_name: app-service
    ports:
    - "8080:8080"
    depends_on:
      - db
    environment: # Pass environment variables to the service
      SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/myapp
      SPRING_DATASOURCE_USERNAME: postgres
      SPRING_DATASOURCE_PASSWORD: secret
      SPRING_FLYWAY_URL: jdbc:postgresql://db:5432/myapp
      SPRING_FLYWAY_USER: postgres
      SPRING_FLYWAY_PASSWORD: secret

  db:
    restart: unless-stopped
    image: postgres:10
    environment:
      - POSTGRES_DB=myapp
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_USER=secret
    volumes:
      - myapp_data:/var/lib/postgresql/data
    ports:
      - 5432:5432

volumes:
  myapp_data:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 2020-05-30
    • 1970-01-01
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多