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
相关产品推荐
相关产品推荐

