无法连接到docker容器内的postgresql

时间:2016-12-19 14:18:38

标签: postgresql go docker docker-compose

我正在编写一个go应​​用程序,这个应用程序停靠在2个容器中:db和app。

启动容器'docker-compose up'时我看到消息:在127.0.0.11:53上拨打tcp:lookup dbpgsql:没有这样的主机

version: '2'
services:
  server:
    hostname: app
    image: golang:1.7.3-alpine
    build: ./server/
    privileged: true
    container_name: server
    command: go run server.go
    volumes:
      - ../src/:/go/src/
      - ../server.go:/go/server.go
    links:
      - db:db
    ports:
     - '8080:8080'
   env_file: environment

 db:
   hostname: dbpgsql
   image: postgres:latest
   container_name: db
   environment:
      POSTGRES_USER: cldb
      POSTGRES_PASSWORD: cldb
      POSTGRES_DB: cldb
    ports:
      - '5432:5432'
   volumes:
     - ./data:/docker-entrypoint-initdb.d

这是我的docker-compose.yml

func InitDB(dataSourceName string) {
    var err error
    DB, err = sql.Open("postgres", dataSourceName)
    if err != nil {
       log.Panic(err)
    }

    if err = DB.Ping(); err != nil {
       log.Panic(err)
    }

    DB.SetMaxIdleConns(100)
}

执行DB.Ping()时,应用程序失败:

{{1}}

2 个答案:

答案 0 :(得分:2)

您可以使用服务名称(或链接选项中给出的别名)连接到数据库,在您的情况下是db。 Hostname选项设置容器知道自己的主机名。但它不会出现在docker ps中,也不会出现在任何其他容器的/ etc / hosts文件中。 (https://docs.docker.com/engine/userguide/networking/default_network/configure-dns/

答案 1 :(得分:0)

就我而言,我在 post-gres 服务中使用了 container_name,这就是在应用程序中连接到数据库时需要设置为主机名的内容