DOCKER_DATABASE_URL 逐段解析
postgresql://darenku:replace-with-a-strong-password@postgres:5432/darenku
│ │ │ │ │ │
│ │ │ │ │ └── 数据库名
│ │ │ │ └── 端口
│ │ │ └── 主机名(容器名)
│ │ └── 密码
│ └── 用户名
└── 协议(表示这是 PostgreSQL 数据库)
逐段对应
| 片段 | 值 | 含义 | 对应 .env 变量 |
|---|---|---|---|
postgresql:// |
协议 | 用 PostgreSQL 连接 | --- |
darenku |
用户名 | 登录数据库的账号 | POSTGRES_USER |
replace-with-a-strong-password |
密码 | 登录数据库的密码 | POSTGRES_PASSWORD |
postgres |
主机名 | Docker 容器的服务名 | docker-compose 里的服务名 |
5432 |
端口 | PostgreSQL 默认端口 | 容器内部端口 |
darenku |
数据库名 | 要连接哪个库 | POSTGRES_DB |
为什么主机名是 postgres 而不是 IP?
yaml
# docker-compose.yml
services:
postgres: # ◄── 这个服务名就是容器间的主机名
image: postgres:16
api:
# api 容器里用 "postgres" 这个名字就能找到数据库容器
environment:
- DATABASE_URL=postgresql://darenku:xxx@postgres:5432/darenku
┌──────── Docker 内部网络 ────────┐
│ │
│ api 容器 ──→ postgres:5432 │
│ │ │
│ postgres 容器 │
│ (内部监听 5432) │
│ │
└─────────────────────────────────┘
Docker 容器之间通过服务名互相访问,不需要 IP 地址。
对比本地和 Docker 的 URL
bash
# 本地开发(从宿主机访问,走映射端口)
DATABASE_URL=postgresql://darenku:darenku@127.0.0.1:35432/darenku
# ^^^^^^^^^ ^^^^^
# 宿主机IP 映射端口
# Docker 内部(容器之间访问,走内部网络)
DOCKER_DATABASE_URL=postgresql://darenku:xxx@postgres:5432/darenku
# ^^^^^^^^ ^^^^
# 容器服务名 内部端口
简单说:这个 URL 就是告诉 API 容器------"用这个账号密码,去 postgres 容器的 5432 端口,连接 darenku 这个数据库"。
后记
2026年4月23日于上海,在opus 4.6辅助下完成。