如何无需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解析,自定义桥接网络则原生支持该功能,步骤如下:
- 创建自定义网络:
docker network create my-app-network
- 重新启动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>
- 修改Node.js中的连接字符串,使用容器名
mydb和容器内部端口5432(容器间通信直接访问容器内部端口,无需用主机映射的5433):
postgresql://postgres:mypassword@mydb:5432/mydbname
方案2:使用PostgreSQL容器的IP地址(默认bridge网络下可选)
如果坚持使用默认bridge网络,可以通过容器IP直接访问:
- 查询PostgreSQL容器的IP地址:
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mydb
- 修改连接字符串,把
<host>替换为查询到的IP,端口用容器内部的5432:
postgresql://postgres:mypassword@172.17.0.2:5432/mydbname
注:容器IP可能在重启后变化,需重新查询更新
内容的提问来源于stack exchange,提问作者GhostOrder
相关产品推荐
相关产品推荐

