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

如何无需docker-compose将Node.js容器连接到PostgreSQL容器?

解决默认Docker桥接网络中Node.js容器连接PostgreSQL容器的问题

我在同一台Linux机器的默认桥接网络中运行两个容器:一个Node.js(Express)服务器容器,一个官方PostgreSQL镜像容器,希望不使用docker-compose实现两者的连接。

当前启动命令

Node.js容器

docker run -p 3001:3001 --env-file .env <image>

PostgreSQL容器(本地5432端口被占用,故映射主机5433到容器5432)

docker run --name mydb -p 5433:5432 -dit postgres

Node.js服务器中的连接字符串

postgresql://postgres:mypassword@<host>:5433/mydbname

已尝试但无效的方法

  • 添加主机映射--add-host=<host ip>:db,使用db作为主机名
  • 使用PostgreSQL容器名称mydb作为主机名
  • 使用127.0.0.1或localhost作为主机名

可行解决方案

方案1:创建自定义桥接网络(推荐)

Docker默认的bridge网络不支持容器名DNS解析,自定义桥接网络则原生支持该功能,步骤如下:

  1. 创建自定义网络:
docker network create my-app-network
  1. 重新启动PostgreSQL容器并加入该网络(如果需要本地客户端访问可保留-p 5433:5432,容器间通信无需此端口映射):
docker run --name mydb --network my-app-network -e POSTGRES_PASSWORD=mypassword -e POSTGRES_DB=mydbname -dit postgres

注:添加POSTGRES_PASSWORD和POSTGRES_DB环境变量可自动设置数据库密码并创建目标库,避免连接时因权限或数据库不存在失败
3. 启动Node.js容器时加入同一网络:

docker run -p 3001:3001 --env-file .env --network my-app-network <image>
  1. 修改Node.js中的连接字符串,使用容器名mydb和容器内部端口5432(容器间通信直接访问容器内部端口,无需用主机映射的5433):
postgresql://postgres:mypassword@mydb:5432/mydbname

方案2:使用PostgreSQL容器的IP地址(默认bridge网络下可选)

如果坚持使用默认bridge网络,可以通过容器IP直接访问:

  1. 查询PostgreSQL容器的IP地址:
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mydb
  1. 修改连接字符串,把<host>替换为查询到的IP,端口用容器内部的5432:
postgresql://postgres:mypassword@172.17.0.2:5432/mydbname

注:容器IP可能在重启后变化,需重新查询更新


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 03:33:13