无法在 Docker 容器上运行的 Spring Boot 应用程序与另一个 Docker 容器上运行的 PostgreSQL 数据库之间建立连接

问题描述 投票:0回答:1

docker-compose.yml

version: '3.8'
services:
  db:
    image: postgres
    restart: always
    container_name: security-db
    environment:
      POSTGRES_DB: security-db
      POSTGRES_USER: scrty
      POSTGRES_PASSWORD: scrty123
    ports:
      - '5050:5432'

应用程序.属性

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.datasource.url=jdbc:postgresql://localhost:5050/security-db
spring.datasource.username=scrty
spring.datasource.password=scrty123
spring.jpa.hibernate.ddl-auto=update

我正在尝试在 Docker 容器内运行我的 Spring Boot 应用程序,并且还在另一个 Docker 容器中运行 PostgreSQL 数据库。但是,我的应用程序无法与 PostgreSQL 数据库建立连接。

java spring spring-boot docker docker-compose
1个回答
0
投票

问题是,容器运行在不同的网络中,因此无法相互通信。您可以通过将应用程序也放入您的

docker-compose.yaml
中来解决此问题,因为 docker compose 会自动创建网络并且所有服务都会加入。为此,您可以像这样更改您的
docker-compose.yaml

解决方案1:

version: '3.8'
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: app:latest
  db:
    image: postgres
    restart: always
    container_name: security-db
    environment:
      POSTGRES_DB: security-db
      POSTGRES_USER: scrty
      POSTGRES_PASSWORD: scrty123
    ports:
      - '5050:5432'

这样,如果您不想从主机访问数据库,则根本不需要公开端口

5050
。在
app.image
中你可以输入任何你想要的内容,这是你的图像名称,当你执行
docker compose up --build
时,它将被创建并标记。
app.build.context
将指定 docker 构建上下文,
app.build.dockerfile
将指定您的
Dockerfile

解决方案2.

您还可以使用以下命令手动创建网络:

docker network create -d bridge my-bridge-network

这将创建一个名为

my-bridge-network
的 docker 网络。现在您必须将两个容器连接到该网络。对两个容器(数据库和应用程序)执行以下命令

docker network connect <NETWORK> <CONTAINER>

<NETWORK>
替换为您创建的网络名称,将
<CONTAINER>
替换为您的容器名称。

© www.soinside.com 2019 - 2024. All rights reserved.