使用 Postgres docker 实例运行 Spring Boot docker 实例
Posted
技术标签:
【中文标题】使用 Postgres docker 实例运行 Spring Boot docker 实例【英文标题】:Running Spring Boot docker instance with Postgres docker instance 【发布时间】:2020-12-21 15:30:36 【问题描述】:我正在尝试运行一个连接 Postgres 数据库的 Spring Boot 应用程序:
docker-compose.yml(用于 Postgres):
version: '3'
services:
postgres-db:
container_name: postgres-db
image: postgres:latest
restart: always
ports:
- "5432:5432"
environment:
POSTGRES_USER: my_user
POSTGRES_PASSWORD: my_password
POSTGRES_DB: shorten-db
运行 Postgres 数据库:
docker-compose up
.Dockerfile(用于 Spring Boot 应用):
FROM openjdk:12-jdk-alpine
RUN addgroup -S spring && adduser -S spring -G spring
USER spring:spring
ARG JAR_FILE=target/*.jar
COPY $JAR_FILE app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
为了使用 Docker 运行 Spring 应用程序,我使用:
mvn package
docker build -t url-shorten/url-shorten-docker .
docker run -p 8080:8080 url-shorten/url-shorten-docker
但是在上面运行docker命令时我收到错误:
Caused by: org.postgresql.util.PSQLException: Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
在 Spring application.properties 中,我使用以下方式连接到数据库:
spring.datasource.url=jdbc:postgresql://localhost:5432/shorten-db
我认为这个错误是由于 Spring Boot 应用程序在与 DB 不同的容器中运行,因此它无法在 localhost
上找到 DB。是否有将 Spring Book docker 容器连接到 DB 容器的惯用方式。或者我是否可以访问我机器的 IP 地址并使用该地址连接到在 Docker 上运行的 Postgres DB?
【问题讨论】:
如果你在同一个网络中运行一个容器,它可以通过它的容器名称来访问,例如postgres-db:5432 只有在同一user-defined
桥上运行容器时,您得到的答案(直接使用容器名称 postgres-db
)才有效。按照您现在的操作方式,db 容器在您 docker-compose up
时自动创建的网桥上运行,而另一个(使用docker run ...
)将在default
网桥上运行。
更多:Differences between user-defined bridges and the default bridge
我会将 Spring-boot 容器的详细信息放在 docker-compose.yaml
文件中,让 docker-compose 处理网络。当您docker-compose up
/ down
时,它会自动创建/删除一个自定义桥以方便您使用。在此处查看更多信息:Networking in Compose
另一种选择是您提出的建议,是的,您自己更“手动”地处理网络。
【参考方案1】:
是的,在这种情况下你不能使用 localhost
spring.datasource.url=jdbc:postgresql://postgres-db:5432/shorten-db
【讨论】:
【参考方案2】:在 Spring application.properties
中,尝试将 DB 配置更改为:
spring.datasource.url=jdbc:postgresql://postgres-db:5432/shorten-db
在容器网络中,您需要使用容器名称作为主机。
【讨论】:
【参考方案3】:您可以将数据库和应用程序容器添加到一个 Docker 网络,并将数据源 URL 中的 PostgreSQL 主机更改为 postgres-db
。然后 Spring 应用程序将与您的数据库一起使用。
【讨论】:
以上是关于使用 Postgres docker 实例运行 Spring Boot docker 实例的主要内容,如果未能解决你的问题,请参考以下文章
Docker - 如何在postgres容器中运行psql命令?
如何在 Dockerized GraphQL + Postgres 设置中运行 Prisma 迁移?