Docker Desktop中K8s Pod如何通过名称访问外部Postgres容器
两种方案都不需要依赖动态分配的容器IP,重启容器、重建环境都不用改连接配置:
方案1:使用Docker Desktop内置固定域名(零配置,最推荐)
Docker Desktop 环境默认给所有运行在其上的容器、Kubernetes Pod 预留了固定访问域名host.docker.internal,这个域名会永久解析到Windows宿主机的地址,不会随容器启停变化。
你的outside Postgres已经通过docker-compose配置了端口映射到宿主机,直接在inside容器里通过这个域名加宿主机映射端口就能访问,完全不用关心outside容器的IP变动。
如果你的outside映射到宿主机的端口是5435(和你贴的docker-compose配置一致),连接命令如下:
psql postgresql://user:appdb@host.docker.internal:5435/password
注意:你贴的docker-compose配置里数据库密码、库名和inside库的配置是反过来的:POSTGRES_PASSWORD值为appdb,POSTGRES_DB值为password,连接时不要写反参数;如果实际宿主机访问outside的端口是31225,把命令里的端口替换成31225即可,以
docker ps实际显示的端口映射为准。
方案2:自定义集群内固定服务名
如果你想自定义更易读的访问名(比如postgres-outside),不想用默认的内置域名,可以在K8s集群里创建无选择器的Service加固定Endpoint实现:
- 新建配置文件
outside-postgres.yaml,内容如下:
apiVersion: v1 kind: Service metadata: name: postgres-outside # 集群内访问用的固定域名 spec: ports: - port: 5432 targetPort: 5435 --- apiVersion: v1 kind: Endpoints metadata: name: postgres-outside # 和上述Service名称完全一致 subsets: - addresses: - ip: 192.168.65.2 # Docker Desktop宿主机在集群内的固定预留IP,永久不变 ports: - port: 5435
- 执行命令部署资源:
kubectl apply -f outside-postgres.yaml
部署完成后,集群内所有Pod都可以通过postgres-outside这个名称访问outside的Postgres服务,连接命令:
psql postgresql://user:appdb@postgres-outside:5432/password
避坑提醒
不要用hostAliases直接给Pod绑定你现在查到的172.18.0.3这个IP,这个地址是Docker网桥动态分配的,只要outside容器重建、Docker服务重启就会变化,后续还是要改配置,达不到一劳永逸的效果。
内容的提问来源于stack exchange,提问作者JoeLeBaron

