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

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会自动为所有服务创建共享网络,同一网络内的容器可通过服务名称直接互相访问。

修复步骤

  1. 修改.env文件的数据库主机配置:将DB_HOST的值从host.docker.internal改为db(对应docker-compose.yml中数据库服务的名称)
    DB_HOST=db
    DB_PASS=_
    DB_PORT=5432
    DB_USER=_
    DB_NAME=_
    
  2. 重启服务:执行命令重新构建并启动容器
    docker-compose down && docker-compose up -d --build
    

验证方法

  • 进入后端容器,测试与数据库的网络连通性:
    docker-compose exec backend ping db
    
    若能正常收到响应,说明网络连通正常。
  • 查看后端容器日志,确认数据库连接状态:
    docker-compose logs backend
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 08:53:11