Docker Compose部署Go+PostgreSQL在VPS连接失败:解析host.docker.internal出错
解决Docker Compose部署Go+PostgreSQL时数据库连接失败问题
问题背景
在VPS服务器上通过Docker Compose部署Golang后端+PostgreSQL应用时,后端无法连接数据库。本地开发环境使用host.docker.internal能正常连接,但VPS上出现域名解析失败错误。
错误信息
2024/10/15 21:18:16 /app/config/database.go:39 [error] failed to initialize database, got error failed to connect to `user=_ database=_`: hostname resolving error: lookup host.docker.internal on 127.0.0.11:53: no such host panic: failed to connect to `user=_ database=_`: hostname resolving error: lookup host.docker.internal on 127.0.0.11:53: no such host goroutine 1 [running]: politex/backend/config.Connect() /app/config/database.go:42 +0x378 main.main() /app/main.go:12 +0x25
当前配置文件
docker-compose.yml
services: backend: build: context: . dockerfile: Dockerfile ports: - "3000:3000" depends_on: - db db: restart: always image: postgres:16.4 ports: - "5432:5432" environment: POSTGRES_USER: _ POSTGRES_PASSWORD: _ POSTGRES_DB: _ volumes: - pgdata:/var/lib/postgresql/data volumes: pgdata:
.env
DB_HOST=host.docker.internal DB_PASS=_ DB_PORT=5432 DB_USER=_ DB_NAME=_
database.go
package config import ( ... ) var Database *gorm.DB func Connect() error { envErr := godotenv.Load() if envErr != nil { panic(envErr) } user := os.Getenv("DB_USER") host := os.Getenv("DB_HOST") pass := os.Getenv("DB_PASS") name := os.Getenv("DB_NAME") port := os.Getenv("DB_PORT") dsn := fmt.Sprintf("host=%v user=%v password=%v dbname=%v port=%v sslmode=disable TimeZone=Europe/Moscow", host, user, pass, name, port) var err error Database, err = gorm.Open(postgres.Open(dsn), &gorm.Config{}) if err != nil { panic(err) } Database.AutoMigrate(&entities.Note{}) return nil }
解决方案
核心原因
host.docker.internal是Docker Desktop(Windows/macOS)专属的特殊域名,用于容器访问宿主机,但Linux环境下的Docker默认不支持该域名解析。而Docker Compose会自动为所有服务创建共享网络,同一网络内的容器可通过服务名称直接互相访问。
修复步骤
- 修改.env文件的数据库主机配置:将
DB_HOST的值从host.docker.internal改为db(对应docker-compose.yml中数据库服务的名称)DB_HOST=db DB_PASS=_ DB_PORT=5432 DB_USER=_ DB_NAME=_ - 重启服务:执行命令重新构建并启动容器
docker-compose down && docker-compose up -d --build
验证方法
- 进入后端容器,测试与数据库的网络连通性:
若能正常收到响应,说明网络连通正常。docker-compose exec backend ping db - 查看后端容器日志,确认数据库连接状态:
docker-compose logs backend
内容的提问来源于stack exchange,提问作者Sanyokk
相关产品推荐
相关产品推荐

