You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker新手求助:如何通过网络解决应用与Postgres镜像的连接失败问题?

问题背景

我是Docker新手,已构建好自己的应用镜像,镜像信息如下:

docker images
REPOSITORY            TAG            IMAGE ID       CREATED        SIZE
my_app             2.5-SNAPSHOT   6416734dcf5a   53 years ago   518MB

我启动PostgreSQL容器的命令为:

docker run --name my-postgres -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 -d postgres

尝试用以下命令启动应用容器,希望连接到Postgres:

docker run --name my-app --link my-postgres:postgres -p 8080:8080 -d 6416734dcf5a

但出现数据库连接错误:

org.flywaydb.core.internal.exception.FlywaySqlException: Unable to obtain connection from database:
Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.

SQL State : 08001
Error Code : 0
Message : Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.

想了解是否可通过将应用加入网络的方式避免该错误。

解决方案

完全可以通过Docker自定义网络解决这个问题,而且这是官方推荐的容器间通信方式(--link已被弃用),具体步骤如下:

  • 创建自定义Docker网络
docker network create my-app-network
  • 启动Postgres容器并加入自定义网络
docker run --name my-postgres --network my-app-network -e POSTGRES_PASSWORD=mysecretpassword -d postgres

注:如果不需要从宿主机直接连接Postgres,可以去掉-p 5432:5432端口映射,容器间通过网络通信无需宿主机端口转发

  • 启动应用容器并加入同一个自定义网络
docker run --name my-app --network my-app-network -p 8080:8080 -d my_app:2.5-SNAPSHOT
  • 关键配置修改
    你的应用当前数据库连接地址配置的是localhost:5432,但容器内的localhost指向容器自身,而非Postgres容器。加入自定义网络后,容器间可以通过容器名称直接解析通信,所以需要将应用的数据库连接地址改为my-postgres:5432。

自定义网络的优势在于:容器间自动提供DNS解析,无需依赖--link这种老旧方式,通信更稳定且符合现代Docker最佳实践。

内容的提问来源于stack exchange,提问作者Lam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 19:57:53